Book/객체지향의 사실과 오해

[정리] 객체지향의 사실과 오해 - 3장

따라쟁이개발자 2022. 12. 28. 10:00

03 / 타입과 추상화

트럼프 왕국에 들어선 앨리스는 스페이스 정원사, 클로버 병사, 하트 여왕을 만나게 된다.

앨리스 눈에 이들은 그저 '트럼프'일 뿐이다.

 

앨리스가 이들을 '트럼프'라고 분류하기까지 어떤 의식의 흐름이 있었고

이를 객체지향 세계에 대입하였을 때 어떻게 해석될 수 있는지 설명한다.


추상화를 통한 복잡성 극복

지하철 노선도를 사용하는 목적은 무엇일까?

현실을 반영해서 구불구불한 지형, 불규칙적인 역간 거리를 묘사하는게 좋을까

아니면 현실을 추상화하고 역 간의 연결성에 초점을 맞춰 이해하기 편하게 하는게 좋을까

 

추상화란 현실에서 출발하되 불필요한 부분을 도려내고, 

중요한 사물의 본질을 드러나게 하는 과정이다.

 

추상화를 통해 복잡성을 극복하려면 아래 과정을 거쳐야 한다.

  • 사물들간 공통점은 취하고, 일반화를 통해 단순하게 만들 것
  • 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거하고 단순하게 만들 것

 

객체지향과 추상화

트럼프 왕국에 들어가게 된 앨리스는

스페이스 무늬의 정원사, 클로버 무늬의 병사들, 하트 무늬의 여왕을 만난다.

앨리스는 마음 속으로 생각한다 '기껏해야 트럼프에 불과해'

 

앨리스는 정원사, 병사, 여왕의 차이점을 과감히 무시하고

공통점만을 취해 '트럼프' 라고 단순화해 버렸다.

 

앨리스가 이들을 '트럼프'라고 그룹지을 수 있었던 건 
이들의 외형적인 생김새와 행동들이 동일했기 때문이다.

+) 여왕 옆의 토끼는 '트럼프'라 칭해지지 않은 이유는
     토끼가 '트럼프'의 특징을 가지고 있지 않았기 때문이다.

 

'트럼프'는 공통점 기반으로 객체를 묶은 개념 의 일종이다.

정원사나 병사, 여왕은 '트럼프' 그룹의 일원인 인스턴스 의 일종이다.

 

개념과 분류는 복잡성을 극복하기 위한 추상화 도구이다.

 

개념

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

인스턴스

개념 그룹의 일원이 되는 객체

 

분류
개념을 이용해 객체를 여러 그룹으로 나누는 것

 

개념의 세 가지 관점

  • 심볼(symbol) : 개념을 가리키는 간략한 이름 또는 명칭 (ex. 트럼프)
  • 내연(intension) : 개념의 완전한 정의. 객체가 개념에 속하는지 여부를 판단할 수 있는 요소
                               (ex. 몸이 납작하고, 양 손발이 네모 귀퉁이에 달려있다.)
  • 외연(extension) : 개념에 속하는 모든 객체의 집합 (ex. 트럼프 왕국의 정원사, 병사 등)

 

타입

객체의 타입은 개념과 같다

전통적인 데이터 타입과 객체의 타입을 연관지어 볼 필요가 있다.

 

데이터 타입

  • 데이터가 어떻게 사용될 값인지에 따라 분류된 것 (ex. int, string ..)
  • 데이터 타입이 어떻게 구현되었는지 우리는 알 필요 없다.

 

객체 타입

  • 객체를 선언하는 것은 새로운 데이터 타입을 선언하는 것과 같다
  • 객체는 수행하는 행동에 따라 분류되어야 한다. (상태는 행위에 따라 변할 수 있기 때문에)
  • 객체의 내부 표현은 외부에 노출될 필요 없다. 철저히 숨겨져야 한다 (객체의 캡슐화)
  • 동일 메시지 요청을 동일하게 처리하지만 내부 구현이 다를 수 있다. (객체의 다형성)

 

타입의 계층

앞서 트럼프 왕국의 인물들을 '트럼프'라고 분류했다.

근데 이들이 정말 '트럼프' 가 맞는가? 정확하게는 '트럼프 인간' 이라고 하는게 맞을 것이다.

 

'트럼프'는 몸이 납작하고, 앞 뒤 뒤집을 수 있지만 걸어다닐 수 는 없다.

'트럼프 인간'은 '트럼프' 의 일종이지만 걷기라는 좀 더 특화된 행동을 보인다.

 

트럼프 집합 안에서 '트럼프'는 일반화된 개념, '트럼프 인간'은 특수화된 개념이라고 볼 수 있다.

일반화(generalization) 특수화(specialization)에 비해 더 포괄적인 개념이다.

객체 타입에도 이러한 계층 관계가 존재한다.

 

슈퍼타입(supertype) / 서브타입(subtype)

  • 슈퍼타입은 일반화된 타입, 서브타입은 슈퍼타입의 특수화된 타입
  • 서브타입이 슈퍼타입에 속하기 위해선 행위적 호환성을 만족시켜야 한다.

앨리스는 트럼프 왕국의 인물들을 '트럼프 인간'이라는 개념으로 분류했고

이를 조금 더 일반화 시켜 '트럼프'라고 분류했다.

 

일반화는 추상화를 위한 도구이다.

 

 

정적 모델

객체지향 세계에서 객체는 시간에 따라 변화하는 동적인 존재다.

이들을 그대로 이해하고 분석하기엔 너무 복잡하다.

 

그래서 필요한 것이 타입(type)이다.

타입은 동적으로 변하는 객체의 상태를 시간과 무관한 정적인 모습으로 다룰 수 있게 해준다
(ex. 앨리스의 키가 시간에 따라 계속 변하지만, 앨리스가 앨리스로 분류될 수 있었던 것처럼)

 

타입은 추상화이다.

타입을 이용하면 객체의 동적인 특성을 추상화할 수 있다. 

타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화할 수 있는 효과적인 방법이다.

 

클래스

클래스와 타입은 동일한 것이 아니다

클래스는 정적인 모델을 구현할 수 있는 수단이다.

 

객체를 분류하는 기준은 '타입'이며

타입을 나누는 기준은 객체가 수행하는 행동이라는 사실만 기억하자

그리고, 타입을 구현하기 위한 방법으로 클래스가 사용될 뿐이다.