개발하는 프로 국밥러
article thumbnail

오브젝트

조영호님의 책 오브젝트를 보며 정리한 내용입니다.

문제가 될 시 해당글 삭제하겠습니다.

 


Chapter 10 상속과 코드 재사용

[상속과 중복코드]

중복코드의 단점..

  • 중복 코드는 변경을 방해한다! (중복 코드를 제거해야 하는 이유)
    • 코드를 수정하는데 드는 노력이 몇배나 증가한다.
    • 요구사항이 변경 됐을 때 두 코드를 함께 수정해야 한다면 이 코드는 중복이다!

DRY 원칙(Don't Repeat Youtself)

  • 모든 지식은 시스템 내에서 단일하고, 애매하지 않고, 정말로 믿을 만한 표현 양식을 가져야한다.

상속

  • 객체지향에서 중복코드를 제거하는 첫번째 방법!
  • 하지만 상속을 통한 중복코드 제거는 부모클래스와 자식클래스의 결합도를 높인다는 단점이 있다.

[취약한 기반 클래스 문제]

  1. 취약한 기반 클래스 문제 : 부모 클래스의 변경에 의해 자식 클래스가 영향을 받는 현상을 말한다.
    • 이는 캡슐화를 약화시키고 결합도를 높인다.(객체지향의 기본은 캡슐화를 통한 변경의 통제라는 점을 명심해라!
  2. 불필요한 인터페이스 문제 : 자식 클래스가 불필요한 부모 클래스의 메서드를 상속 받게 되어, 자식 클래스 내부규칙이 무너질수 있다.
  3. 메서드 오버라이딩 오작용 문제 : 자식 클래스가 부모 클래스의 메서드를 오버라이딩 할 경우, 부모 클래스가 자신의 메서드를 사용하는 방법이 자식 클래스에 결합될 수 있다..
  4. 부모 클래스와 자식 클래스의 동시 수정 문제 : 클래스를 상속하면 결합도로 인해 자식 클래스와 부모 클래스의 구현을 영원히 변경하기 않거나, 자식 클래스와 부모 클래스를 동시에 변경하거나 두가지 선택지밖에 없다. 

[상속으로 인한 피해를 최소화하는 방법]

  • 추상화에 의존하자!!
  • 추상화에 의존하는 방법 
    1. 차이를 메서드로 추출하라 : 상속관계에 있는 클래스 사이에 메서드는 차이가 있는 부분을 메서드로 빼, 동일한 부분을 만들어준다.
    2. 중복 코드를 부모 클래스로 올려라1 : 동일한 부분이 생겼다면, 동일 부분을 부모 클래스로 올려 각 클래스가 부모 클래스를 상속받는 구조를 만들어준다.
    3. 중복 코드를 부모 클래스로 올려라2 : 차이가 있는 부분은 추상메서드로 만들어, 자식 클래스에서 상속받아 사용할 수 있도록 한다.
      -> 각각의 클래스는 하나의 변경 이유만을 가지는 구조로 변경된다(단일 책임 원칙)!
      -> 하지만 상속은 어떤 방식으로든 부모클래스와 자식클래스를 결합시킨다.

[상속 챕터를 마치며]

  • 객체지향 세계에서 중복 코드를 제거하고 코드를 재사용할 수 있는 가장 유명한 방법은 상속이다.
  • 하지만 객체지향에 대한 이해가 깊어진다면 맹목적으로 코드 재사용을 막는 방법으로 상속을 사용하는 것은 위험한 방법이다.
  • 상속은 코드 재사용과 관련된 우아한 방법이 아니다. 더 좋은 방법은 합성이다!

Chapter 11 합성과 유연한 설계

  • 합성은 내부에 포함되는 객체의 구현이 아닌 퍼블릭 인터페이스에 의존하게 된다.
    -> 합성을 사용하게 되면 포함된 객체의 내부 구현이 변경되더라도 영향을 최소화할 수 있기 때문에 변경에 안정적인 코드를 얻게된다.
  • 상속은 클래스 사이에 정적인 관계인데 비해, 합성의 관계는 객체 사이의 동적인 관계이다.
    -> 상속은 컴파일타임 의존성을 띄지만, 합성은 런타임 의존성을 띤다.

[상속으로 인한 조합의 폭발적인 증가]

  • 상속으로 변경사항을 도입하고자 할 때, 부모클래스 자식클래스의 구조를 만들어주고 추가적으로 자식클래스를 상속받는 손자클래스를 만드는 방식이다.
    -> 폭발적으로 결합도가 증가됨을 느낄 수 있다.
    -> 부모 클래스에서 공통되는 사항을 메서드로 묶고, 추상메서드를 추가 하더라도 모든 자식들이 오버라이딩 해야하는 문제가 생긴다. (Java8 에서 생긴 default 키워드를 통해서 해결할 수도 있을 것 같다!)
    -> 대부분의 객체 지향 언어는 단일 상속만을 지원하기 때문에, 상속으로 인한 중복코드 문제를 해결하기가 쉽지 않다.

중복 코드의 덫

  • 서비스 변경사항은 자유롭게 조합할 수 있어야 하며, 적용되는 순서 역시 임의로 결정할 수 있어야 한다.
  • 하지만 상속을 이용한 해결 방법은 모든 가능한 조합별로 자식 클래스를 하나씩 추가하는 방법으로, 조합과 순서에 있어 부모 클래스에 종속되어 유연하지 못하다.
  • 이처럼 상속의 남용으로 하나의 기능을 추가하기 위해서 필요 이상으로 많은 수의 클래스를 추가해야 하는 경우를 가리켜, 클래스 폭발 혹은 조합의 폭발 이라고 부른다.
    -> 이 방법을 해결하는 가장 근본적인 해결 방법은 상속을 포기하는 것이다!

객체 합성이 클래스 상속보다 더 좋은 방법이다.

  • 객체지향에서 코드를 재사용하기 위해 사용되는 대표적인 방법은 상속이다.
  • 하지만 코드를 재사용하면서도 건전한 결합도를 유지할 수 있는 더 좋은 방법은 합성을 이용하는 것이다.
  • 상속은 구현 상속과 인터페이스 상속 두가지로 나뉘게 되는데, 상속에 모든 단점들은 구현 상속에 국한된다!
profile

개발하는 프로 국밥러

@gugbab2

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!