티스토리 뷰

추상화를 통한 복잡성 극복

초기 지하철 노선도는 실제 지형을 반영하여 구불구불한 노선과 불규칙한 역간의 거리를 사실적으로 표현하였다. 하지만 지하철 노선도에서 중요한 정보는 얼마나 사실적으로 지형을 묘사했는지가 아닌 출발지, 도착지, 최단경로, 환승 등과 같은 직관적인 정보이다.

 

이후 해리 백이라는 사람이 지하철 노선도의 핵심은 지도가 당연히 가져야 하는 정확성이 아닌 목적에 집중해야 함을 깨닫고 혁신적인 지하철 노선도를 개발하게 된다. 이는 지하철 노선도를 추상화한 것이다.

 

현실 세계는 매우 복잡하고 예측이 불가능하다. 따라서 이해하기 쉽고 예측할 수 있도록 분해하고 단순화하는 전략을 사용한다. 따라서 진정한 추상화란 불필요한 부분을 제거하며 사물의 본질을 드러나게 하는 것으로 시작한다. 불필요한 부분을 제거하더라도 사물의 목적을 잃어버려서는 안 된다.

추상화

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

복잡성을 다루기 위해 추상화는 두 차원에서 이뤄진다.

  • 첫 번째 차원은 구체적인 사물 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것
  • 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것

모든 경우에 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이라는 점

객체지향과 추상화

명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물을 객체지향 패러다임에서는 객체라고 한다. 객체지향 패러다임의 중심에는 구체적이고 실제적인 객체가 존재하지만, 객체들을 개별 단위로 취급하기에는 우리의 인지능력은 부족하다. 따라서 공통적인 특성을 기준으로 객체를 묶어 가짓수를 줄여 상황을 단순화시킨다.

 

공통점을 기반으로 객체를 묶는 것을 개념이라고 한다. 개념을 이용하면 객체를 여러 그룹으로 분류할 수 있다. 어떠한 개념에 속해있는 객체를 인스턴스라고 한다. 객체란 특정한 개념을 적용할 수 있는 구체적인 사물을 의미한다. 개념이 객체에 적용됐을 때 객체를 개념의 인스턴스라고 한다.

개념의 세 가지 관점

심볼(symbol)
  • 개념을 가리키는 간략한 이름이나 명칭
내연(intension)
  • 개념의 완전한 정의를 나타내며 내연의 의미를 이용해 객체가 개념에 속하는지를 확인할 수 있다.
외연(extension)
  • 개념에 속하는 모든 객체의 집합

 

개념을 이용해 객체를 분류할 수 있다는 사실이 더 중요하다. 개념을 이용해 공통점을 가진 객체들을 분류할 수 있다는 아이디어는 객체지향 패러다임이 복잡성을 극복하는데 사용하는 가장 기본적인 수단

객체를 분류하기 위한 틀

분류란 객체에 특정한 개념을 적용하는 작업이다. 객체에 특정한 개념을 적용하기로 결심했을 때 우리는 그 객체를 특정한 집합의 멤버로 분류하고 있는 것이다.

분류는 객체지향의 품질을 결정한다. 올바르지 않은 분류는 유지보수가 어렵고 변화에 쉽게 대처하지 못한다.

타입

타입은 개념이다

공학자들은 개념을 대체할 수 있는 용어를 수학적 차원에서 사용해왔는데 그것은 바로 타입이다.

데이터 타입

컴퓨터가 작업을 수행하기 위해서는 메모리에 데이터를 불러와야 한다. 메모리 안에서는 0과 1로만 데이터가 존재하게 되는데 이는 정확한 타입을 가질 수 없다. 따라서 효율적으로 데이터를 다루기 위해서는 정형화된 타입 시스템을 만들어야 했다.

 

이로 인해 데이터가 잘못 사용되지 않도록 제약사항을 걸 수 있게 된다. 데이터를 이용해 작업을 수행하는 것을 연산자라고 한다. 해당 데이터에 연산자를 적용할 수 있는가를 통해 해당 데이터의 타입이 결정되게 되는 것이다.

데이터 타입은 메모리 안에 저장된 데이터 종류를 분류하는 데 사용하는 메모리 집합에 관한 메타데이터이다.

객체와 타입

프로그램을 작성할 때 우리는 객체를 데이터처럼 사용한다. 결국 객체를 정의하는 것은 새로운 데이터 타입을 정의하는 것을 의미한다.

 

그렇다면 객체는 데이터인가? 객체는 행동에 의한 상태를 표현하기 위해 도입된 추상적인 개념일 뿐이고 협력을 위해 어떤 행동을 해야 하는지 결정하는 것이다.

 

따라서 다음과 같이 정의할 수 있다.

첫째, 객체가 어느 타입에 속하는지 결정하는 것은 어떤 행동을 수행하는지 결정하는 것이다.

둘째, 객체는 내부적으로 감춰지기 때문에 객체의 행동을 효과적으로 표현할 수 있다면 내부의 상태는 어떤 형식으로 표현되더라도 상관이 없다.

행동이 우선이다

객체를 다른 객체와 동일한 타입에 속하는지 판별하는 기준은 동일한 행동을 수행하는가에 있다. 같은 타입에 속하는 객체의 행동만 동일하다면 서로 다른 데이터를 가질 수 있다. 동일한 메시지를 처리하는 방식은 다를 수 있는데 이는 다형성을 의미한다.

 

따라서 훌륭한 객체지향 설계는 외부에 행동만 제공하고 데이터는 감춰야 하는데 이는 캡슐화를 의미한다. 책임 주도 설계는 데이터 주도 설계의 단점을 보완하기 만들어진 객체지향 설계의 핵심이다.

타입의 계층

일반화/특수화 관계

객체지향에서 일반화/특수화 관계를 표현하는 것은 객체의 상태인 데이터가 아니라 행동이다. 특수화된 객체는 일반화의 행동을 모두 수행하면서 자신만의 특별한 행동이 존재해야 한다.

정적 모델

클래스

객체지향 프로그래밍 언어에서 정적인 모델은 클래스를 이용하는 것이다. 따라서 타입을 구현하는 가장 보편적인 방법은 클래스를 정의하는 것이다. 하지만 2개가 동일한 의미를 가지는 것은 아니다. 타입은 객체를 분류하기 위한 개념이고 클래스는 타입을 정의하기 위한 메커니즘이다.

 

결국 객체지향에서 중요한 것은 객체의 상태와 상태를 변경하기 위한 행동이다.

'도서 > 객체지향의 사실과 오해' 카테고리의 다른 글

객체 지도  (0) 2022.08.04
책임과 메시지  (0) 2022.07.29
역할, 책임, 협력  (0) 2022.07.20
이상한 나라의 객체  (0) 2022.06.16
협력하는 객체들의 공동체  (0) 2022.06.16
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Total
Today
Yesterday