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

순서18·2023년 3월 6일
0

목록 보기
4/4

지하철 노선도의 핵심은 지도가 당연히 가져야 한다고 생각되는 '정확성'을 버리고 그 '목적'에 집중한 결과다.

"지형은 중요한 것이 아니다. 중요한 것은 연결, 즉 열차를 갈아타는 것이다."


추상화를 통한 복잡성 극복

추상화는 어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다.
추상화는 두 차원에서 이뤄진다.

1. 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만들기
2. 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만들기


객체지향과 추상화

앨리스는 목이 잘려 나갈까 두려워 바들바들 떨고 있는 3명의 정원사, 행렬의 맨 앞에 선 클로버 병사들, 신하들, 공주와 왕자, 하객으로 등장하는 왕과 왕비들을 보고

'기껏해야 트럼프에 불과해. 무서워할 필요 없어.'

라고 말한다.

앨리스는 하얀 토끼를 제외한 모든 객체들을 차이점은 과감하게 무시한 채 공통점만을 취해 '트럼프'라는 하나의 개념으로 단순화해서 바라본다.

이처럼 공통점을 기반으로 객체들을 묶기 위한 그릇을 개념(concept)라고 한다.

ex)
길거리를 빠른 속도로 누비는 교통수단 => 자동차
하늘을 나는 교통수단 => 비행기

개념의 세 가지 관점

  1. 심볼(symbol): 개념을 가리키는 간략한 이름이나 명칭
  2. 내연(intension): 개념의 완전한 정의를 나타내며 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 확인할 수 있다.
  3. 외연(extension): 개념에 속하는 모든 객체의 집합(set)

앨리스 이야기에서의

심볼: '트럼프'
내연: '몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있다.'
외연: 정원사, 병사, 신하, 왕자와 공주, 왕과 여왕 ,,,

개념을 구성하는 심볼, 내연, 외연은 객체의 분류 방식에 대한 지침을 제공한다.

타입

타입은 개념이다.

타입은 개념과 동일하다. 타입은 공통점을 기반으로 객체들을 묶기 위한 틀이다. 타입은 개념과 마찬가지로 심볼, 내연, 외연을 이용해 서술할 수 있고 타입에 속하는 객체 역시 타입의 인스턴스라고 한다.

<타입>
1. 숫자형 데이터가 숫자형인 이유는 데이터를 더하거나 빼거나 곱하거나 나눌 수 있기 때문이다. 어떤 데이터가 문자열형인 이유는 두 데이터를 연결해 새로운 문자열을 만들 수 있고 데이터에 포함된 문자의 길이를 알 수 있기 때문이다. 데이터의 타입을 정하는 것은 데이터에 적용할 수 있는 작업이다.
2. 데이터 타입의 표현은 연산 작업을 수행하기에 가장 효과적인 형태가 선택되며, 개발자는 해당 데이터 타입의 표현 방식을 몰라도 데이터를 사용하는 데 지장이 없다. 숫자형 데이터에 적용할 수 있는 산술 연산자를 알고 있다면 메모리 내부에 숫자가 어떤 방식으로 저장되는지를 모르더라도 숫자형 데이터를 사용할 수 있다.

<객체>
1. 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다. 어떤 객체들이 동일한 행동을 수행할 수 있다면 그 객체들은 동일한 타입으로 분류될 수 있다.
2. 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다. 객체의 행동을 가장 효과적으로 수행할 수만 있다면 객체 내부의 상태를 어떤 방식으로 표현하더라도 무방하다.

두 설명을 비교해보자.

행동이 우선이다

동일한 책임을 수행하는 일련의 객체는 동일한 타입에 속한다.
동일한 타입에 속한 객체는 내부의 데이터 표현 방식이 다르더라도 동일한 메시지를 수신하고 이를 처리할 수 있다.
내부의 표현 방식이 다르기 때문에 동일한 메시지를 처리하는 방식은 서로 다를 수밖에 없는데 이것은 다형성에 의미를 부여한다.

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

다형적인 객체들은 동일한 타입에 속한다!

객체의 내부 표현 방식과 무관하게 행동만이 고려 대상이라는 사실은 외부에 데이터를 감춰야 한다는 것을 의미한다.

"캡슐화"
외부에 행동만을 제공하고 데이터는 행동 뒤로 감춰야 한다.

행동에 따라 객체를 분류하기 위해서는 객체가 내부적으로 관리해야하는 데이터가 아니라 객체가 외부에 제공해야 하는 행동을 먼저 생각해야 한다.


동적 모델과 정적 모델

동적 모델 스냅샷처럼 실제로 객체가 살아 움직이는 동안 상태가 어떻게 변하고 어떻게 행동하는지를 포착하는 것

타입/정적 모델: 객체가 가질 수 있는 모든 상태와 모든 행동을 시간에 독립적으로 표현하는 것

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

<->

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

0개의 댓글