본문 바로가기
👨‍👩‍👦‍👦 OOP

📔 타입과 추상화 (객사오 3장)

by kukim 2021. 11. 21.

추상화를 통한 복잡성 극복

과거 지하철 노선도는 실제 지도와 1:1 매칭 되었지만 이해하기 어려웠다.

하지만 해리 벡은 승객이 알아야 할 사실(열차 타는 곳)의 정보만 추상화하여 현실의 복잡성을 단순화했다. 실제 역의 거리와 위치는 달랐지만 목적지와 방향을 쉽게 알 수 있었고 이는 현대의 대표적인 지하철 노선도가 되었다.

왼쪽(추상화 전) - 런던 지하철 노선도(1927) / 오른쪽(추상화 후) - 해리 벡의 노선도(1933) (출처: 교육부 블로그 이상한 지하철 노선도)

 

객체지향과 추상화

객체지향 패러다임도 마찬가지이다. 객체라는 추상화를 통해 현실의 복잡성을 극복한다.

객체 간의 공통점을 일반화하고, 불필요한 세부 사항을 제거해 단순화한다.

타입

컴퓨터는 0,1 비트로 되어있다. 얼핏 보면 랜덤 한 숫자 같지만 데이터를 목적에 따라 분류하고 타입 시스템이 시작됐다. 1) 어떤 데이터에 어떤 연산자를 적용하느냐에 따라 그 데이터 타입이 결정되고, 2) 사용자는 실제로 메모리에 0,1 비트로 표현되는지 몰라도 타입을 손쉽게 사용할 수 있다. 예를 들어 정수형 데이터를 int num = 4; 로 표현하여 사용할 수 있고 산술 연산을 적용할 수 있다. 언어마다 정수형 4를 표현하는 비트는 다르겠지만 사용자는 손쉽게 쓸 수 있다.

객체지향에서도 객체를 일종의 데이터처럼 사용한다. 객체를 타입에 따라 분류하고 그 타입에 이름을 붙여 사용하는 것이 객체를 데이터 타입을 선언하는 것과 같다. 하지만 객체는 데이터가 아니다. 데이터 타입과 유사한 점은 1) 객체가 어떤 타입에 속하는지는 연산자가 아닌 수행하는 행동에 따라 객체가 결정되고, 2) 객체의 내부적인 표현은 감춰진다(캡슐화). 다시 말하자면 객체가 다른 객체와 동일한 데이터를 가지고 있더라도 다른 행동을 한다면 서로 다른 타입으로 분류돼야 한다. 객체의 타입을 결정하는 것은 행동이다. 데이터는 단지 행동을 따를 뿐이다.

이는 책임-주도 설계 방법이다. 데이터를 먼저 생각하는 데이터-주도 설계와는 다르다. 

타입의 계층

타입과 타입 사이에는 계층이 있다. 계층을 두 가지로 나눈다. 일반화/슈퍼 타입(Supertype)과 특수화/서브타입(Subtype) 슈퍼 타입과 서브타입의 관계는 행동에 의해 결정된다.

예를 들어 새(bird)는 일반화, 슈퍼 타입이다. 날개가 있고 부리가 있다. duck(오리), cuckoo(뻐꾸기), ostrich(타조)는 새의 슈퍼 타입이다. 새보다 좀 더 특수한 특징이 있다.

슈퍼 타입을 상단에, 서브타입을 하단에 두며 빈 삼각형으로 연결해 표현한다. 서브타입은 슈퍼 타입에 추가적으로 자신만의 특수한 행동이 있다. 슈퍼 타입의 행동은 서브타입에게 자동으로 상속된다.

https://en.wikipedia.org/wiki/Subtyping (출처: 위키)

정적 모델

상태와 행동을 시간에 독립적으로 표현한 것을 '타입 모델(type diagram)', 정적 모델(static model)이라고 한다.

특정 시점에 구체적으로 어떤 상태를 가지느냐는 스냅샷(snapshot), 객체 다이어그램(object diagram), 동적모델(dynamic model)이라고 한다.

정적 모델은 클래스를 이용해 구현한다.

다시 말하지만 클래스는 객체가 아니다. 객체지향에서 중요한 것은 동적으로 변하는 객체의 '상태'와 상태를 변경하는 '행동'이다. 클래스는 타입, 객체를 구현하기 위해 프로그래밍 언어에서 제공하는 구현 메커니즘일 뿐이다.


요약

인간은 추상화를 통해 복잡한 정보를 일반화한다. 객체도 마찬가지이다. 복잡해 보이는 타입을 묶고 그룹 지어 생각한다. 다만 객체지향은 데이터를 중심이 아닌 행동, 책임을 중심으로 추상화한다. 객체 간 추상화는 타입으로 표현할 수 있고 타입은 슈퍼 타입, 하위 타입으로 표현할 수 있다.

댓글