문제 : http://www-128.ibm.com/developerworks/kr/library/s_issue/20080527/

두번째 문제는 현재 시간이 너무 늦어서 안풀려고 그랬는데, 문제가 너무 재밌어서 풀지 않을 수 없었다. 자신이 자주보는 드라마의 명 대사를 클래스로 설계하고 프로그래밍 하는 것이다.
 
한가지 핑계를 얘기하자면.. 현재 보는 드라마가 없어서, 김승권님이 올려주신 대본을 살짝 수정해서 살짝 어이없는 대본을 만들었다. 급하게 해서, 잘 못한 것 같지만 재밌었다.^^

- 원작
철수는 지금 외롭다. 영희에게 묻는다. "야, 나 너 좋아해."
영희가 대답한다. "싫은데. 나는 남자 만날 생각 없어."

철수는 포기하지 않고 장미꽃 1송이를 주며 묻는다. "야, 나 너 좋아해."
영희가 50% 넘어왔다. "꽃은 고마워. 하지만 남자 만날 생각 없어."

철수는 포기하지 않고 금반지를 주며 묻는다. "야, 나 너 좋아해."
영희가 100% 넘어왔다. "그래 우리 사귀자."


- 1차대본
철수 : (아.. 영희가 좋다.)
철수 : 야, 나 너 좋아해

영희 : "싫은데. 나는 남자 만날 생각 없어."

철수 : (선물로 준비한 장미꽃 한송이를 준다.)
철수 : "야, 나 너 좋아해."

영희 : (살짝 기뻐한다.)
영희 : "꽃은 고마워. 하지만 남자 만날 생각 없어."

철수 : (선물로 준비한 금반지를 준다.)
철수 : "야, 나 너 좋아해."

영희 : (정말 기뻐한다.)
영희 : "그래 우리 사귀자."


- 최종 대본
철수 : (설레임.) 야, 나 너 좋아해

영희 : (안 설레임) "싫어."

철수 : (선물로 준비한 장미꽃 한송이를 준다.)
철수 : (설레임) "야, 나 너 좋아해."

영희 : (안 설레임) "싫어."

철수 : (선물로 준비한 금반지를 준다.)
철수 : (설레임)"야, 나 너 좋아해."

영희 : (설레임.) "그래 우리 사귀자."


- 소스 코드

- 철수와 영희를 위한 Class
import java.util.LinkedList;
import java.util.List;


public class Person {
       
        // 마음의 열림정도
        private int openMind;
       
        // 좋아하는 사람
        private Person likePerson;
       
        // 갖고있는 선물의 목록
        private List<Present> presentList;
       
       
        public Person() {
                presentList = new LinkedList<Present>();
        }
       
       
        /**
         * 좋아하는 사람이 생겼다.
         * @param person
         */
        public void addLikePerson(Person person) {
                this.likePerson = person;
                openMind = 100;
        }
       
       
        /**
         * 좋아하는 사람이 존재하는가?
         * @return
         */
        public boolean isExistLikePerson() {
                return likePerson != null;
                       
        }
       
       
        /**
         * Person에게 선물을 준다.
         * @param person
         * @param type
         */
        public void givePresent(Person person, Class type) {
                Present present;
                if(type.getName().equals("Flower")) {
                        for(int i=0 ; i<presentList.size() ; i++) {
                                if(presentList.get(i) instanceof Flower) {
                                        present = presentList.remove(i);
                                        person.addPresent(present);
                                        person.improveMind(present.getMindWeight());
                                }
                        }
                }
                else if(type.getName().equals("Ring")) {
                        for(int i=0 ; i<presentList.size() ; i++) {
                                if(presentList.get(i) instanceof Ring) {
                                        present = presentList.remove(i);
                                        person.addPresent(present);
                                        person.improveMind(present.getMindWeight());
                                }
                        }
                }
        }
       
       
        /**
         * 마음이 어느정도 열렸는지를 수치로 본다.
         * @return
         */
        public int getMind() {
                return openMind;
        }
       
       
        /**
         * 좋아하는 사람을 반환한다.
         * @return
         */
        public Person getLikePerson() {
                return likePerson;
        }
       
       
        /**
         * 선물을 추가한다.
         * @param newPresent
         */
        public void addPresent(Present newPresent) {
                presentList.add(newPresent);
        }
       
       
        /**
         * 마음이 weight만큼 열린다.
         * @param weight
         */
        private void improveMind(int weight) {
                this.openMind += weight;
                if(openMind > 100)
                        openMind = 100;
        }
}


- Present Interface는 선물을 추상화한 Interface이다.
public interface Present {
        public abstract int getMindWeight();
}



- Flower Class는 꽃을 나타낸다.
public class Flower implements Present {
       
        // 꽃의 종류로 올수있는 상수를 정의한다.
        enum FlowerType {
                ROSE
        }
       
        // 꽃의 종류
        private FlowerType type;
       
        public Flower(FlowerType type) {
                this.type = type;
        }
       
        @Override
        /**
         * 꽃으로 마음을 살 수 있는 정도
         */
        public int getMindWeight() {
                return 50;
        }
}


- Ring Class는 반지를 나타낸다.
public class Ring implements Present {
        // 반지의 종류로 올 수 있는 상수를 정의한다.
        enum RingType {
                K_18,
                K_14
        }
       
        // 반지의 종류
        private RingType value;
       
        public Ring(RingType value) {
                this.value = value;
        }
       
        @Override
        /**
         * 반지로 마음을 살 수 있는 정도
         */
        public int getMindWeight() {
                return 70;
        }
}



- 대본에 따른 영화 구현

        public static void main(String[] args) {
                System.out.println("영화 상영");
               
                // 영희와 철수의 생성
                Person youngHee = new Person();
                Person chulSu = new Person();
               
                // 철수는 영희를 좋아한다.
                chulSu.addLikePerson(youngHee);
               
                // 철수는 영희에게 고백하기 위해 꽃과 금반지를 구매한다.
                chulSu.addPresent(new Ring(Ring.RingType.K_18));
                chulSu.addPresent(new Flower(Flower.FlowerType.ROSE));
               
                // 철수는 영희에게 꽃을 선물로 준다.
                if(chulSu.isExistLikePerson())
                        chulSu.givePresent(chulSu.getLikePerson(), Flower.class);
               
                // 철수는 영희에게 금반지를 선물로 준다.
                if(chulSu.isExistLikePerson())
                        chulSu.givePresent(chulSu.getLikePerson(), Ring.class);
               
                // 결국 영희와 철수는 사귀기로 했다.
                if(youngHee.getMind() == 100) {
                        youngHee.addLikePerson(chulSu);
                        System.out.println("철수가 영희를 꼬셨다.");
                }
                else {
                        System.out.println("철수는 오늘도 외롭다.");
                }
        }


사용자 삽입 이미지