클래스의 상속
class Person {
protected int age;
protected String name;
public Persion(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return this.age;
}
public String getName() {
return this.name;
}
}
age와 name이라는 멤버 변수를 가지고 있는 Person 클래스를 생각해보자. 이 클래스를 상속 받는 Student 클래스는 다음과 같이 정의할 수 있다.
class Student extends Person {
protected String studentNumber;
public Student(int age, String name, String studentNumber) {
super(age, name);
this.studentNumber = studentNumber;
}
public String getStudentNumber() {
return this.studentNumber;
}
}
‘extends’라는 키워드를 이용해서 Person 클래스를 상속받아 확장하여 Student 클래스를 정의했다. Student 클래스 정의에는 직접적으로 나와있지 않지만 부모 클래스인 Person 클래스의 메소드인 getAge()와 getName() 메소드를 호출 할 수 있다.
일반적으로 두 클래스 간의 관계가 ‘IS-A’ 관계이면 상속을 사용한다. Student is a person이므로 상속을 통해서 클래스를 정의하는게 자연스럽다.
클래스의 위임
상속과 다르게 위임은 다른 클래스의 객체를 멤버로 갖는 형태의 클래스 정의다.
class Employee {
private Department department;
private String name;
publiv Employee(String name, Department department) {
this.name = name;
this.department = department;
}
public String getDepartmentName() {
return this.department.getName();
}
}
이 경우 특정 메소드 호출을 멤버 클래스의 메소드에 포워드(Forward)하는 식으로 구현하게 된다.
Employee 클래스와 Department 클래스 사이의 관계를 살펴보면 ‘IS-A’ 관계는 아니다. (Employee is a Department는 어색하다.) 따라서 멤버 변수로 Department 클래스를 포함하는 Delegation 형태로 구현을 했다.
상속과 위임
- 두 클래스의 관계가 ‘IS-A’ 관계이면 상속(Inheritance)을 써야한다.
- 기존에 존재하는 API에 넘겨줘야 하는 경우 상속(Inheritance)을 써야한다.
- final 클래스를 확장하고 싶은 경우 위임(Delegation)을 써야한다.