훌륭한 프로그램을 작성하기 위한 중요한 전제 조건은 추상화를 정확하게 다루는 능력이다.
지하철 노선도는 추상화의 대표적인 예시이다.
실제 지형적인 측면을 따져보면 역 간의 거리, 위치는 모두 정확하지 않다.
그럼에도 위와 같은 지하철 노선도가 널리 사용되는 이유는 승객의 목적에 부합하기 때문이다.
승객의 목적은 하나의 역에서 다른 역으로 이동하는 것이다.
즉, 승객이 원하는 것은 어떤 역에서 출발하는지, 어떤 역에서 환승하는지, 어떤 역을 거쳐야 하는지를 알아내는 것이다.
따라서 위 노선도는 승객이 원하는 정보만 제공하는 데 특화되었으며, 목적과 무관한 정보를 제거했다.
추상화를 통한 복잡성 극복
현실은 복잡하다. 법칙은 단순하다. 버릴 게 무엇인지 알아내라. - 리처드 파인만
현실은 복잡하며 예측 불가능한 혼돈의 덩어리다.
문제는 이러한 현실을 그대로 이해하기에는 인간의 인지 능력과 저장 공간이 보잘것없다는 점이다.
따라서 사람들은 본능적으로 이해하기 쉽고 예측 가능한 수준으로 현실을 분해하고 단순화한다.
앞서 이야기한 지하철 노선도도 대표적인 추상화의 한 예이다.
추상화의 목적은 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성을 극복하는 것이다.
단, 추상화는 목적에 부합해야 한다. 추상화의 수준, 이익, 가치는 목적에 의존적이다.
예를 들어, 지하철 노선도가 지형을 판단하려는 사람에게 사용된다면? 이는 추상화라고 할 수 없다.
복잡성을 극복하려면 두 차원에서 추상화가 이루어져야 한다.
- 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것.
- 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것.
객체지향 패러다임은 객체라는 추상화를 통해 복잡성을 극복한다.
그리고 객체지향 패러다임을 이용해 훌륭한 애플리케이션을 개발하기 위한 첫걸음은
추상화의 두 차원을 올바르게 이해하고 적용하는 것이다.
객체지향과 추상화
이상한 나라의 엘리스에서 엘리스는 트럼프 병사들을 모두 '트럼프'라고 칭했다.
세세하게 분류하면 정원사, 병사, 신하, 왕자와 공주, 하객 등 트럼프도 종류가 여럿이지만, 단순히 '트럼프'로 그룹화했다.
이는 불필요한 차이점을 의도적으로 무시하고 공통점만을 강조한것이다.
객체지향 패러다임에서도 마찬가지이다.
구체적이고 실제적인 객체가 존재하지만 수많은 객체를 개별단위로 취급하기는 불가능하다.
따라서 사람들은 본능적으로 공통적인 특성을 기준으로 객체를 여러 그룹으로 묶어 상황을 단순화한다.
이처럼 공통점을 기반으로 객체들을 묶기 위한 그릇을 개념이라고 한다.
트럼프 정원사, 병사, 신하.. 등은 모두 '트럼프'라는 개념을 가지고 있다.
개념을 이용하면 객체를 여러 그룹으로 분류할 수 있다.
개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴스라고 한다.
일반적으로 객체의 분류 장치로서 개념을 이야기할 때는 아래의 세 가지 관점을 함께 이야기한다.
- 심볼(symbol): 개념을 가리키는 간략한 이름이나 명칭
- 내연(intension): 개념의 완전한 정의를 나타내며 내연을 통해 객체가 개념에 속하는지 확인 가능
- 외연(extension): 개념에 속하는 모든 객체의 집합
트럼프에 위 세 가지 관점을 적용하면,
심볼 -> 트럼프
내연 -> 납작 엎드릴 수 있고, 뒤집어질 수 있으며 .. 몸이 종이처럼 구성된다.
외연 -> 트럼프 정원사, 트럼프 병사, 트럼프 신하 등
분류
개념을 이용하면 객체를 분류할 수 있다.
분류란 특정한 객체를 특정한 개념의 객체 집합에 포함시키거나 포함시키지 않는 작업을 의미한다.
분류는 객체지향 설계의 품질을 결정짓는다.
적절한 분류는 유지보수에 용이하고 변화에 쉽게 대처하며, 더 중요한 것은 애플리케이션을 다루는 개발자의 머릿속에
객체를 쉽게 찾고 조작할 수 있는 정신적인 지도를 제공한다는 것이다.
분류는 추상화를 위한 도구다.
추상화는 두 가지 차원에서 이루어져야 한다고 했다. 1. 공통점 취합, 2. 불필요한 부분 제거.
분류는 위 두 가지 차원을 모두 사용한다.
타입
개념은 일상적인 용어다.
공학자들은 현업에서 타입이라는 용어를 사용한다.
개념과 타입은 완전히 동일한 의미를 가진다.
'데이터 타입'도 타입의 한 종류이다.
컴퓨터 메모리에는 0과 1만 존재한다. 이들에게 의미를 부여하는 것은 데이터 타입의 역할이다.
데이터 타입에 따라 소수, 정수, 문자열이 되기도 한다. 같은 비트 시퀀스라도 말이다.
이런 점에서 데이터 타입은 다음 두 가지 특성을 가진다.
- 데이터 타입은 데이터가 어떻게 사용되느냐에 관한 것이다. 중요한 것은 어떤 데이터에 어떤 연산자가 적용되느냐가 그 데이터 타입을 결정한다는 점이다.
- 데이터 타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부로부터 철저하게 감춰진다.
데이터 타입과 객체지향의 타입은 깊은 상관관계를 가진다.
위 내용을 객체지향에 적용하면 아래와 같다.
- 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.
- 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다.
객체는 행동이 우선이다. 행동에 따라 타입이 결정된다.
내부 표현이 다르지만 행동이 같다면 동일한 타입이다. 객체가 어떤 데이터를 보유하는지는 중요하지 않다.
이것은 다형성의 기초 원리가 된다.
타입의 계층
타입은 계층 구조를 가질 수 있다.
앞서 이상한 나라의 엘리스 예시에서 신하 트럼프, 병사 트럼프, 왕비 트럼프 등은 '트럼프'로 분류될 수도 있지만,
'트럼프 인간'으로 분류될 수도 있다.
또한 '트럼프 인간'은 '트럼프'로 분류될 수 있다.
타입은 이처럼 계층 구조를 가질 수 있고, 계층 사이의 관계를 일반화/특수화 관계라고 한다.
일반화: 더 포괄적인 개념
특수화: 더 특수적인 개념
트럼프와 트럼프 인간을 예로 들면, 트럼프 인간은 트럼프를 특수화한 것이고, 트럼프는 트럼프 인간을 일반화한 것이다.
일반화/특수화 관계는 좀 더 일반적인 타입과 좀 더 특수한 한 타입 간의 관계다.
이때 조금 더 일반적인 타입을 슈퍼타입, 조금 더 특수한 타입을 서브타입이라고 한다.
중요한 것은 슈퍼타입/서브타입, 일반화/특수화는 행동에 의해 결정된다는 것이다.
객체지향 패러다임에서는 대부분의 경우 분류와 일반화/특수화 기법을 동시에 적용한다.
타입의 목적
객체만 다루면 되지, 왜 타입을 사용해야 하는가?
인간의 인지능력으로는 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기 어렵기 때문이다.
엘리스는 키가 계속 변화했다.
그렇지만 엘리스는 엘리스다. 엘리스라는 식별자는 유지된다.
엘리스의 상태는 동적으로 변하지만 타입은 엘리스의 상태를 시간과 무관한 정적인 모습으로 다룰 수 있게 해준다.
이런 관점에서 타입도 추상화다.
불필요한 시간이라는 요소와 상태 변화를 제거하고 정적인 관점에서 객체를 바라본다.
그러나 좋은 객체지향 설계를 위해선 동적 모델과 객체를 추상화한 타입 관점의 정적 모델을 적절히 혼용해야 한다.
클래스를 작성하는 것은 정적이지만, 디버깅을 통해 객체 상태를 추적하는 것은 동적인 것처럼 말이다.
'객체지향' 카테고리의 다른 글
[객체지향의 사실과 오해] 6장: 객체 지도 (0) | 2023.02.23 |
---|---|
[객체지향의 사실과 오해] 5장: 책임과 메세지 (0) | 2023.01.14 |
[객체지향의 사실과 오해] 4장: 역할, 책임, 협력 (0) | 2023.01.13 |
[객체지향의 사실과 오해] 2장: 이상한 나라의 객체 (0) | 2023.01.11 |
[객체지향의 사실과 오해] 1장: 협력하는 객체들의 공동체 (0) | 2023.01.10 |