객체지향의 사실과 오해 -03 타입과 추상화

octofox·2021년 5월 22일
0
post-thumbnail

일단 컴퓨터를 조작하는 것이 추상화를 구축하고, 조작하고, 추론하는 것에 관한 모든 것이라는 것을 깨닫고 나면 훌륭한 프로그램을 작성하기 위한 중요한 전제 조건은 추상화를 정확하게 다르는 능력이라는 것이 명확해진다. -키스 데블린-

추상화

맨 처음 추상화에 대해서 먼저 설명한다.
나는 추상화라는 것의 의미를 전혀 모르고 있었다.
그냥 말 그대로 현실에 있는 것을 컴퓨터 코드로 추상화한다? 라는 개념이라고 생각했다.

결론부터 말하자면 추상화라는 것은

어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 낮추는 방법이다.

추상화에 대한 좋은 실례를 드는데, 옛날의 지하철 노선도는 실제 거리와 노선의 방향, 지형들을 표현하는 지하철 노선도를 사용했다.

지도를 실제 지형과 비슷하게 하려하니 복잡도가 올라간 것이다.
사실 지하철 노선도에서는 실제 거리나 지형이 중요한 것이 아니다.

노선도에서 중요한 것은 ‘역과 역 사이의 연결성을 얼마나 직관적으로 표현했는가’ 이다.

위의 노선도는 추상화를 통해 이렇게 변했다.

추상화(abstract)라는 것은 현실 세계에서의 복잡도를 낮추는 일이다.
몰라도 되는 정보를 과감하게 배제하고 간추리는 일이다.

이 노선도의 예에서는 추상화 기법 중 일반화를 사용한 것이다.

흔히 일반화와 특수화는 동시에 진행된다.

모든 현상과 현실에서 공통점을 뽑아내고 나면 차이점만 존재하기 때문이이다.

공통점을 모든 현상들의 공통점을 추려내는 일을 일반화,
차이점을 뽑아내는 일은 특수화라 한다.

이상한 나라의 엘리스 이야기에서는 트럼프인간을 클래스로 구분 지어본다.

트럼프와 트럼프 인간, 이 둘의 공통점은 트럼프다.

<?php
abstract class Trump // 추상 클래스
{...}

TrumpHuman extends Trump // 자식 클래스
{...}

타입

타입은 개념이다.

추상화를 먼저 설명한 이유는 타입도 추상화의 일종이기 때문이다.

컴퓨터에서 일반적으로 말하는 타입은 INT, STRING, DATETIME 등과 같은 서로 다른 데이터 타입을 말한다.

이들이 이렇게 타입으로 구분되어진 이유는 무엇인가?
데이터들 서로 할 수 있는 행동이 다르기 때문이다.

int는 연산자와 함께 쓰이고 계산하기 위해 쓰인다.
string은 언어를 표현하기 위해 쓰인다.
datetime은 시간을 가리킨다.

하지만 이런 타입들의 저편에는 0과 1로 된 데이터들만 존재한다.

0과 1만이 무수한 메모리를 들여다 보고 이 타입들을 구분해낼수 있는 사람은 없을 것이다.

하지만 우리는 0과 1의 문법을 모르지만 타입을 사용하는데 아무지장이 없다.
0과 1을 타입으로 추상화 한 것이다.

타입과 추상화는 결국 인간의 인지 능력을 뒷받침하기 위함이다.
사람의 생각으로 충분히 코드가 이해될 수 있는 수준으로 만드는 것이다.

결론

실제 객체지향을 도입한 대부분의 언어들은 abstract(추상)키워드를 지원한다.
일반화 할 수 있는 공통적인 부분을 method로 구현하고, 꼭 있어야하는 method들을 하위 class에서 작성하도록 강제할 수 있다.

abstract로 class를 나누는 것이 더 복잡해 보일 수 있지만 복잡한 것들 안에서 공통된 것을 분별해 나눈다는 것은 인간적인 이해도에 큰 도움을 준다.

profile
개발자라고 우기는 노답 소년

0개의 댓글