클래스의 상속(Inheritance)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Person{
protected int age;
protected String name;
public Person(int age, String name){
this.age = age;
this.name = name;
}
public int getAge(){
return this.age;
}
public String getName(){
return this.name;
}
}
|
cs |
Person 클래스를 상속받는 Student 클래스는 다음과 같이 정의할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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;
}
}
|
cs |
'extends'라는 키워드를 이용해서 Person 클래스를 상속받아 확장하여 Student 클래스를 정의했다. Student 클래스 정의에는 직접적으로 나와있지 않지만 부모 클래스인 Person 클래스의 메소드인 getAge()와 getName() 메소드를 호출할 수 있다.
일반적으로 두 클래스 간의 관계가 'IS-A' 관계이면 상속을 사용한다. Student is a Person 이므로 상속을 통해서 클래스를 정의하는 것이 자연스럽다.
클래스의 위임(Delegation)
상속과 다르게 위임은 다른 클래스의 객체를 멤버로 갖는 형태의 클래스 정의다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Employee {
private Department department;
private String name;
public Employee(String name, Department department) {
this.name = name;
this.department = department;
}
public String getDepartmentName() {
return this.department.getName();
}
}
|
cs |
Employee 클래스와 Department 클래스 사이의 관계를 살펴보면 'IS-A' 관계는 아니다. 따라서 멤버 변수로 Department 클래스를 포함하는 Delegation 형태로 구현을 했다.
언제 무엇을 써야할까?
어느 하나가 좋은 것이 아니고, 상황에 따라서 적절한 방법을 사용해야 한다. 일반적으로는 다음과 같은 판단 기준을 가지고 있으면 된다.
- 두 클래스의 관계가 'IS-A' 관계이면 상속(Inheritance)을 써야한다.
- 기존에 존재하는 API에 넘겨줘야 하는 경우 상속(Inheritance)을 써야한다.
- final 클래스를 확장하고 싶은 경우 위임(Delegation)을 써야 한다.
상속을 사용해서 클래스를 정의한 경우, 부모 클래스와 자식 클래스 사이에는 강한 연관관계가 생기게 된다(Tightly-Coupled). 이 경우 부모 클래스의 동작이 변경되면 자식 클래스들의 동작도 모두 영향을 받게 된다.
두 클래스의 관계가 'IS-A' 관계인 경우 이런 변경은 자연스럽다. 하지만 일반적인 경우 두 클래스 사이에 불필요한 종속성이 생기는 것은 옳지 못하다. 따라서 무분별하게 상속을 남발하는 경우는 피해야 한다.
※ 참조 : https://soft.plusblog.co.kr/89
'CS' 카테고리의 다른 글
디자인 패턴(Design Pattern) (0) | 2020.09.04 |
---|---|
PCB (0) | 2020.08.29 |
Process / Thread (0) | 2020.08.28 |
REST (1) | 2020.08.22 |
Gradle (0) | 2020.08.22 |
댓글