[IBM Developer works] 초보 개발자 코드 트레이닝, Part3. 데이터 추상화(2)
Posted 2008/07/06 03:27
문제 : http://www-128.ibm.com/developerworks/kr/library/s_issue/20080527/
두번째 문제는 현재 시간이 너무 늦어서 안풀려고 그랬는데, 문제가 너무 재밌어서 풀지 않을 수 없었다. 자신이 자주보는 드라마의 명 대사를 클래스로 설계하고 프로그래밍 하는 것이다.
한가지 핑계를 얘기하자면.. 현재 보는 드라마가 없어서, 김승권님이 올려주신 대본을 살짝 수정해서 살짝 어이없는 대본을 만들었다. 급하게 해서, 잘 못한 것 같지만 재밌었다.^^
- 원작
- 1차대본
- 최종 대본
- 소스 코드
- 철수와 영희를 위한 Class
- Present Interface는 선물을 추상화한 Interface이다.
- Flower Class는 꽃을 나타낸다.
- Ring Class는 반지를 나타낸다.
- 대본에 따른 영화 구현
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("철수는 오늘도 외롭다.");
}
}
두번째 문제는 현재 시간이 너무 늦어서 안풀려고 그랬는데, 문제가 너무 재밌어서 풀지 않을 수 없었다. 자신이 자주보는 드라마의 명 대사를 클래스로 설계하고 프로그래밍 하는 것이다.
한가지 핑계를 얘기하자면.. 현재 보는 드라마가 없어서, 김승권님이 올려주신 대본을 살짝 수정해서 살짝 어이없는 대본을 만들었다. 급하게 해서, 잘 못한 것 같지만 재밌었다.^^
- 원작
철수는 지금 외롭다. 영희에게 묻는다. "야, 나 너 좋아해."
영희가 대답한다. "싫은데. 나는 남자 만날 생각 없어."
철수는 포기하지 않고 장미꽃 1송이를 주며 묻는다. "야, 나 너 좋아해."
영희가 50% 넘어왔다. "꽃은 고마워. 하지만 남자 만날 생각 없어."
철수는 포기하지 않고 금반지를 주며 묻는다. "야, 나 너 좋아해."
영희가 100% 넘어왔다. "그래 우리 사귀자."
영희가 대답한다. "싫은데. 나는 남자 만날 생각 없어."
철수는 포기하지 않고 장미꽃 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;
}
}
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();
}
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;
}
}
// 꽃의 종류로 올수있는 상수를 정의한다.
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;
}
}
// 반지의 종류로 올 수 있는 상수를 정의한다.
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("철수는 오늘도 외롭다.");
}
}
'C.S.E > Java' 카테고리의 다른 글
| java.lang.Object.equals (0) | 2008/07/11 |
|---|---|
| [IBM Developer Works] 초보 개발자 코드 트레이닝, Part4. TDD 수련 (2) | 2008/07/08 |
| [IBM Developer works] 초보 개발자 코드 트레이닝, Part3. 데이터 추상화(2) (0) | 2008/07/06 |
| [IBM Developer works] 초보 개발자 코드 트레이닝, Part3. 데이터 추상화(1) (0) | 2008/07/06 |
| Java Applet과 Socket을 이용한 실시간 웹쪽지의 구현 (배포) (4) | 2008/06/19 |
| Java Applet과 Socket을 이용한 실시간 웹쪽지의 구현 (원리) (0) | 2008/06/19 |
- Filed under : C.S.E/Java
- Comment Trackback
이올린에 북마크하기