오브젝트

Ch05. 변경과 설계 - 설계 평가하기

webmaster 2024. 10. 12. 20:38
728x90

상속을 이용한 클래스 계층 구조 구성

서로 다른 이유로 변경되는 코드를 분리할 때 사용할 수 있는 가장 간단한 방법은 상속이다. 상속에서는 변경의 이유에 따라 코드를 자식/부모 클래스로 분리한다.

  • 상속에서는 부모 클래스에 중복을 제거하기 위해 공통 로직을 위치시킨다.
  • 상속 계층을 구성하기 위해 상속받아 사용되어야 하는 메서드는 추상 메서드로, 이를 사용하는 클래스는 추상 클래스로 구현한다.

EX) Movie의 상속을 이용한 클래스  계층 구조 구성

상속을 이용한 클래스  계층 구조 구성

  • 공통 로직을 Movie에 두고, 자식 클래스(AmountDiscount, PercentDiscount)에서 이를 상속받는다.
  • 오버 라이딩 되어 사용될 메서드(calculateDiscount)를 추상 메서드로, 이를 사용하는 클래스를 추상 클래스로 구현한다.
  • 오버 라이딩된 코드들이 런타임에 부모 클래스의 추상 메서드를 대체하기 때문에 부모 클래스와 자식 클래스의 코드가 합쳐지게 된다.

속성을 클래스로 이동

함께 사용된 메서드와 속성 그룹을 기준으로 클래스를 분리시키면 응집도가 높아진다.

EX) 속성 그룹을 기준으로 클래스 분리

속성 그룹을 기준으로 클래스 분리

  • Movie 클래스는 fee, conditions 필드를 포함하기 때문에 해당 필드를 속성으로 포함시킨다.
  • AmountDiscount 클래스는 discountAmount 필드를 사용하기 때문에 해당 필드를 속성으로 포함시킨다.
  • PercentDiscount 클래스는 percent  필드를 사용하기 때문에 해당 필드를 속성으로 포함시킨다.
    • fee는 Movie에 포함되어 있기 때문에 접근제한자를 protected로 변경하여 PercentDiscount 클래스가 접근할 수 있도록 만들어야 한다.

초기화되는 속성을 기준으로 클래스 분리

초기화되는 속성을 기준으로 클래스를 분리하면 응집도가 높아진다.

ex) 초기화되는 속성을 기준으로 클래스를 분리

초기화 되는 속성을 기준으로 클래스를 분리

  • 금액할인 정책을 생성할 때, 할인 비율이 필요 없어 Null 값을 전달한다.
  • 비율할인 정책을 생성할 때, 할인 금액이 필요 없어 Null 값을 전달한다.
  • 할인 비율과 할인 금액은 경우에 따라 다른 속성들과 함께 초기화되지 않을 수 있다.

 

상속 문제점

상속이 가지는 근본적인 한계는 결합도가 높아지고 캡슐화 원칙이 위반된다. 

1) 데이터 캡슐화 위반 : 자식 클래스에서 부모 클래스의 필드를 직접 접근한다(온전히 캡슐화가 되지 않음)

2) 컴파일 타임 결합: 부모와 자식 클래스 사이의 관계가 컴파일 타임에 결정된다.

EX) 데이터 캡슐화 위반

데이터 캡슐화 위반

  • 자식 클래스인 PercentDiscountMovie는 부모 클래스인 무비의 protected 필드인 fee에 직접 접근한다.
  • Movie 클래스 내부 데이터가 변경될 경우 자식 클래스인 PercentDiscountMovie가 영향을 받는다.

EX) 컴파일 타임 결함

컴파일 타임 결함

  • 런타임에 비율 할인 정책으로 계산하는 PercentDiscountMovie의 인스턴스로 변경해야 한다면, 새로운 인스턴스를 생성한 후 할인 비율을 제외한 나머지 속성들을 원래의 movie로부터 얻어 전달해야 한다.
  • 할인 정책 종류를 변경하는 작업을 복작하게 만들며, movie의 데이터를 외부에 제공해야 하기 때문에 캡슐화를 위반하기도 쉽다.

결합도와 캡슐화가 문제가 된다면 상속을 합성으로 변경하는 것이 좋다. 

728x90