오브젝트 13장

송은우·2022년 10월 18일
0

TIL

목록 보기
32/61

상속
1. 타입계층
일반화 특수화
2. 코드 재사용

객체 관점의 타입
우리가 인지하는 사물의 종류. 그 대상을 인스턴스 즉 객체

프로토타입 관점의 타입
유효한 오퍼레이션의 집합. 미리 약속된 문맥을 제공함(환경마다 다른 결과)

객체지향 패러다임 관점의 타입
공통의 특징을 공유하는 대상의 분류
동일한 오퍼레이션을 적용할 수 있는 인스턴스들의 집합
동일한 퍼블릭 인터페이스

슈퍼타입, 서브타입. 일반적, 구체적

객체 지향 프로그래밍의 타입 계층
일반적인 타입과, 구체적인 타입 간의 관계를 형성하는 기준이 퍼블릭 인터페이스

상속을 사용할 때
1. is-a
당연하지만, 정의보다는 기대되는 행동에 따라 타입 계층을 구성해야 함
2. 부모타입을 자식이 사용해도 되는가, 행동 호환성
클라이언트의 관점에서 호환을 확인해야 함
override로 비워두기, 실행시 에러 던지기, instanceof 모두 개방 폐쇠 원칙이 깨진다.
게층을 분리해야 한다.

인터페이스를 클라이언트의 기대에 따라 분리함으로써 변경에 의해 영향을 제어하는 설계 원칙을 인터페이스 분리 원칙이라고 한다.(ISP)

서브클래싱, 서브타이핑
서브 클래싱 : 코드 재사용을 목적으로 씀. 행동 호환이 안됨. 구현 상속 또는 클래스 상속
서브 타이핑 : 타입 계층을 위해서 모든 것을 사용함. 완벽한 호환이 됨. 인터페이스 상속(대체 가능성 이라고 표현함)

리스코프 치환 원칙
LSP
서브타입은 무조건 대체가 가능해야 한다.
is-a 부분은 진짜로 생각보다 더 빡빡할 수가 있다. 직사각형과 정사각형의 관계는 is-a 이지만, 높이를 변경할 수 있다는 그런 부분이 있다면 그 과정이 틀릴 수도 있음 따라서 이 관계는 서브 클래싱의 관계이다.
클라이언트 관점에서는 대체할 수가 없다. "클라이언트"가 핵심이다.

is-a 관계는 부모 타입 대신 자식 타입을 써도 완벽하게 문제가 없는지를 파악해야 한다.

의존성 역전 원칙, 리스코프 치환 원칙, 개방 폐쇠 원칙
클래스 상속은 타입 계층을 구현할 방법중 하나일 뿐.

클라이언트 입장에서 자식 클래스가 부모 클래스를 대체할 수 있다는건 무엇을 의미할까?

의무와 이익의 관점에서 보는 것을 계약에 의한 설계
클라이언트가 만족시켜야 하는 사전 조건, 서버가 클라이언트에게 보장해야 하는 사후조건, 메서드 실행 전과 실행 후에 인스턴스가 만족시켜야 하는 클래스 불변식 3가지 요소로 이루어져있다.

서브타입이 리스코프 치환 원칙을 만족시키기 위해서는 클라이언트와 슈퍼타입 간에 체결된 계약을 준수해야 한다.

서브타입과 계약
계약의 관점에서 상속이 일으키는 문제는 자식 클래스가 부모 클래스의 메서드를 오버라이딩 할 수 있다는 것
부모 클래스의 메서드를 오버라이딩 할 수 있다는 것.

서브타입에 더 강력한 사전 조건을 정의할 수 없다.
서브타이핑에 슈퍼타입과 같거나 더 강한 제약을 걸 수 있다.
사후조건을 약하게 걸 수는 없다.

profile
학생의 마음가짐으로 최선을 다하자

0개의 댓글