닭발개발

[오브젝트] 34일차. 436-446pg | 타입, 타입계층 본문

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

[오브젝트] 34일차. 436-446pg | 타입, 타입계층

D269 2023. 8. 10. 16:24
728x90

 

34일차.


오브젝트: 코드로 이해하는 객체지향 설계[6주차_목요일]
436-446pg

 
 

#요약

 **Chapter 13. 서브클래싱과 서브타이핑**
- 13장의 목표 : 상속이 서브타입 다형성과 동적 메서드 탐색에 밀접하게 연관돼어 있음 알기.

- 객체기반 프로그래밍 : 상태와 행동을 캡슐화한 객체를 조합해서 프로그램을 구성하는 방식.

- 객체지향 프로그래밍 : 객체기반 프로그래밍의 한 종류, 상속과 다형성을 지원하지만 객체기반 프로그래밍은 지원하지 않음.

 

 

01. 타입

1) 개념 관점의 타입 : 우리가 인지하는 세상의 사물의 종류

- 우리가 인식하는 객체들에 적용하는 개념이나 아이디어

- 어떤 대상이 타입으로 분류될 때 그 대상을 타입의 인스턴스라고 부름

- 객체 : 타입의 인스턴스

- 타입은 심볼, 내연, 외연의 3가지 요소로 구성됨.

 

2) 프로그래밍 언어 관점의 타입

- 프로그래밍 언어 관점에서 타입은 연속적인 비트에 의미와 제약을 부여하기 위해 사용 됨.

- 비트에 담긴 데이터를 문자열로 다룰지, 정수로 다룰지는 전적으로 데이터를 사용하는 애플리케이션에 의해 결정됨.

- 프로그래밍 언어에서 타입의 목적

   a. 타입에 수행될 수 있는 유효한 오퍼레이션의 집합을 정의함.

      - 모든 객체지향 언어들은 객체의 타입에 따라 적용가능한 연산자의 종류를 제한함으로써 프로그래머의 실수를 막아준다는 것.

   b. 타입에 수행되는 오퍼레이션에 대해 미리 약속된 문맥을 제공함.

 

=> 타입은 적용 가능한 오퍼레이션의 종류와 의미를 정의함으로써 코드의 의미를 명확하게 전달하고 개발자의 실수를 방지하기 위해 사용됨.

 

3) 객체지향 패러다임 관점의 타입

- 개념 관점에서 타입이란 공통의 특징을 공유하는 대상들의 분류.

- 프로그래밍 언어 관점에서 타입이란 동일한 오퍼레이션을 적용할 수 있는 인스턴스들의 집합

 

- 프로그래밍 언어의 관점과 객체지향 패러다임 관점을 조합해보면 객체의 타입이란 객체가 수신할 수신할 수 있는 메시지의 종류를 정의하는 것이다.

- 퍼블릭 인터페이스가 객체가 수신할 수 있는 메시지의 집합을 가리키는 말이다.

 

- 개념 관점에서 타입은 공통의 특징을 공유하는 대상들의 분류라고 했는데, 여기서 공통의 특징이란?

- 동일한 퍼블릭 인터페이스를 가지는 객체들은 동일한 타입으로 분류한다.

 

- 객체에게 중요한 건 속성이 아니라 행동이다.

- 어떤 객체들이 동일한 상태를 가지고 있어도 퍼블릭 인터페이스가 다르면 서로 다른 타입으로 분류된다.

- 객체의 타입을 결정하는 것은 내부 속성이 아니라 객체가 외부에 제공하는 행동이라는 것.

 

 

02. 타입의 계층

1) 타입 사이의 포함관계

- 타입은 객체들의 집합이라서 다른 타입을 포함하는 것이 가능함.

- 타입이 다른 타입에 포함될 수 있기 때문에 동일한 인스턴스가 하나 이상의 타입으로 분류되는 것도 가능함.

- 포함하는 타입은 외연 관점에서는 더 크고 내연 관점에서는 더 일반적이다. => 포함 관계로 연결된 타입 사이에 개념적으로일반화와 특수화 관계가 존재한다는 것을 의미

 

- 슈퍼타입 : 타입 계층을 구성하는 두 타입 간의 관계에서 더 일반적인 타입

- 서브타입 : 더 특수한 타입

 

- 내연의 관점에서 특수한 타입의 정의는 일반적인 타입의 정의를 좀 더 구체화한 것.

- 외연의 관점에서 일반적인 타입의 인스턴스 집합은 특수한 타입의 인스턴스 집합을 포함하는 슈퍼셋이다.

 

2) 객체지향 프로그래밍과 타입 계층

- 슈퍼타입이란 서브타입이 정의한 퍼블릭 인터페이스를 일반화시켜 상대적으로 범용적이고 넓은 의미로 정의한 것.

- 서브타입이란 슈퍼타입이 정의한 퍼블릭 인터페이스를 특수화시켜 상대적으로 구체적이고 좁은 의미로 정의한 것.

- 서브타입의 인스턴스는 슈퍼타입의 인스턴스로 간주될 수 있다.

 

 

 03. 서브클래싱과 서브타이핑

- 타입을 구현하는 방법은 클래스를 이용하는 것이고 타입 계층을 구현하는 방법은 상속을 이용하는 것.

 

1) 언제 상속을 사용해야 하는가?

- 상속 관계가 is-a 관계를 모델링할 때

- 클라이언트 입장에서 부모 클래스의 타입으로 자식 클래스를 사용해도 무방할 떄

 

2) is-a 관계

- 어떤 타입 S가 다른 타입 T의 일종이라면 당연히 "타입 S는 타입 T다"라고 말할 수 있어야 한다.

- 타입 계층의 의미는 행동이라는 문맥에 따라 달라질 수 있다.

 

3) 행동 호환성

- 타입의 이름 사이에 개념적으로 어떤 연관성이 있다고 하더라도 행동에 연관성이 없다면 is-a 관계를 사용하지 말아야 함.

- 두 타입 사이에 행동이 호환될 경우에만 타입 계층으로 묶어야 한다.

- 호환여부를 판단하는 기준은 클라이언트의 관점이다.

 

 

 

 

 

 

 

 

728x90
반응형