이번에도 상속을 잘하자! 라는 주젭니다.

태그 클레스.. 라는 말이 나오는데 예를 먼저 봅시다.
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("학생이 무슨 퇴근? 알아서 하세여");
	}
	
}

이런 형식으로 사용할수 있다. 하나 추가한다고 스위치 케이스문 전부 찾아서 수정해줄 필요도 없고 하여튼 태그 방식으로 구분하는것은 최대한 자제하자.
Posted by 동적할당
: