1 분 소요

💡 객체 지향 프로그래밍 입문 시리즈

인프런의 객채 지향 프로그래밍 입문을 기반으로 작성한 게시물 입니다.
(본 시리즈의 모든 예시는 JavaScript(TypeScript)로 변환하여 작성하였습니다.)
객체 지향 프로그래밍 입문_1
객체 지향 프로그래밍 입문_2
객체 지향 프로그래밍 입문_3
객체 지향 프로그래밍 입문_4
객체 지향 프로그래밍 입문_5
객체 지향 프로그래밍 입문_6
객체 지향 프로그래밍 입문_7


” 상속보단 조립”

일반적으로 객체 지향적 프로그래밍이라 말하면 상속을 통한 기능 재사용을 떠올리게 됩니다.

하지만 이 방법은 단점이 존재합니다.

  1. 상위 클래스 변경이 어려움
  2. 클래스의 수 증가
  3. 상속 오용

1. 상위 클래스 변경이 어려움.


여러 하위 클래스에 상속이 된 상위 클래스가 존재 할 때, 이 상위클래스의 코드를 변경하게 되면 그 변경이 모든 하위 클래스에 영향을 준다. 더하여 상위 클래스 입장에서는 앞으로 어떤 하위 클래스가 생길지 모르기 때문에 코드의 변경에 조심스럽게 됩니다.

2. 클래스 수 증가


oop7_1

위의 도식과 같이 추가적인 기능이 생길 때 마다 하위 클래스를 생성하여야 합니다. 이렇게 하위 클래스가 많아지면 나중에 클래스를 생성할 때 어떤 클래스를 상속하는게 맞는지 판단하기가 힘들어 지게 됩니다.

예를 들어, CacheableEncryptedStorage 클래스는 캐싱이 가능하고 암호화가 가능한 스토리지 기능을 제공합니다. 이후 캐시기능이 가능하고 암호화가 가능하며 압축이 가능한 클래스가 필요하다고 할 때 이 클래스는 어떤 것을 상속해야 할까요?

혹자는 CompressedStroage, EncryptedStorage, CacheableStorage 클래스들을 상속해야 한다는 사람이 있을 것이고, CacheableEncryptedStorage , CompressedStroage 두 클래스를 상속해야 한다는 견해가 있습니다. 이렇듯 어떤것이 맞는 상속 방법인지 판단하기가 어려운 상황이 생깁니다.

3. 상속 오용


해결책

:point_up: 상속보단 조립!

위와 같은 문제들을 해결하기 위해서는 상속보다는 조립을 이용하여 코드를 구성하는 것이 좋습니다.

여기서 조립이란,

여러 객체를 묶어서 더 복잡한 기능을 제공하게끔 하는 방식입니다. 보통 필드로 다른 객체를 참조하는 방식으로 조립을 하거나, 객체를 필요 시점에 생성하여 사용합니다.

public class FlowController {
    private encryptor: Encryptor = new Encryptor(); //필드로 조립
    public process()L void {
        ...
        const encryptedData: byte[]	= encryptor.encrypt(data);
    }
}

이 방법을 통해 기능을 재사용 하게 되면 앞서 살펴봤던 클래스가 증식하는 부분을 해결 가능하게 됩니다.

oop7_2

oop7_3

:point_up: 항상 코드를 작성하기에 앞서 상속보다 조립으로 풀 수 없는지 검토!
       진짜 하위 타입인 경우에만 상속 사용!

댓글남기기