이번에도 상속을 잘하자! 라는 주젭니다.
태그 클레스.. 라는 말이 나오는데 예를 먼저 봅시다.
public class Person { enum Job{ Student,Professor } final Job job; final int age; public Person(int age) { this.age=age; if(age>30){ job=Job.Professor; }else{ job=Job.Student; } } @Override public String toString() { switch (job) { case Student: return "학생"; case Professor: return "교수"; default: break; } return ""; } public void 밥먹자(){ switch(job){ case Professor: System.out.println("직원식당으로 간다."); break; case Student: System.out.println("학생식당으로 간다."); break; } } public void 퇴근(){ switch(job){ case Professor: System.out.println("퇴근한다"); break; case Student: System.out.println("학생이 무슨 퇴근? 알아서 하세여"); break; } } }
현재 태그는 교수와 학생 만 있다. 여기서 학생을 세분화 해서 초/중/고 등학생을 만들고 싶다면?
혹은 요리사, 검사, 판사, 의사, 청소부, 잉여인간 같은 직업을 추가하고 싶다면?
enum Job 에다가 추가해주면 된다.
우와 쉽다!
근데 밥먹자, 퇴근, toString 같은 메소드는 어쩔?
하나 추가 할때마다 위의 세가지 메소드에 각각 case 추가하고 내용체워줘야함.
대신에 상속에 의해서 분리를 한다면
public abstract class Person { String name; public Person(String name) { this.name=name; } abstract public String toString(); abstract public void 밥먹자(); abstract public void 퇴근(); public String 너이름이뭐니(){ return name; } } class Professor extends Person{ public Professor(String name) { super(name); } @Override public String toString() { return "교수"; } @Override public void 밥먹자() { System.out.println("직원식당으로 간다."); } @Override public void 퇴근() { System.out.println("퇴근한다"); } } class Student extends Person{ public Student(String name) { super(name); } @Override public String toString() { return "학생"; } @Override public void 밥먹자() { System.out.println("학생식당으로 간다."); } @Override public void 퇴근() { System.out.println("학생이 무슨 퇴근? 알아서 하세여"); } }
이런 형식으로 사용할수 있다. 하나 추가한다고 스위치 케이스문 전부 찾아서 수정해줄 필요도 없고 하여튼 태그 방식으로 구분하는것은 최대한 자제하자.
'Effective Java > Chapter 4' 카테고리의 다른 글
항목 22. static 맴버 클래스를 많이 사용하자.. (0) | 2012.01.09 |
---|---|
항목 21. 전략을 표현할 때 함수 객체를 사용하자. (0) | 2012.01.05 |
항목 19. 타입을 정의할 때만 인터페이스를 사용하자. (0) | 2012.01.02 |
항목 18. 추상 클레스보다는 인터페이스를 상용하자. (0) | 2012.01.02 |
항목 17. 상속을 위한 설계와 문서화를 하자. 그렇지 않면 상속의 사용을 금지시킨다. (0) | 2011.12.29 |