컴퓨터를 조작하는 것이 추상화를 구축하고, 조작하고 추론하는 것에 관한 모든 것임을 깨닫고 나면 프로그래밍하기 위한 가장 중요한 전제 조건은 추상화를 정확하게 다루는 능력이다. - 키스 데블린
지하철 노선도는 과거에는 지형의 위치와 역사이의 관계를 고려한 지도로 제작되었다. 그러나 그런 지하철 노선도의 문제점은 역 사이의 빈공간이 많이 발생하고 지도가 커지고 복잡해진다. 실질적인 역의 좌표와 역 사이 간격 모두 고려했기 때문이다.
이 노선도(책에서는 영국 노선도를 예로 들고 있다) 는 서울 특별시 지도에 맞춤 제작된 노선도이다. 이 노선도의 장점은 실제 역이 지도의 어느상에 위치해 있는지 쉽게 알 수 있다. 그러나 문제점은 특정 부근에 역들이 많이 몰려있고 역의 실제 위치는 한 눈에 볼 수 있지만 정작 중요한 역 간의 관계를 보기는 쉽지 않다.
위의 지도와 차이점이 있다면 역의 지도상 위치를 최소한으로 반영하고 역간의 관계에 집중하고 있다. 그렇기에 대체적으로 역간의 간격이 균등한 편이고 지도에 더 많은 정보와 공간을 효율적으로 활용할 수 있다. 대부분 지하철을 이용하는 고객들은 출발역부터 도착역까지의 정거장 수, 그리고 걸리는 시간에 관심이 있기 때문에 위에 노선도에 비해 조금 더 효과적으로 정보를 전달 할 수 있다.
아래의 지도는 실제 지도를 추상화했음을 알 수 있다.
어떤 추상화도 의도된 목적이 아닌 다른 목적으로 사용된다면 오도될 수 있다. 추상화의 수준, 이익, 가치는 목적에 의존적이기 때문이다. - 객체지향의 사실과 오해 책에서
추상화란 현실의 문제나 어떤 현상을 명확히 이해하기 위해서 특정 절차 또는 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다. 추상화 문제는 노선도 뿐만 아니라 우리 일상생활에서도 흔히 이루어진다. 예를 들면 수학에서 배우는 선형대수학도 이에 해당한다. 현실에 선형은 없다. 그러나 시간과, 시스템에 관계 없는 여러 변수들을 제거하면 어떤 현상과 시스템을 선형적으로 바라볼 수 있게 된다. 프로그래밍에서도 복잡성을 다루기 위한 추상화를 2가지 차원으로 설명한다.
사물들 간의 공통점
은 취하되 차이점은 버리는 일반화
를 통해 단순하게 만드는 작업중요한 부분을 강조
하기 위해 불필요한 세부 사항을 제거
1번과 2번 차원은 비슷하게 의미로 다가오지만 목적의 차이가 있다. 1번은 공통점을 그룹으로 묶는 작업 2번은 우리가 해결하고자 하는 소프트웨어 영역의 문제에 집중하기위해 불필요한 영역을 제거하는 작업이다. 어떻게 보면 이 작업이 도메인을 설계하는 작업과 비슷하다고 생각하는데 정말 어렵기 때문에 도메인 전문가가 따로 있는 것이 아닌가 싶다.
아름다운 정원에 들어선 엘리스는 정원사를 마주쳤다. 정원사는 트럼프처럼 생겼고 스페이드 무늬가 그려져 있다. 엘리스는 처음보는 정원사와 이야기하던 중 하트 여왕이 정원에 들어섰다. 그 때 동시에 세명의 정원사는 땅바닥에 얼굴이 닿을 정도로 넙죽 엎드렸다. 행렬 맨 앞에는 클로버를 든 열 명의 병사들이 행진하고 그 들 모두 정원사와 마찬가지로 네모난 몸 모서리에 팔 다리가 달려 있었다. 그 뒤로 다이아몬드로 치장한 신하들이 열 지어 들어오고 그 뒤로 하트 여왕과 하트 왕 모습이 드러났다. 토끼도 보였다.
엘리스는 그들을 보고 다음과 같이 마음속으로 속삭였다.
'기껏해야 트럼프니 무서워 할 필요 없어'
좀 더 자세한 이야기가 듣고 싶다면 이상한 나라의 엘리스나 객체지향의 사실과 오해를 사서 읽어보자 ...
여기서 중요한 점은 정원에 들어선 엘리스가 정원사와 병사, 그리고 하트 여왕과 왕을 보았을 때 그들을 트럼프
로 분류했다는 것이다. 그가 그들 트럼프
로 분류 한 것은 그들간의 유사성을 하나로 묶어 추상화했음을 알 수 있다.
엘리스는 정원 안의 인물을 트럼프로 분류했는데 객체지향에서 그들을 분류할 수 있는 개념이란 무엇일까?
개념은 크게 3가지 관점에서 볼 수 있다.
이상한 나라의 예제를 통해 3가지 관점을 이해해보면 다음과 같다.
엘리스가 마음속으로 이야기한 '기껏해야 트럼프'라는 말 중 '트럼프'는 심볼이 된다.
내연은 엘리스 이야기에서 몸이 납작하고 두 손, 두 발이 모두 네모난 몸 모서리에 달려있다는 트럼프에 대한 설명이다. 내연은 개념을 객체에 적용할 수 있는지에 대한 여부를 판단하기 위한 것이다.
토끼는 이에 만족하지 않으므로 트럼프가 될 수 없다.
마지막으로 외연은 개념이 속한 객체들, 즉 개념의 인스턴스들의 집합이라 할 수 있다. 예를 들면 정원사, 병사, 신하, 하트 여왕과 왕등이 외연을 구성하는 객체 집합이라 볼 수 있다.
위의 개념을 정리해서 표현하면 다음고 같다.
우리는 이 3가지 개념의 관점을 통해 객체에 적용할 개념을 분류할 수 있다.
우리는 해당 객체가 내부적으로 어떤 상태에 있는지 관심이 없다. 그저 객체가 어떤 행동을 하고 있는지 궁금할 뿐이다. 그렇기에 해당 객체가 다른 객체와 동일한 상태, 동일한 데이터를 가지더라도 서로 다른 행동을 한다면 이는 같은 타입이 아니다. 이는 객체 지향 패러다임 중에 다형성임을 알 수 있다.
같은 타입의 객체여도 내부 데이터는 다를 수 있다.
이를 정리하면 다음과 같다.
같은 타입이지만 다른 객체라는 의미는 내부적은 데이터는 다르지만 동일한 개념을 가지고 행동하는 객체임을 알 수 있다.
일반화와 특수화는 '외연'에 관련된 내용이다. 이상한 나라에서 정원사와 병사, 하트여왕의 타입을 분석하면 다음과 같다.
행동을 기준으로 집합을 구성해보면 트럼프 인간의 행동은 트럼프의 행동과 중복되는 부분이 존재하고 트럼프의 행위는 모두 트럼프 인간 행동에 포함됨을 알 수 있다. 앞서서 우리는 추상화 차원 중 공통 그룹을 묶어서 단순화하는 차원을 이야기한 적이 있다. 이를 여기에 적용해보면 트럼프의 특성은 해당 예제에서 공통 부분을 묶어서 추상화한 것임을 알 수 있다. 우리는 이를 트럼프 인간의 일반화
라 하고 그 반대를 특수화
라고 한다. 보통 이를 하나로 묶어 트럼프 - 트럼프 인간
관계를 일반화 - 특수화
관계라 말한다.
이를 다르게 표현하면 트럼프 타입을 Super Type, 트럼프 인간 타입을 Sub Type이라 부른다.
타입이 중요한 이유는 개념을 이용해 객체를 분류하고 정의한다는 점도 있지만 다른 이유도 있다. 바로 타입을 이용해 추상화하는 과정에서 시간과 같은 불필요한 작업을 제거해 동적인 모델을 정적인 모델로 만드는 것이다. 동적 모델은 시간과 객체의 행동에 따라 객체의 상태가 변한다. 그러나 이를 정적인 모델로 바꾸어 시간이 아닌 행동에 따라 상태를 바꾸도록 추상화 할 수 있다.
이 전에 봤던 엘리스의 버섯이야기를 떠올려보자.. 그는 시간에 지남에 따라 버섯을 먹어 키를 늘리고 줄였다. 그러나 우리가 엘리스와 버섯의 타입을 정의할 때 시간이라는 요소를 제거해서 엘리스가 버섯을 먹는 행동을 할 때 상태가 변하도록 추상화했다.
이는 프로그래밍과도 연관이 깊다.
우리는 클래스를 작성하는 시점에 동적으로 모델링을 한다. 그러나 우리가 만든 어플리케이션을 실행하거나 객체의 상태를 추적하는 과정은 동적인 과정으로 시간에 따라 이루어지는 것처럼 보인다. 저자는 프로그래머라면 에플리케이션의 동적인 관점과 정적인 관점을 모두 이해할 수 있어야 한다고 이야기한다.