[Chap 03] 타입과 추상화
추상화를 통한 복잡성 극복
위 두 사진을 보면 서울의 지형을 그대로 반영한 지하철 노선도와 실제 지형을 단순화한 지하철 노선도를 볼 수 있다. 실제로 지하철 노선도를 확인하는 사람들의 목적은 다음역이 어딘지이기 얼마나 오래걸리는지 거리를 보지는 않는다.
그렇기 때문에 두 번째 사진이 좀더 승객들의 목적에 맞게 현실을 단순화했다고 할 수 있다.
이처럼 진정한 의미에서 추상화란 현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정이라고 할 수 있다.
두 번째 사진의 지하철 노선도를 통해서 지상에서 다음 역을 찾기 위한 지도로는 쓰일 수 없다. 실제 거리를 알고자 하는데는 적절하지 않기 때문이다. 이처럼 어떤 추상화도 의도된 목적이 아닌 다른 목적으로 사용된다면 오도될 수 있다.
객체지향과 추상화
위 그림에서는 클로버 병사들, 신하들, 공주와 왕자, 하객으로 등장하는 왕과 왕비들이 존재한다. 하얀 토끼도 존재한다. 이 장면에서 다양한 객체들이 존재하는데 앨리스는 이런 대사를 한다.
기껏해야 트럼프에 불과해. 무서워할 필요 없어.
이 문장에서 의미하는 것은 클로버 병사들, 신하들, 공주와 왕자, 하객으로 등장하는 왕과 왕비를 모두 트럼프 라고 표현을 한 것이다. 물론 토끼는 트럼프에 포함되지 않는다.
여기서 트럼프라고 묶인 존재들은 트럼프라고 할 때의 일반적인 외형과 행동 방식을 지니고 있다. 예를 들면 몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있다.
앨리스는 인물들의 차이점을 무시하고 공통점만을 위해 트럼프라는 개념으로 단순화한 것은 추상화의 일종이다. 그렇다면 여기서 개념 은 구체적으로 무슨 뜻을 가지고 있을까?
개념
개념은 공통점을 기반으로 객체들을 묶기 위한 그릇을 의미한다. 일반적으로 우리가 인식하고 있는 다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념을 뜻한다.
개념을 이용하면 객체를 여러 그룹으로 분류할 수 있다. 앨리스가 정원에 존재하는 객체를 ‘트럼프’와 ‘토끼’라는 두 개의 개념으로 나누고, 각 개념에 포함되는 객체들을 분류했다.
따라서 개념은 객체를 분류할 수 있는 틀을 제공한다.
개념의 세 가지 관점
일반적으로 객체의 분류 장치로서 개념을 이야기할 때는 아래 세 가지 관점을 함께 언급한다.
- 심볼: 개념을 가리키는 간략한 명칭
- 내연: 개념을 객체에게 적용할 수 있는지 여부를 판단하기 위한 조건
- 외연: 개념에 속하는 모든 객체의 집합
예를 들어서 트럼프라는 개념을 활용해서 심볼, 내연, 외연을 나누어 보면
- 심볼: 트럼프
- 내연: 몸이 납작하고 두 손과 두 발이 네모 귀퉁이에 달려있다.
- 외연: 정원사, 병사, 신하, 왕자와 공주, 왕과 왕비
개념을 정하게 되면 이를 기준으로 객체들을 분류할 수 있고, 분류하게 되면 이는 객체들의 복잡성을 극복할 수 있다.
즉, 개념은 객체들의 복잡성을 극복하기 위한 추상화 도구다.
타입
타입은 개념이다.
위에서 계속 말했던 개념이라는 말이 타입이라는게 무슨 말일까?
공학자들은 개념을 대체할 수 있는 좀 더 세련돼 보이는 용어를 수학으로부터 차용해 왔고, 그것이 바로 타입 이다.
타입은 결국 개념과 같은 의미이며, 우리가 인식하고 있는 다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념을 의미한다.
근데 우리는 왜 타입이 필요했을까?
이는 데이터 타입을 통해서 알 수 있다.
우리도 익히 알다시피 1010 이더라도 얘는 숫자형일수도 있고, 문자형일수도 있다. 이 1010의 타입을 지정하지 않았더니 프로그래머들 사이에서 혼란이 생긴 것이다.
타입 없는 무질서가 초래한 혼돈의 세상에 질려버린 사람들은 메모리 안의 데이터에 특정한 의미를 부여하기 시작했다. 더하거나, 빼거나, 곱하거나, 나눌 수 있는 타입을 숫자형으로, 다른 문자와 연결될 수 있다면 문자열형으로, 참/거짓을 이야기할 수 있다면 논리형으로 분류했다.
결과적으로 타입 시스템의 목적은 데이터가 잘못 사용되지 않도록 제약사항을 부과하는 것이다.
그렇다고 해서 데이터 타입의 타입과 객체지향에서의 타입이 같다는 것은 아니다. 객체는 행동을 통해서 상태가 변하는 것이지, 데이터인 것은 아니다.
하지만 데이터 타입을 통해서 객체지향 설계에 대한 중요한 원칙을 이끌어낼 수 있다.
- 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.
- 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다.
행동이 우선이다.
객체의 내부 표현 방식이 다르더라도 어떤 객체들이 동이랗게 행동한다면 그 객체들은 동일한 타입에 속한다.
어떤 객체를 다른 객체와 동일한 타입으로 분류하는 기준은 무엇일까?
그 객체가 타입에 속한 다른 객체와 동일한 행동을 하기만 하면 된다. 행동을!
동일한 행동을 하므로 동일한 타입에 속한 객체는 내부의 데이터 표현 방식이 다르더라도 동일한 메시지를 수신하고 처리할 수 있다.
다만 내부 표현 방식이 다르기 때문에 처리하는 방식은 서로 다를 수 있다. 이것은 다형성 에 의미를 부여한다.
다형성이란 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 뜻한다.
동일한 행동을 하는 객체들끼리 분류를 해놓았으니 동일한 요청이 들어오는 것이고, 그 내부에서의 데이터가 다르기 때문에 처리하는 방식이 달라서 서로 다른 방식으로 응답하는 것이다.
전에 어떤 수업에서 다형성이란 개념은 하나인데, 형식이 다양하다 라는 뜻이라고 했다. 메시지를 응답하기 위한 행동은 하나인데, 이를 처리하기 위한 방식이 다양하다라는 뜻으로 다시 볼 수 있다.
결국, 지금까지 데이터는 숨기고, 캡슐화시켜야 된다는 이유가 나온다. 왜냐하면 객체를 행동 에 따라서 분류하기 위해 지켜야 하는 기본적인 원칙이기 때문이다.
객체를 결정하는 것은 행동이다. 데이터는 단지 행동을 따를 뿐이다.
타입의 계층
앨리스 얘기에서 트럼프를 봤을 때, 그 내에서 진짜 카드 트럼프와 트럼프 인간으로 분류를 할 수 있다.
자세히 말하자면 트럼프 안에 트럼프 인간이 있다고 볼 수 있다.
트럼프는 행동 1만을 할 수 있다면 트럼프 인간은 행동 1, 2, 3을 할 수 있기 때문이다.
트럼프 인간은 트럼프에서 팔 다리가 달린 병사, 왕, 여왕 등을 말한다. (위 사진처럼 생긴 애들!)
트럼프는 일반화 관계, 트럼프 인간은 특수화 관계라고 한다. 일반화와 특수화는 동시에 일어난다.
두 타입 간에 일반화/특수화 관계가 성립하려먼 한 타입이 다른 타입보다 더 특수하게 행동해야 하고 반대로 한 타입은 다른 타입보다 더 일반적으로 행동해야 한다.
특수한 타입이란 일반적인 타입이 가진 모든 행동을 포함하지만 거기에 더해 자신만의 행동을 추가하는 타입을 가리켜서 말한다.
근데 이 일반화/특수화 관계를 읽다보면 당연히 슈퍼 클래스와 서브 클래스가 생각이 난다.
일반적인 타입을 슈퍼타입, 특수한 타입을 서브 타입이라고 한다.
슈퍼타입과 서브타입에서 중요한 것은 두 타입 간의 관계가 행동에 의해 결정된다는 점이다. 즉, 어떤 타입이 다른 타입의 서브타입이 되기 위해서는 행위적 호환성을 만족시켜야 한다.
정리
이번 장에서는 객체지향에서의 추상화가 무엇인지, 타입은 무엇인지에 대해서 알게 되었다.
근데 특히, 다형성과 캡슐화에 대한 설명이 너무 좋았다. 다형성이라는 개념은 항상 개념만 알고 이해는 안되는? 그런 느낌이었다.
뭔가 형식이 다양하다는 것이 잘 이해가 되지 않았기 때문이다. 하지만 객체를 행동을 통해서 분류하고, 행동이 동일하더라도 데이터를 처리하는 방식은 다를 수 있다는 것을 알게 되었을 때, 이때 처리하는 형식이 다양한 것을 다형성 이라고 하는 것이구나! 를 알게 되었다.
또한 캡슐화도 마찬가지이다. 지금까지 객체지향을 배우면서 나는 대부분 데이터를 기준으로 객체를 만들었고 그렇게 때문에 왜 캡슐화가 필요한지 이해하지 못했다. 하지만 객체를 행동을 기준으로 분류하고, 그 안에서 데이터를 처리하는 방식이기 때문에 행동이 더 중요한 것이지 상태가 더 중요하지 않는다. 따라서 캡슐화 가 필요한 것이라는 것을 알게 되었을 때, 속으로 ‘와,,, 대박,,,, 👏’ 을 외치게 되었다. ㅎㅎㅎㅎ
댓글남기기