개발 기록
[이펙티브 자바] 아이템 18 본문
(18) 상속보다는 컴포지션을 사용하라
- 여기서 말하는 상속은 인터페이스 상속이 아닌 (클래스가 다른 클래스를 확장하는) 구현 상속을 말함
- 구현 상속 (서브클래싱): 코드를 재사용하기 위해 부모 클래스를 상속받는 것.
부모 클래스의 기능을 그대로 물려받아 재사용하거나, 필요한 부분만 수정하여 사용하는 방식
- 인터페이스 상속 (서브타이핑): 다형성을 위해 부모 클래스와 자식 클래스가 동일한 인터페이스를 공유하도록 하는 것.
부모 클래스에서 정의된 메서드를 자식 클래스가 반드시 구현
### 상속의 문제점
1. 캡슐화를 해친다.
- 상위 클래스의 구현이 바뀌면 하위 클래스의 동작에 이상이 생길수 있다.
- self-use 패턴 ( 한 메소드가 같은 클래스 내의 다른 메서드를 사용하는 패턴 ) 사용시,
- 상위 클래스에 메소드가 추가되었는데 하위 클래스에는 이를 재정의하지 못 했을 때 (보안 문제)
### 상속을 쓸 수 있는 경우
- 반드시 하위 클래스가 상위 클래스의 진짜 하위 타입인 상황에서만 사용해야 한다. (is-a관계)
1. Is-a 관계(상속 관계)
- A는 일종의 B이다
2. Has-a 관계 (포함 관계)
- A는 B를 가지고 있다
## 상속 대신 컴포지션
- 새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조하게 하는 방법.
- 기존 클래스가 새로운 클래스의 구성요소로 쓰인다.
class Animal {
public void makeSound(String sound) {
System.out.println(sound);
}
}
class Dog {
private Animal animal;
public Dog() {
this.animal = new Animal();
}
public void bark() {
animal.makeSound("멍멍!");
}
}
### 장점
- 새로운 클래스는 기존 클래스의 내부 구현 방식의 영향에서 벗어난다.
- 기존 클래스에 새로운 메서드가 추가되더라도 전혀 영향받지 않는다.
'JAVA' 카테고리의 다른 글
[이펙티브 자바] 아이템 24 (0) | 2024.11.27 |
---|---|
[이펙티브 자바] 아이템 21,22 (0) | 2024.11.19 |
[이펙티브 자바] 아이템 15 (0) | 2024.10.29 |
[이펙티브자바] 아이템12 (0) | 2024.10.23 |
[이펙티브 자바] 아이템 11 (1) | 2024.10.15 |
Comments