posted by 셀로브 2013. 10. 21. 08:09

이전 소스코드상태에서 고객이 Electronic Type의 기타를 원한다고 가정해봅시다. 가게에 Electronic Type의 기타가 여러개 있더라도 사용자는 맨 처음 검색되는 기타만 볼 것입니다.

그 기타가 마음에 들지 않으면 구입하지 않겠네요. 다음 클래스 다이어그램처럼 소스코드를 변경해 봅시다.




search함수가 List형태로 반환하도록 해봅시다.


즉, 필요한 것은 고객의 요구에 맞는 기타를 모조리 반환하도록 변경하는 것입니다.


아래와같이 수정해줍니다.


Inventory.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class Inventory {
    private List guitars;
    
    public Inventory(){
        guitars = new LinkedList();
    }
 
    // 새로운 기타를 생성하고 목록에 등록 //
    public void addGuitar(String serialNumber, double price, Builder fender, String model,
                                                                             Type electric, Wood alder, Wood alder2){
        Guitar guitar = new Guitar(serialNumber, price, fender, model, electric, alder, alder2);
        guitars.add(guitar);
    }
    
    // 시리얼 넘버에 해당되는 기타를 찾음 //
    public Guitar getGuitar(String serialNumber){
        for(Iterator i = guitars.iterator(); i.hasNext(); ){
            Guitar guitar = (Guitar)i.next();
            if(guitar.getSerialNumber().equals(serialNumber)){
                return guitar;
            }
        }
        return null;
    }
    
    // 특정 스펙의 기타를 찾음 //
    public List search(Guitar searchGuitar){
        List machingGuitars = new LinkedList();
        
        for(Iterator i = guitars.iterator(); i.hasNext();){
            Guitar guitar = (Guitar)i.next();
 
            if(searchGuitar.getBuilder() != guitar.getBuilder())
                continue;
            // 모델명은 무수히 많음으로 열거형으로 표현하기 부적절함//
            String model = searchGuitar.getModel().toLowerCase();
            if((model != null) && (model.equals("")) &&
                                                         (!model.equals(guitar.getModel().toLowerCase())))
                continue;
            if(searchGuitar.getType() != guitar.getType())
                continue;
            if(searchGuitar.getBackWood() != guitar.getBackWood())
                continue;
            if(searchGuitar.getTopWood() != guitar.getTopWood())
                continue;
            // 원하는 기타를 찾은 경우 //
            machingGuitars.add(guitar);
        }
        // 기타가 존재하지 않는 경우 //
        return machingGuitars;
    }
}


위와같이 리스트를 만든 후, 원하는 기타를 모두 추가한 후에 최종적으로 리스트를 반환합니다.

메인부분도 조금만 고치면 되겠네요.

다음과 같이 수정해줍니다.


FindGuitarTester.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class FindGuitarTester {
    public static void main(String[] args){
        Inventory inventory = new Inventory();
        initializeInventory(inventory);
        
        Guitar whatJinLikes = new Guitar("", 0, Builder.FENDER, "Stratocastor"
                                                               Type.ELECTRIC, Wood.ALDER, Wood.ALDER);
        
        List machingGuitars = inventory.search(whatJinLikes);
        
        if(!machingGuitars.isEmpty()){
            for(Iterator i = machingGuitars.iterator(); i.hasNext();){
                Guitar guitar = (Guitar)i.next();
                System.out.println(
                "Builder : " + guitar.getBuilder() + ", Mode : "  + guitar.getModel()    + ", " +
                "Type : "    + guitar.getType() + ", BackWood : " + guitar.getBackWood() + ", " +
                "TopWood : " + guitar.getTopWood() + ", Price : " + guitar.getPrice());
            }
        }
        else{
            System.out.println("Sorry, we have nothing for you.");
        }
    }
    private static void initializeInventory(Inventory inventory){
        inventory.addGuitar("V95693", 1499.95, Builder.FENDER, "Stratocastor",
                                                                   Type.ELECTRIC, Wood.ALDER, Wood.ALDER);
        inventory.addGuitar("V9512",  1549.95, Builder.FENDER, "Stratocastor",
                                                                   Type.ELECTRIC, Wood.ALDER, Wood.ALDER);
    }
}



아래와같이 조건에 맞는 두개의 기타를 찾아 출력해주는것을 확인할 수 있습니다.





자, 멋진 소프트웨어를 만들기 위한 첫번째 단계 "먼저, 고객이 원하는 기능을 수행하라."를 충족시켰네요.


이제 다음단계 "객체지향의 기본원리를 적용해서 유연하게 개발하라."를 만족시킬 수 있도록 더 공부해 보겠습니다.



다음 내용 공부하기