it 책/오브젝트: 코드로 이해하는 객체지향 설계

오브젝트: 코드로 이해하는 객체지향 설계 10장을 읽으며

lgvv 2024. 11. 16. 11:52

오브젝트: 코드로 이해하는 객체지향 설계 10장을 읽으며

 

느낀점

상속은 경험에 의해서 기피하는 경향이 있는데, 문제에 대해서 다시보면서 인터페이스 상속이 아닌 구현 상속이 일반적으로 문제가 있구나를 알게 되었음.

 

상속과 코드 재사용

객체지향 프로그래밍의 장점 중 하나는 코드를 재사용하기가 용이하다는 것.

  • 전통적인 패러다임에서 코드를 복사한 후 수정하는 것
  • 클래스를 재사용하기 위해 새로운 클래스를 추가하는 가장 대표적인 기법인 상속에 관해 살펴보기로 함.
  • 기존 클래스의 인스턴스를 포함시키는 방법으로 흔히 합성이라고 부름


상속과 중복 코드

중복 코드는 사람들의 마음속에 의심과 불신의 씨앗을 뿌림.

  • 눈 앞 코드가 어떤 코드와 비슷하다고 느끼는 순간 우리의 뇌는 혼란속으로 내던져 짐.

 

DRY 원칙

중복 코드는 변경을 방해함. DRY는 '반복하지 마라'라는 뜻이 Don't Repeat Yourself

  • 중복 여부를 판단하는 기준은 변경
  • DRY 원칙
    • 모든 지식은 시스템 내에서 애매하지 않고, 정말로 믿을 만한 표현 양식을 가져야 함.
    • 한 번, 단 한번(Once and Only Once)또는 단일 지점 제어(Single-Point Control) 원칙

 

상속을 이용해서 중복 코드 제거하기

클래스와 유사한 클래스가 필요하다면 코드를 복사하지 말고 상속을 이용해 코드를 재사용

  • 상속은 결합도를 높임. 그리고 상속이 초래하는 부모 클래스와 자식 클래스 사이의 강한 결합이 코드를 수정하기 어렵게 함.

 

상속을 위한 경고 1

자식 클래스의 메서드 안에 super 참조를 이용해 부모 클래스의 메서드를 직접 호출할 경우 두 클래스는 강하게 결합. super 호출을 제거할 수 있는 방법을 찾아 결합도를 제거

  • 상속 관계로 연결된 자식 클래스가 부모 클래스의 변경에 취약해지는 현상을 가리켜 취약한 기반 클래스 문제라고 부름


취햑한 기반 클래스 문제

부모 클래스 변경에 자식 클래스가 영향을 받는 현상

  • 안타깝게도  상속을 사용하면 부모 클래스의 퍼블릭 인터페이스가 아닌 구현을 변경하더라도 자식 클래스가 영향을 받기 쉬움.
  • 상속 관계를 추가할수록 전체 시스템의 결합도가 높아짐.

 

상속을 위한 경고 2 

상속받은 부모 클래스의 메서드가 자식 클래스의 내부 구조에 대한 규칙을 깨트릴 수 있음.

  • 안타깝게도  상속을 사용하면 부모 클래스의 퍼블릭 인터페이스가 아닌 구현을 변경하더라도 자식 클래스가 영향을 받기 쉬움.
  • 상속 관계를 추가할수록 전체 시스템의 결합도가 높아짐.

 

상속을 위한 경고 3

자식 클래스가 부모 클래스의 메서드를 오버라이딩할 경우 부모 클래스가 자신의 메서드를 사용하는 방법에 자식 클래스가 결합될 수 있음.

  • 상속은 코드 재사용을 위해 캡슐화를 희생


부모 클래스와 자식 클래스의 동시 수정 문제

자식 클래스가 부모 클래스의 메서드를 오버라이딩하거나 불필요한 인터페이스를 상속받지 않았음에도 부모 클래스를 수정할 때 자식 클래스를 함께 수정해야할 수도 있다는 사실을 잘 보여줌.

  • 결합도란 다른 대상에 대해 알고 있는 지식의 양.
  • 상속은 기본적으로 부모 클래스의 구현을 재사용 한다는 기본 전제를 따르기 때문에 자식 클래스가 부모 클래스의 내부에 대해 속속들이 알도록 강요

 

상속을 위한 경고 4

클래스를 상속하면 결합도로 인해 자식 클래스와 부모 클래스의 구현을 영원히 변경하지 않거나, 자식 클래스와 부모 클래스를 동시에 변경하거나 둘 중 하나를 선택할 수밖에 없음.

 

추상화가 핵심이다.

공통 코드를 이동시킨 후에 각 클래스는 서로 다른 변경의 이유를 가진다는 것에 주목

  • 상속 계층이 코드를 진화시키는 데 걸림돌이 된다면 추상화를 찾아내고 상속 계층 안의 클래스들이 그 추상화에 의존하도록 코드를 리팩하기
  • 차이점을 메서드로 추출하고 공통적인 부분은 부모 클래스를 이동


의도를 드러내는 이름 선택하기

좋은 상속 계층을 구현하기 위해서는 상속 계층 안에 속한 클래스들이 구현이 아닌 추상화에 의존

 

차이에 의한 프로그래밍

상속이 강력한 이유는 익숙한 개념을 이용해서 새로운 개념을 쉽고 빠르게 추가할 수 있기 때문.

  • 상속 계층이 코드를 진화시키는 데 걸림돌이 된다면 추상화를 찾아내고 상속 계층 안의 클래스들이 그 추상화에 의존하도록 코드를 리팩하기
  • 차이에 의한 프로그래밍의 목표는 중복 코드를 제거하고 코드를 재사용하는 것
  • 상속은 강력한 도구. 상속을 이용하면 새롱누 기능을 추가하기 위해 직접 구현해야 하는 코드의 양을 최소화