결론먼저보자


객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체가 수행하는 행동이다.


결국. 객체지향에서 중요한 것은 동적으로 변하는 객체의 '상태'와 상태를 변경하는 '행위'다.

클래스는 타입을 구현하기 위해 프로그래밍 언어에서 제공하는 구현 메커니즘일 뿐이다.


나오는 키워드

추상화, 다형성, 캡슐화




<지하철 노선도의 추상화>


지하철 노선도에서 가장 중요한것은 지형을 얼마나 사실적으로 묘사했냐가 아니라

역과 역사이의 연결성을 얼마나 직관적으로 표현했느냐다.


헤리 벡의 지하철 노선도는 불필요한 지형 정보를 제거함으로써

단순함을 달성한 추상화의 훌륭한 예이다.




!! 책에서 정의한 추상화 !!

- 어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해

  특정 절차나 물체를 의도적으로 생략하거나 감춤으로써

  복잡도를 극복하는 방법



복잡성을 다루기 위해 두 차원이 필요하다.

1. 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것

2. 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것


모든 경우에 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화 하는것이라는 점.




<객체지향과 추상화>


ex) 앨리스 장면에 등장하는 많은 트럼프모양의 인간들.

정원사, 병사, 왕과 왕비, 하트 왕, 하트여왕 등등


' 기껏해야 트럼프에 불과해'


앨리스는 모든 객체를 차이점은 무시하고 공통점만을 취해 '트럼프'라는 하나의 개념으로 단순화했다




개념(concept)

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

- 일반적으로 우리가 인식하는 다양한 사물이나 객체를 적용할 수 있는 아이디어나 관념

(concept라고 이해하면 될듯)


개념을 이용하면 객체를 여러그룹으로 분류할 수 있다.


ex) 앨리스는 정원에 존재하는 객체를 '트럼프'와 '토끼'라는 두개의 개념으로 나누고

두 개념에 적합한 객체가 각 그룹에 포함되도록 분류했다.


결과적으로 개념은 공톰점을 기반으로 객체를 분류할 수 있는 일종의 체라고 할 수 있다.



개념이 객체에 적용됐을 때 객체를 개념의 인스턴스라고 한다.


ex)  하트여황은 트럼프

하얀 토끼는 토끼 

라는 개념 그룹의 일원이다. 


하트여왕은 트럼프의 인스턴스

하얀 토끼는 토끼의 인스턴스



개념의 세가지 관점


1. 심볼(sumbol) : 개념을 가리키는 간략한 이름이나 명칭

ex)트럼프


2. 내연(intension) : 개념의 완전한 정의를 나타내며 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 확인할 수 있다 

ex) 몸이 납작하고 손발이 달려있는 등장인물


3. 외연(extension) :  개념에 속하는 모든 객체의 집합(set)

ex) 정원사,병사,신하,왕자와 공주,하트왕,하트여왕 등


개념이 세가지로 구성되어 있다는 것보다

개념을 이용해 객체를 분류할 수 있다는 사실이 더 중요하다.



분류

분류란 객체에 특정한 개념을 적용하는 작업

특정한 객체를 특정한 개념의 객체 집합에 포함시키거나 포함시키지 않는 작업


객체를 어떤 개념으로 분류할지가 객체지향의 품질을 결정한다.


분류는 추상화를 위한 도구다


위에 추상화를 언급했듯이


1. 공통점은 취하고, 차이점을 버리는 일반화를 통해 단순화 하는 것

2. 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거해 단순화 하는것



ex) 앨리스의 트럼프 추상화

앨리스가 트럼프라는 개념으로 묶은 것은 차이점은 다 무시하고 공통점만 취했고

중요하다는 특징 ( 몸이 납작하고, 손 발이 달려있다) 외에 다른 사항들은 이야기를 풀어나가는데 

어떤 도움도 되지 않기 때문에 무시했다.

불필요한 세부 사항을 제거했다고 볼 수 있다.


타입 

타입은 개념이다.

개념이라는 단어가 일상에서 많이 사용하기 때문에 타입이라는 용어로 대체한다.


개념과 타입은 완전히 동일하다.



행동이 우선이다.

객체가 어떤 행동을 하느냐에 따라 객체의 타입이 결정된다. 

객체의 타입은 객체의 내부 표현과는 아무 상관없다.


객체가 다른 객체와 동일한 데이터를 가지고 있더라도, 다른 행동을 한다면 서로 다른 타입으로 분류해야한다.




객체의 타입을 결정하는 것은 객체의 행동뿐이다!




동일한 행동이란 동일한 책임을 의미하며, 동일한 책임이란 동일한 메시지 수신을 의미한다.

따라서, 동일한 타입에 속한 객체는 내부의 데이터 표현방식이 다르더라도 동일한 메시지를 수신하고 처리하지만

내부의 표현방식이 다르기 때문에 동일한 메시지를 처리하는 방식은 서로 다를수 밖에 없다.

이것은 다형성에 의미를 부여한다. (같은 메시지를 수신하지만 다르게 처리)



다형성

동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력

동일한 메시지를 서로 다른 방식으로 처리하기 위해 객체들은 동일한 메시지를 수신할 수 있어야 하기 때문에

결과적으로 다형적인 객체들은 동일한 타입이다.


연관되서 내부 표현방식과 무관하게 

행동만이 고려 대상이라는 것은 외부에 데이터를 감춰야 한다는 것을 의미한다.

이것을 캡슐화라고 한다.


행동에 따라 객체를 분류하기 위해 

객체가 내부적으로 관리하는 데이터가 아니라

객체가 외부에 제공해야 하는 행동을 먼저 생각해야 한다.


이를 위해

객체가 외부에 제공해야 하는 (1)책임을 먼저 결정하고

그 책임을 수행하는데 (2)적합한 데이터를 나중에 결정한 후 

데이터를 책임을 수행하는데 (3)필요한 외부 인터페이스 뒤로 캡슐화 해야한다.


이것이 책임-주도 설계( Responsiblity-Driven Design)

반대되는게 데이터-주도 설계



일반화/특수화 관계


ex) 트럼프는 트럼프 인간을 포괄하는 일반적인 개념

트럼프 인간은 트럼프보다 좀 더 특화된 행동을 하는 특수한 개념


특수한 타입은 일반적인 타입이 할 수 있는 모든 행동을 동일하게 수행할 수 있어야 한다. 


슈퍼타입, 서브타입


일반화(슈퍼타입),특수화(서브타입) 관계의 다른말

일반적으로 서브타입은 슈퍼타입의 행위와 호환되므로 서브타입은 슈퍼타입을 대체할 수 있어야 한다.

트럼프 인간은 트럼프를 대체할 수있다.

(트럼프인간으로 카드칠 수 있겠지)



동적모델, 정적모델

1. 객체가 특점 시점에 구체적으로 어떤 상태를 가지느냐. 이를 객체의 스냅샷 이라고 한다.

실제로 객체가 살아 움직이는 동안 상태가 어떻게 변하고 행동하는지 포작하는 것을 동적모델(dynamic model)이라고 한다.


2. 객체가 가질 수 있는 모든 상태와 모든 행동을 시간에 독립적으로 표현하는것

이런걸 타입모델(type diagram) or 정적모델(static model)


객체지향 프로그래머라면 애플리케이션의 동적인 관점과 정적인 관점을 모두 다뤄야한다.


ex) 객체지향 언어를 이용해 클래스를 작성하는 시점에는 시스템을 정적인 관점에서 접근하는 것

그러나 애플리케이션을 실행해 객체의 상태변경을 추적하고 디버깅하는 동안은 동적인 모델을 탐험하는 것




결론. 

객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체가 수행하는 행동이다.


결국. 객체지향에서 중요한 것은 동적으로 변하는 객체의 '상태'와 상태를 변경하는 '행위'다.

클래스는 타입을 구현하기 위해 프로그래밍 언어에서 제공하는 구현 메커니즘일 뿐이다.


+ Recent posts