본문 바로가기
스터디

[객체지향의 사실과 오해] 3. 타입과 추상화

by eunoo 2023. 6. 16.

03 타입과 추상화

추상화를 통한 복잡성 극복

추상화는 복잡한 것을 이해하기 쉽게 단순화하는 것이다. 복잡성을 해결하기 위해 추상화는 두 차원에서 이뤄진다.

  1. 사물들 간의 공통점은 뽑고, 차이점은 버리기 (일반화하기)
  2. 중요한 부분을 강조하기 위해 불필요한 세부 사항은 제거하기
객체지향과 추상화

1. 이상한 나라의 트럼프

 

ex) 앨리스에 나오는 등장인물 중 트럼프 모습을 하고 있는 정원사, 병사들, 신하, 왕자와 공주 등이 있다. 이들 모두 객체이다.

2. 추상화하여 그룹화하기

  • 정원사, 병사들, 신하, 왕자와 공주는 '트럼프'라는 공통점을 가지고 있으며, 이들 모두를 트럼프라는 개념으로 단순하게 바라볼 수 있다.
  • 정원사, 병사들, 여왕이라는 차이점은 무시하고, 공통점만 취하여 모두 트럼프라는 그룹으로 묶는다. 하얀 토끼는 토끼라는 그룹으로 묶을 수 있다.

 

3.  개념

위의 예시에서 인물들을 트럼프라는 개념으로 추상화하고 그룹으로 분류했다.

개념이 객체에 적용됐을 때 객체를 개념의 인스턴스라고 한다. (ex)정원사 = 트럼프의 인스턴스, 병사 = 트럼프의 인스턴스)

  • 개념의 세 가지 관점
    1. 심볼 : 개념을 가르키는 명칭 (ex)트럼프)
    2. 내연 : 개념의 정의 (ex)트럼프의 내연 : 몸이 사각형이고 납작하다.)
    3. 외연 : 개념에 속하는 모든 객체의 집합 (ex)트럼프의 외연 : 정원사, 병사, 왕자와 공주 등)
  • 개념을 이용해서 객체를 분류하는 건 추상화의 두 차원을 모두 사용한다.
    • 트럼프라는 개념은 차이점은 버리고, 공통점만 취하여 일반화했다.
    • 트럼프라는 개념은 중요한 특징인 ''몸이 사각형이고 납작하다"에만 집중하고, 그 외의 불필요한 사항은 제거했다.

 

타입
  • 타입=개념
  • 객체와 타입
    • 객체가 어떤 타입에 속하는지 결정하는 것은 객체의 행동이다.
    • 객체의 내부는 외부로부터 감춰진다. 
  • 다형성
    • 같은 타입에 속한 객체의 행동은 동일하지만 다른 데이터를 가질 수 있다. 즉, 내부의 상태는 다르더라도 동일한 메시지를 수신하고 처리할 수 있다.
    • 정리하자면 같은 타입에 속한 객체는 동일한 요청에 대해 서로 다른 방식으로 처리할 수 있다. 이를 다형성이라고 한다.

  • 캡슐화
    • 행동만을 외부에 노출하고 데이터는 내부로 감춘다.
  •  
타입의 계층

객체가 동일한 타입으로 분류되기 위해선 공통의 행동을 가져야 한다고 했다. 안타깝게도 앞의 예시에서 말한 등장인물은 트럼프와 유사하지만 행동은 트럼프와 동일하지 않다.

트럼프의 내연은 '몸이 사각형이고 납작하다'이지만 걸어다닐 순 없다. 따라서 트럼프 인간이라는 타입으로 분류해야 한다.

트럼프는 트럼프 인간을 포괄하는 일반적인 개념이며, 트럼프 인간은 트럼프보다 좀 더 특화된 행동을 하는 특수한 개념이다.

 

  • 일반화/특수화 관계
    • 트럼프는 트럼프 인간을 포괄하는 일반적인 개념이며, 트럼프 인간은 트럼프보다 좀 더 특화된 행동을 하는 특수한 개념이다.
    • 트럼프 : 일반화, 트럼프 인간 : 특수화
  • 슈퍼타입과 서브타입
    • 일반적인 타입을 슈퍼 타입, 특수한 타입을 서브 타입이라고 한다. 서브 타입은 슈퍼타입을 대체할 수 있다.
  • 일반화 역시 추상화를 사용한다
    • 트럼프 인간 : 공통점만 취하고, 차이점은 제거했다.
    • 트럼프 : 트럼프 인간을 더 단순하게 일반화했다.

 

정적 모델

타입은 동적으로 변하는 앨리스의 상태와 무관하게 정적인 모습으로 만들어준다.

  • 타입은 추상화를 사용한다. 타입을 이용하면 객체의 동적인 특성을 추상화할 수 있다.
  • 객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체의 행동이다. 타입을 구현할 수 있는 한 가지 방법이 클래스다.

 

마무리

이 장을 통해서 객체 설계 시 객체의 행동을 추상화하여 타입을 결정하고, 타입을 기준으로 객체를 분류한다는 것을 알게 되었다. 다시 말하자면, 객체지향 패러다임에서는 동적인 객체들추상화하여 정적타입으로 만든다. 또 그 타입은 일반화하여 슈퍼 타입, 특수화하여 서브 타입으로 나눌 수 있다.

중요한 건 객체들의 다양한 행동들을 어떻게 추상화할 것인지이다. 이건 직접 객체 설계를 해보며 부딪혀봐야 알 수 있을 것 같다. 어쨌든 책에서 계속 강조하는 '항상 상태는 숨기고 행동을 기준으로 설계해야 한다'를 기억하자. 

댓글