닭발개발

[오브젝트] 26일차. 336-348pg | 차이에 의한 프로그래밍, 상속과 합성 본문

책책책 책을 읽읍시다‼ ver.개발/[ 오브젝트: 코드로 이해하는 객체지향 설계 ]

[오브젝트] 26일차. 336-348pg | 차이에 의한 프로그래밍, 상속과 합성

D269 2023. 8. 2. 23:22
728x90

 

 

26일차.

#책너두
오브젝트: 코드로 이해하는 객체지향 설계[5주차_화요일]
336-348pg

 

 

#요약

 

**Chapter 10. 상속과 코드 재사용**

- 객체지향에서는 코드 재사용을 위해 '새로운'코드를 추가하는데 코드는 보통 클래스 안에서 작성되니까 새로운 클래스를 추가한다.

- 클래스를 재사용하기 위해 새로운 클래스를 추가하는 가장 대표적 기법 : 상속

- 클래스의 인스턴스 안에 기존 클래스의 인스턴스를 포함시키는 방법 : 합성

 

01. 상속과 중복코드

02. 취약한 기반 클래스 문제

03. Phone 다시 살펴보기

1) 추상화에 의존하자

2) 차이를 메서드로 추출하라

3) 중복 코드를 부모 클래스로 옮겨라

- 공통 코드를 옮길 때 인스턴스 변수보다 메서드를 먼저 이동시키는게 편한데 컴파일 에러를 통해 그 메서드에 필요한 메서드나 인스턴스 변수가 무엇인지 컴파일 에러를 통해 자동으로 알 수 있기 때문.

 

4) 추상화가 핵심이다.

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

- 상속 계층이 코드를 진화시키는 데 걸림돌이 되면 추상화를 찾아내고 상속 계층 안의 클래스들이 그 추상화에 의존하도록 코드를 리팩터링 해라

 

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

- 좋은 상속 계층을 구성하려면 상속 계층 안에 속한 클래스들이 구현이 아닌 추상화에 의존해야 한다는 사실

 

6) 세금 추가하기

- 여기서 세금은 모든 요금제에 공통으로 적용해야 하는 요구사항임

- 클래스는 메서드 뿐 아니라 인스턴스 변수도 함께 포함이다.

- 클래스 사이의 상속은 자식 클래스가 부모 클래스가 구현한 행동 뿐 아니라 인스턴스 변수에 대해서도 결합되게 함.

- 책임을 아무리 잘 분리해도 인스턴스 변수의 추가는 종종 상속 계층 전반에 걸친 변경을 유발함.

- 객체 생성 로직 변경에 대응 할 수 있는 데에는 많은 방법이 있어서 객체 생성 로직에 대한 변경을 막기 보다는 핵심 로직의 중복을 막는게 좋다.

- 상속으로 인한 클래스 사이의결합을 피할 수는 없다. 상속은 어떻게든 부모 클래스와 자식 클래스를 결합시킨다.

 

 

04. 차이에 의한 프로그래밍

- 상속을 사용하면 이미 존재하는 클래스의 코드를 기반으로 다른 부분을 구현해서 새로운 기능을 쉽고 빠르게 추가 가능

- 차이에 의한 프로그래밍 : 기존 코드와 다른 부분만을 추가함으로써 애플리케이션의 기능을 확장하는 방법

- 상속을 이용하면 이미 존재하는 클래스의 코드를 쉽게 재사용할 수 있으니 애플리케이션의 점진적인 정의가 가능.

- 목표 : 중복 코드를 제거하고 코드를 재사용하는 것.

- 재사용 가능한 코드란 심각한 버그가 존재하지 않는 코드. 

- 객체지향에서 중복코드 제거, 코드 재사용의 가장 유명한 방법은 상속

- 상속은 오용 , 남용 하면 안됨.

- 합성 : 상속의 단점을 피하면서 코드를 재사용할 수 있는 더 좋은 방법.

 

 


 

**Chapter 11. 합성과 유연한 설계**

- 합성은 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해서 부분 객체의 코드를 재사용한다.

- 상속에서 부모 클래스와 자식 클래스 사이의 의존성은 컴파일 타임에 해결되는데, 합성에서 두 객체 사이의 의존성은 런타임에 해결된다. 

- 상속관계는 is-a 관계, 합성 관계는 has-a 관계

- 합성은 구현에 의존하지 않는다.

- 합성은 내부에 포함되는 객체의 구현이 아닌, 퍼블릭 인터페이스에 의존한다.

- 합성을 이용하면 포함된 객체의 내부 구현이 변경되도 영향을 최소화할 수 있어서 변경에 더 안정적인 코드를 짤 수 있다.

- 상속은 클래스 사이의 정적인 관계, 합성은 객체 사이의 동적인 관계

- 상속은 부모 클래스 안에 구현된 코드 자체를 재사용

- 합성은 포함되는 객체의 퍼블릭 인터페이스를 재사용

- 클래스 상속 : 다른 클래스를 이용해서 한 클래스의 구현을 정의하는 것

- 화이트 박스 재사용 : 서브클래싱에 의한 재사용, 상속을 받으면 부모 클래스의 내부가 자식 클래스에 공개되기 때문에

- 블랙 박스 재사용 : 객체의 내부는 공개되지 않고 인터페이스를 통해서만 재사용

 

01. 상속을 합성으로 변경하기

- 코드 재사용을 위해 상속을 남용했을 때 직면할 수 있는 세 가지 문제점

   a. 불필요한 인터페이스 상속문제

   b. 메서드 오버라이딩의 오작용 문제

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

- 합성은 상속이 초래하는 위 3가지 문제를 해결 가능

- 상속을 합성으로 바꾸는 방법 : 자식 클래스에 선언된 상속 관계를 제거하고 부모 클래스의 인스턴스를 자식 클래스의 인스턴스 변수로 선언하면 됨

 

1) 불필요한 인터페이스 상속 문제: java.util.Properties와 java.util.Stack

 

 

 

 

 

 

 

 

728x90
반응형