본문 바로가기

책, 강의 정리/객체지향의 사실과 오해

객체지향의 사실과 오해 - 3장(타입과 추상화)

3장 타입과 추상화

추상화

사실보다는 직관성에, 정확성보다는 목적에 집중하여

진정한 의미의 추상화란 현실에서 출발하되, 불필요한 부분은 도려내가면서 사물의 본질을 드러나게하는 과정을 말한다. 중요한 것은 목적에 부합하는 것이다.

 

1. 공통점은 취하고 차이점은 버린다 -> 일반화와 이어진다.

2. 중요한 부분을 강조하기 위해 세부사항을 제거한다.

 

예를들어, 자동차, 자전거, 버스, 지하철의 공통점은 "이동수단"이라는 것이다. 바퀴 수, 속도 등 불필요한 것은 도려내고 "이동한다"는 본질만 생각한 "이동수단"이 추상화의 결과라고 볼 수 있다.

 

객체지향 패러다임에서의 객체

명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물

 

개념(Concept)

 

객체에 어떤 개념을 적용하는 것이 가능해서 어떤 객체가 그 개념 그룹의 일원이 될 때 그 객체를 인스턴스라고 한다. 

자동차에 "바퀴가 네개있고, 도로에서 달릴 수 있는 사물"이라는 개념을 적용하면 A 자동차, B 자동차 인스턴스는 자동차 객체의 일원이라는 의미이다. 

 

단순하게 개념은,

1. 공통점을 기반으로 객체들을 묶기 위한 그릇

2. 이 개념을 통해 분류가 가능해진다.

 

개념을 구성하는 요소

1. Symbol: 명칭

2. intension(내연): 정의

3. extension(외연): Set. 외부에서 바라보는 집합

 

객체에 어떤 개념을 적용할 것인지를 결정하는 것은 개념에 따라 분류하는 것과 동일하다. 즉, 여러 대의 자동차와 버스, 자전거가 섞여있을 때 "바퀴가 네개 달린 달릴 수 있는 사물", "바퀴가 네개 달리고, 많은 사람이 탈 수 있는 사물", "바퀴가 두개 달리고 속도가 느린 달릴 수 있는 사물"의 개념에 따라 각각을 자동차, 버스, 자전거 집단으로 분류할 수 있다.

 

 

객체를 잘 분류하는 것은 객체를 쉽게 찾고 조작할 수 있게하기 때문에 객체지향의 품질을 결정하는 중요한 요소이다. 예를 들어, 바리스타, 카페 사장이 커피를 만들 수 있고 "CoffeeMaker"라는 객체로 추상화된다고 가정하자. 커피 만드는 방식이 변경될 일이 생긴다면, 커피를 만들 수 있다고 분류된 "CoffeMaker", 바리스타, 카페사장 객체를 조작하면 된다. 

 

 

타입

1. 어떤 데이터에 어떤 연산자를 적용할 수 있는지 -> 곱셈, 나눗셈이 가능한건 "수 타입"

2.타입에 속한 데이터는 메모리에 어떻게 표현되는지 외부로부터 감춰진다.(캡슐화) -> int가, long이 몇비트고 어떻게 표현되는지는 모른다.

 

 

이것을 객체에 적용하면?

1. 어떤 객체가 어떤 타입에 속하는지 결정하는 것은 객체가 수행하는 행동이다.

2. 객체의 내부적 표현은 외부로부터 감춰진다.

 

 

동일한 행동 = 동일한 책임 = 동일한 메시지 수신(이지만 처리하는 방법은 다를 수 있음 -> 다형성)

 

 

일반화와 특수화

1. 일반화(Supertype): 불필요한 부분은 제거하고 중요한 부분만 노출하는 것이다.

2. 특수화(Subtype): Supertype을 대체할 수 있어야 한다.

 

특수화가 일반화보다 행동의 수는 많고 외연의 크기는 작다. 일반화의 모든 행동 + Subtype 만의 행동을 가지기 때문이다. 외연의 크기가 작다는 말은 이동수단 > 자동차로 이해하면 쉽다.

 

또, 타입을 통해 객체를 정적화 할 수 있다. 동적으로 변하는 상태를 무시하고 변한다는 그 사실정도만 인지하자. 자동차는 계속해서 움직이기 때문에 그 상태가 매우 복잡하게 변한다. 하지만 Car 라는 타입으로 정적화함으로써 "움직인다"라는 사실만 인지하며 단순하게 표현할 수 있다.

 

 

그렇다고 클래스 = 타입이라는 뜻은 아니다. 클래스는 타입을 구현하는 수단일 뿐이다.