일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 상속
- 성수맛집
- docker
- DesignPattern
- 코딩
- 직장인
- 성수볼거리
- 오브젝트
- 성수직장인
- IntelliJ
- 직장인점심
- 성수
- 성수핫플
- 디자인패턴
- 주니어개발자
- 헤드퍼스트
- 책너두
- JavaScript
- Java
- 클린코드
- Linux
- 책읽기
- 객체지향
- 개발자
- JAVA개발자
- 독서일지
- 깨끗한코드
- 헤드퍼스트디자인패턴
- 객체지향프로그래밍
- 독서
- Today
- Total
닭발개발
[오브젝트] 26일차. 336-348pg | 차이에 의한 프로그래밍, 상속과 합성 본문
[오브젝트] 26일차. 336-348pg | 차이에 의한 프로그래밍, 상속과 합성
D269 2023. 8. 2. 23:22
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
'책책책 책을 읽읍시다‼ ver.개발 > [ 오브젝트: 코드로 이해하는 객체지향 설계 ]' 카테고리의 다른 글
[오브젝트] 28일차. 364-377pg | 합성 (0) | 2023.08.04 |
---|---|
[오브젝트] 27일차. 349-363pg | 상속과 합성 (0) | 2023.08.03 |
[오브젝트] 25일차. 322-335pg | 취약한 기반 클래스 문제, 추상화에 의존 (0) | 2023.07.31 |
[오브젝트] 24일차. 305-321pg | 중복코드제거, DRY원칙 (0) | 2023.07.22 |
[오브젝트] 23일차. 291-304pg | 의존성 주입, 의존성 역전 (0) | 2023.07.22 |