개발 기록

[이펙티브 자바] 아이템 18 본문

JAVA

[이펙티브 자바] 아이템 18

수염차 2024. 11. 4. 22:50

(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