객체 지향 프로그래밍 입문 7
💡 객체 지향 프로그래밍 입문 시리즈
인프런의 객채 지향 프로그래밍 입문을 기반으로 작성한 게시물 입니다.
(본 시리즈의 모든 예시는 JavaScript(TypeScript)로 변환하여 작성하였습니다.)
객체 지향 프로그래밍 입문_1
객체 지향 프로그래밍 입문_2
객체 지향 프로그래밍 입문_3
객체 지향 프로그래밍 입문_4
객체 지향 프로그래밍 입문_5
객체 지향 프로그래밍 입문_6
객체 지향 프로그래밍 입문_7
” 상속보단 조립”
일반적으로 객체 지향적 프로그래밍이라 말하면 상속을 통한 기능 재사용을 떠올리게 됩니다.
하지만 이 방법은 단점이 존재합니다.
- 상위 클래스 변경이 어려움
- 클래스의 수 증가
- 상속 오용
1. 상위 클래스 변경이 어려움.
여러 하위 클래스에 상속이 된 상위 클래스가 존재 할 때, 이 상위클래스의 코드를 변경하게 되면 그 변경이 모든 하위 클래스에 영향을 준다. 더하여 상위 클래스 입장에서는 앞으로 어떤 하위 클래스가 생길지 모르기 때문에 코드의 변경에 조심스럽게 됩니다.
2. 클래스 수 증가
위의 도식과 같이 추가적인 기능이 생길 때 마다 하위 클래스를 생성하여야 합니다. 이렇게 하위 클래스가 많아지면 나중에 클래스를 생성할 때 어떤 클래스를 상속하는게 맞는지 판단하기가 힘들어 지게 됩니다.
예를 들어, CacheableEncryptedStorage
클래스는 캐싱이 가능하고 암호화가 가능한 스토리지 기능을 제공합니다. 이후 캐시기능이 가능하고 암호화가 가능하며 압축이 가능한 클래스가 필요하다고 할 때 이 클래스는 어떤 것을 상속해야 할까요?
혹자는 CompressedStroage
, EncryptedStorage
, CacheableStorage
클래스들을 상속해야 한다는 사람이 있을 것이고, CacheableEncryptedStorage
, CompressedStroage
두 클래스를 상속해야 한다는 견해가 있습니다. 이렇듯 어떤것이 맞는 상속 방법인지 판단하기가 어려운 상황이 생깁니다.
3. 상속 오용
해결책
상속보단 조립!
위와 같은 문제들을 해결하기 위해서는 상속보다는 조립을 이용하여 코드를 구성하는 것이 좋습니다.
여기서 조립이란,
여러 객체를 묶어서 더 복잡한 기능을 제공하게끔 하는 방식입니다. 보통 필드로 다른 객체를 참조하는 방식으로 조립을 하거나, 객체를 필요 시점에 생성하여 사용합니다.
public class FlowController {
private encryptor: Encryptor = new Encryptor(); //필드로 조립
public process()L void {
...
const encryptedData: byte[] = encryptor.encrypt(data);
}
}
이 방법을 통해 기능을 재사용 하게 되면 앞서 살펴봤던 클래스가 증식하는 부분을 해결 가능하게 됩니다.
항상 코드를 작성하기에 앞서 상속보다 조립으로 풀 수 없는지 검토!
진짜 하위 타입인 경우에만 상속 사용!
댓글남기기