객체지향의 사실과 오해에 관하여(객사오 북스터디) - Chapter.03 타입과 추상화

윤준석·3일 전
0

스터디

목록 보기
4/5

III. 타입과 추상화

“훌륭한 컴퓨터 프로그램을 작성하기 위한 전제 조건은 추상화를 정확하게 다루는 능력이다.”
– 키스 데블린(Keith Devlin)

타입과 추상화라는 이번 챕터의 제목을 보았을 때,
처음에는 왠지 딱딱하고 어려운 개념만 가득할 것 같다는 생각이 들었다.
하지만 책에서 설명하는 이야기들은 오히려 현실에 가까운 예시들로 이해를 도와주었고, 덕분에 추상화와 타입에 대한 개념을 더 구체적으로 받아들일 수 있었다.

지하철 노선도와 추상화

런던의 복잡한 지하철 노선에 대한 이야기로 장이 시작된다.
과거에는 실제 지형과 거리를 그대로 반영한 지하철 노선도가 사용되었지만,
이는 오히려 이용자들이 지하철을 이용하는 데는 방해가 되었다.
승객이 원하는 것은 “출발역에서 어떤 노선을 타고, 어디에서 환승해야 하며, 목적지까지 어떻게 가야 하느냐”는 정보지, 지하의 정확한 지형도가 아니었기 때문이다.

이 문제를 해결한게 해리 백의 지하철 노선도였다.
그는 지형과 거리 같은 불필요한 정보는 과감히 제거하고, 역과 역 사이의 연결성만을 단순하고 명확하게 표현했다. 우리가 지금 흔히 보는 현대 지하철 노선도의 형태가 바로 여기서 비롯한 것이다.

이 사례를 통해 알 수 있는 점은,
추상화복잡한 현실을 단순화하는 힘이며,
그 단순화는 사용 목적에 따라 달라져야 한다.

객체지향 설계에서도 마찬가지다. 우리가 다루는 현실은 복잡하지만,
소프트웨어 안에서는 이를 목적에 맞게 단순화해서 표현해야 한다.

앨리스와 트럼프: 객체와 타입의 이해

『이상한 나라의 앨리스』 속 장면 중
정원에 있는 다양한 인물들 정원사, 병사, 왕과 왕비들이 모두 등장하지만,
앨리스는 이들을 기껏해야 트럼프 카드일 뿐이라며 하나의 그룹으로 바라본다.
이는 바로 객체들을 공통점에 따라 분류하는 추상화의 과정이다.

객체지향 패러다임에서 우리는 서로 다른 객체들을
공통된 특징(행동이나 외형 등) 에 따라 분류하고 그룹화하는데,
이때 쓰이는 개념이 바로 타입(Type) 이다.

책에서는 타입은 개념이다라는 명제를 강조한다.
우리가 일상에서 사용하는 “자동차”, “모니터”, “책상” 같은 말들처럼,
프로그래밍에서도 “정수형”, “문자열”, “사용자” 등의 타입은 우리가 객체를 이해하기 위한 정신적인 틀이 된다.

객체지향에서 타입은 ‘행동’이다
우리가 흔히 프로그래밍에서 다루는 데이터 타입은 내부에 어떤 데이터가 있느냐에 따라 정해지는 것처럼 보이지만, 객체지향에서는 이 기준이 행동으로 바뀐다.

같은 행동(책임)을 수행할 수 있는 객체들은 같은 타입으로 간주한다.

객체의 내부 데이터가 다르더라도, 외부에서 볼 수 있는 행동이 같다면 같은 타입이다.

이로 인해 다형성(polymorphism) 이 가능해지고,
캡슐화(encapsulation) 가 의미를 갖는다.

예를 들어, 트럼프 병정은 트럼프 카드와 외형은 비슷하지만, ‘걸을 수 있다’는 추가적인 행동을 가진다. 그래서 트럼프 병정은 트럼프 카드의 서브타입이 된다.

트럼프 카드는 더 일반적인 타입이고, 트럼프 병정은 더 특수화된 타입이다.
이 관계를 통해 우리는 일반화/특수화라는 객체지향의 핵심 개념을 이해하게 된다.

타입은 시간의 복잡성을 제거한 추상화

객체는 시간에 따라 상태가 바뀌는 동적인 존재다. 예를 들어, 앨리스는 어떤 행동을 하느냐에 따라 키가 작아지기도 하고 커지기도 한다. 그런데 매번 앨리스의 키 상태를 전부 다 다르게 저장하고 구분하기엔 너무 복잡하다.

그래서 우리는 ‘앨리스’라는 타입을 정의하고, 그 타입이 가질 수 있는 상태와 행동을 정적으로 묘사한다. 이를 통해 우리는 객체의 복잡한 상태 변화를 시간과 무관하게 추상화할 수 있다.

객체지향에서는 이러한 정적인 관점(타입)
동적인 관점(실행 중 객체 상태 변화) 을 함께 고려하는 것이 중요하다.
클래스는 이 타입을 구현하는 하나의 수단일 뿐이다.

결론: 추상화는 객체지향의 시작점이다

이 장을 통해 내가 새롭게 알게 된 것은,
객체지향의 본질은 데이터가 아니라 행동에 있으며,
추상화와 타입은 객체지향의 출발점이라는 것이다.

“객체는 단지 클래스의 인스턴스가 아니라, 책임을 지닌 행위자이며,
객체를 분류하는 기준은 데이터가 아니라 행동이다.”

정리하자면 객체지향 프로그래밍은 현실을 추상화하여 객체로 표현하고,
그 객체들을 행동 중심으로 타입으로 분류하고,
그 타입들을 기반으로 역할과 책임, 협력의 구조를 설계하는 일이다.

profile
컴퓨터 공학을 공부중인 윤준석 입니다!

0개의 댓글