타입의 계층
트럼프 계층
트럼프는 트럼프 인간을 포괄하는 좀 더 일반적인 개념이다.
트럼프 인간은 트럼프보다 좀 더 특화된 행동을 하는 특수한 개념이다.
이 두 개념 사이의 관계를 일반화/특수화(generalization/specialization)관계라고 한다.
부분 집합
일반화/특수화 관계
일반적이라는 말은 더 포괄적이라는 의미를 내포한다.
특수하다는 것은 일반적인 개념보다 범위가 더 좁다는 것을 의미한다.
객체지향에서는 행동이 중요하다고 했다.
내부의 상태가 더 일반적인지 특수한지가 중요하지 않다.
일반화/특수화 개념을 대입하면 더 일반적인 행동을 하느냐 더 특수한 행동을 하느냐가 될 것이다.
즉, 객체의 일반화/특수화 관계에 있어서도 중요한 것은 객체가 내부에 보관한 데이터가 아니라 객체가 외부에 제공하는 행동이다.
그렇다면 행동의 관점에서 일반적 타입과 특수한 타입은 무엇일까?
일반적 타입이란 특수한 타입이 가진 모든 행동들 중에서 일부 행동만을 가지는 타입이다.
특수한 타입이란 일반적인 타입이 가진 모든 타입을 포함하지만 거기에 더해 자신만의 행동을 추가하는 타입을 가리킨다.
따라서 일반적인 타입은 툭수한 타입보다 더 적은 수의 행동을 가지고
특수한 타입은 일반적인 타입 행동을 포함하며 보다 더 많은 수의 행동을 가진다.
여기서 주의할 점은 타입의 내연을 의미하는 행동의 가짓수와 외연을 의미하는 집합의 크기는 서로 반대라는 사실이다.
일반화/특수화 관계에서 일반적인 타입은 특수한 타입보다 더 적은 수의 행동을 가지지만 더 큰 크기의 외연 집합을 가진다. 특수한 타입은 일반적인 타입보다 더 많은 수의 행동을 가지지만 더 적은 크기의 외연 집합을 가진다.
슈퍼타입과 서브타입
일반화/특수화 관계를 타입으로 바꾼 것
일반적인 타입을 슈퍼타입(Supertype), 특수한 타입을 서브타입(Subtype)이라 한다.
역시나 슈퍼타입과 서브타입에서 중요한 것은 두 타입 간의 관계가 행동에 의해 결정된다는 것이다.
어떤 타입이 다른 타입의 서브타입이 되기 위해서는 행위적 호환성을 만족시켜야 한다.
서브타입은 슈퍼타입을 대체할 수 있어야 한다.
일반화는 추상화를 위한 도구다
추상화 두 번째 원칙, 중요한 부분 강조를 위해 불필요한 세부 사항을 제거해 단순화
일반화/특수화 계층은 두 번째 원칙의 예시가 된다.
거의 대부분의 경우에 분류와 일반화/특수화 기법을 동시에 적용하게 된다.
정적 모델
타입의 목적
인간의 인지 능력으로 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기가 너무 어렵기 때문에 타입을 사용한다.
앨리스가 어떤 음식을 먹을 때 마다 키와 팔,다리 길이가 시시각각 달라진다. 하지만 모든 경우에 앨리스는 단지 앨리스일 뿐이다.
앨리스라고 하는 객체의 상태는 변하지만 앨리스를 다른 객체와 구별할 수 있는 식별성은 동일하게 유지된다.
타입은 시간에 따라 동적으로 변하는 앨리스의 상태를 시간과 무관한 정적인 모습으로 다룰 수 있게 해준다.
아래 그림과 같이 앨리스의 상태에 복잡성을 부과하는 시간이라는 요소를 제거함으로써 시간에 독립적인 정적인 모습으로 앨리스를 생각할 수 있게 해준다.
그래서 결국 타입은 추상화다
어떤 시점에 앨리스에 관해 생각할 때 불필요한 시간이라는 요소와 상태 변화라는 요소를 제거하고 철저하게 정적인 관점에서 앨리스의 모습을 묘사하는 것을 가능하게 해준다.
타입은 추상화다. 타입을 이용하면 객체의 동적인 특성을 추상화할 수 있다. 결국 타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화할 수 있는 효과적인 방법인 것이다.
동적 모델과 정적 모델
객체를 생각할 때 두 가지 모델
첫째, 객체가 특정 시점에 구체적으로 어떤 상태를 가지느냐.
이를 객체의 스냅샷(snapshot)이라고 한다.
UML에서 스냅샷은 객체 다이어그램이라고도 불린다.
스냅샷처럼 실제로 객체가 살아 움직이는 동안 상태가 어떻게 변하고 어떻게 행동하는지를 포착하는 것을 동적 모델(dynamic model)이라고 한다.
둘째, 객체가 가질 수 있는 모든 상태와 모든 행동을 시간에 독립적으로 표현하는 것이다.
이를 타입 모델(type diagram)이라고 한다.
이 모델은 동적으로 변하는 객체의 상태가 아니라 객체가 속한 타입의 정적인 모습을 표현하기 때문에 정적모델(static model)이라 한다.
클래스를 만드는 행위가 정적인 모델링
디버그를 위해 상태 변경을 추적하는 것은 동적 모델링을 탐험하는 것
클래스
객체지향 프로그래밍 언어에서 정적인 모델은 클래스를 이용해 구현된다.
따라서 타입을 구현하는 가장 보편적인 방법은 클래스를 이용하는 것이다.
타입을 구현한다고 표현한 것은 클래스와 타입은 동일한 것이 아니라는 뜻이다.
타입은 객체를 분류하기 위해 사용하는 개념이다.
반면 클래스는 단지 타입을 구현할 수 있는 여러 구현 메커니즘 중 하나일 뿐이다.
실제로 자바스크립트와 같은 프로토타입 기반 언어에는 클래스가 존재하지 않는다.
객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체가 수행하는 행동이다.
객체지향에서 중요한 것은 동적으로 변하는 객체의 상태와 상태를 변경하는 행위다.
클래스는 타입을 구현하기 위해 프로그래밍 언어에서 제공하는 구현 메커니즘이다.