<객체지향의 사실과 오해, 조영호 지음 / 위키북스> 3장을 읽고 정리한 내용입니다.

추상화를 통한 복잡성 극복

추상화는 현실을 기반으로 하되 복잡하거나 불필요한 부분을 제외하고 목적에 맞게 사물의 본질을 드러나게 하는 과정이다.
이 책에서는 추상화를 다음과 같이 정의한다.(p.77)


추상화
어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다.
복잡성을 다루기 위해 추상환느 두 차원에서 이뤄진다 [Kramer 2007]

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

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


객체지향 패러다임은 객체의 추상화를 통해 현실의 복잡성을 극복하고자 한다.
따라서, 객체지향 패러다임을 기반으로 아름다운 애플리케이션을 개발하기 위해 추상화를 잘 이해하는 것이 중요하다.
이제 추상화가 무엇인지 구체적으로 알아보자!

객체지향과 추상화

모두 트럼프일 뿐

이상한 나라의 앨리스 이야기를 다시 살펴보자.
앨리스는 아름다운 정원에 들어가서 여러 객체들을 마주친다.
트럼프처럼 생겼고 몸에는 스페이드 무늬가 그려진 세 명의 정원사들, 클로버 병사들, 신하들, 공주와 왕자, 하얀 토끼, 하트 왕과 하트 여왕들 모두 객체이다.
앨리스는 하얀 토끼를 제외한 모든 객체에 대해 기껏해야 트럼프에 불과해. 라고 판단했다.
하얀 토끼를 제외한 모든 객체를 트럼프 라는 하나의 개념으로 단순화한 것이다.
병사들, 정원사들, 왕자, 공주, 여왕 등의 객체가 가지는 나이, 계급, 성격 등의 차이점은 과감하게 무시하고 공통점만을 취해 단순화해서 이해했다.

그룹으로 나누어 단순화하기

앨리스는 어떻게 트럼프 그룹과 트럼프가 아닌 그룹으로 나눌 수 있었을까?

개념

개념(concept)이란 일반적으로 우리가 인식하고 있는 다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념을 뜻한다. (p.83)
수많은 객체를 개별적인 단위로 취급하기에 인간의 인지능력은 턱없이 부족하므로 공통적인 특성을 기준으로 객체를 여러 그룹으로 묶어 단순화하려고 한다.

앨리스는 아름다운 정원에서 마주친 객체들에 대해 몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있는 객체에 대해 트럼프라는 개념으로 추상화했다.
개념을 이용하면 객체를 여러 그룹으로 분류(classification)할 수 있다. (p.84)
객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴스(instance)라고 한다. (p.84)

개념의 세 가지 관점

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

예를 들어, 앨리스가 아름다운 정원에서 마주친 객체들을 트럼프 그룹, 트럼프가 아닌 그룹으로 분류했을때 트럼프라는 이름은 개념의 심볼이 된다.
몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있다는 트럼프에 대한 설명은 내연에 해당한다.
예를 들어, 하얀 토끼는 트럼프의 내연에 만족하지 못하기 때문에 트럼프가 될 수 없다. 즉, 내연은 해당 객체에 개념을 적용시킬 수 있는지의 여부를 판단하는 조건이 된다.
마지막으로, 정원사, 병사, 신하, 왕자와 공주, 하트 왕, 하트 여왕 등 트럼프 그룹 안에 속한 객체 집합은 외연이다. 즉, 외연은 개념의 인스턴스들이 모여 이뤄진 집합을 의미한다.

객체를 분류하기 위한 틀

분류는 객체지향의 가장 중요한 개념 중 하나다. 어떤 객체를 어떤 개념으로 분류할지가 객체지향의 품질을 결정한다. (p.87)

분류는 추상화를 위한 도구다

개념은 객체들의 복잡성을 극복하기 위한 추상화 도구다. (p.88)
아래와 같은 추상화의 두 가지 차원을 통해 객체들의 복잡성을 극복하고, 개념의 틀에 객체를 분류하여 세상을 추상화할 수 있다.

  • 객체간의 공통점은 취하고, 차이점은 무시한다.
  • 중요한 부분을 강조하기 위해 불필요한 세부 사항은 제거하여 단순화한다.

타입

타입은 개념이다

타입은 개념과 동일하다. 따라서 타입이란 우리가 인식하고 있는 다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념을 의미한다. 어떤 객체에 타입을 적용할 수 있을 때 그 객체를 타입의 인스턴스라고 한다. 타입의 인스턴스는 타입을 구성하는 외연인 객체 집합의 일원이 된다. (p.89)

데이터 타입

  • 타입은 데이터가 어떻게 사용되느냐에 관한 것이다. 어떤 데이터에 어떤 연산자를 적용할 수 있느냐가 그 데이터의 타입을 결정한다.
  • 타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부로부터 철저하게 감춰진다. 개발자는 해당 데이터 타입을 사용하기 위해 단지 데이터 타입에 적용할 수 있는 연산자만 알고 있으면 된다. 예를 들어, 숫자형 데이터에 적용할 수 있는 산술 연산자를 알고 있다면 메모리 내부에 숫자가 어떤 방식으로 저장되는지를 모르더라도 숫자형 데이터를 사용할 수 있다.

이 책에서는 프로그래밍 언어 관점에서 데이터 타입을 다음과 같이 정의한다.

데이터 타입은 메모리 안에 저장된 데이터의 종류를 분류하는 데 사용하는 메모리 집합에 관한 메타데이터다. 데이터에 대한 분류는 암시적으로 어떤 종류의 연산이 해당 데이터에 대해 수행될 수 있는지를 결정한다.

(p.91)

객체와 타입

  • 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다. 어떤 객체들이 동일한 행동을 수행할 수 있다면 그 객체들은 동일한 타입으로 분류될 수 있다.
  • 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다. 객체의 행동을 가장 효과적으로 수행할 수만 있다면 객체 내부의 상태를 어떤 방식으로 표현하더라도 무방하다. (p.92)

행동이 우선이다

객체의 내부 표현이 어떻든지 간에 동일한 행동을 한다면 동일한 타입으로 간주된다.
이것은 객체를 특정 타입으로 분류할 기준점은 객체의 행동이라는 바를 시사한다.
어떤 객체들의 행동이 동일하다면(책임이 동일하다면, 즉, 동일한 메시지를 수신한다면) 그 객체들은 동일한 타입에 속한다고 말할 수 있기 때문이다.

여기에서 객체지향 패러다임의 원칙 중 하나인 다형성의 의미를 파악할 수 있다.
다형성이란 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 뜻한다. (p.93)
객체들끼리 내부의 데이터 표현 방식이 달라서 메시지를 처리하는 방식이 서로 다르더라도, 동일한 메시지를 수신하고 이를 처리할 수 있다는 점이 중요하다.
행동만이 고려 대상이 되기 때문에 외부에 내부 데이터를 감춰야 한다. 이 원칙을 캡슐화 라고 한다.

타입의 계층

트럼프 계층

앨리스가 구분한 대로 정원사, 병사, 신하, 왕자와 공주 등등의 객체는 정말로 트럼프일까?
정확하게는 앨리스는 위 인물들을 트럼프 인간으로 봤을 것이다.
구분해보자면 트럼프는 납작 엎드릴 수 있고 뒤집어질 수 있다는 행동을 가진다.
트럼프 인간은 위 트럼프가 할 수 있는 모든 행동을 하면서도 트럼프보다 더 특화된 행동을 할 수 있다. 예를 들자면, 납작 엎드릴 수 있고, 뒤집어질 수 있으며 걸을 때마다 몸이 종이처럼 좌우로 펄럭인다.
이 관점에서 트럼프는 트럼프 인간을 포괄하는 좀 더 일반적인 개념이다.
트럼프 인간은 트럼프보다 좀 더 특화된 행동을 하는 특수한 개념이다.
이 두 개념 사이의 관계를 일반화/특수화(generalization/specialization) 관계 라고 한다. (p.97)

일반화/특수화 관계

앨리스 이야기를 예시로 봐서 알 수 있듯이 객체의 일반화/특수화 관계를 결정하는 것은 객체의 행동이다.
타입의 내연을 의미하는 행동의 가짓수와 외연을 의미하는 집합의 크기는 서로 반대이다.
일반화/특수화 관계에서 일반적인 타입은 특수한 타입보다 더 적은 수의 행동을 가지지만 더 큰 크기의 외연 집합을 가진다. 특수한 타입은 일반적인 타입보다 더 많은 수의 행동을 가지지만 더 적은 크기의 외연 집합을 가진다. (p.99)

슈퍼타입과 서브타입

일반화/특수화 관계에서 좀 더 일반적인 타입을 슈퍼타입(Supertype)이라고 하고, 좀 더 특수한 타입을 서브타입(Subtype)이라고 한다.
슈퍼타입과 서브타입도 마찬가지로 두 타입 간의 관계가 행동에 의해 결정된다.

일반화는 추상화를 위한 도구다

객체지향 패러다임을 통해 세상을 바라보자면 대부분 분류와 일반화/특수화 기법을 동시에 적용하게 된다.
왜냐하면 추상화의 두 가지 기법을 모두 사용하기 때문이다.
객체간의 공통점을 취하고 차이점은 무시하며(분류), 중요한 점을 부각하기 위해 불필요한 점을 배제한다(일반화/특수화).

정적 모델

타입의 목적

타입은 시간에 따라서 객체의 상태가 동적으로 변화하더라도, 시간에 독립적인 정적인 객체로 다룰 수 있게 해준다.

그래서 결국 타입은 추상화다

이러한 관점에서 타입은 추상화다.
시점에 따라서 앨리스의 상태 변화를 제거하고, 철저히 정적인 관점에서 앨리스의 모습을 묘사하는 것을 가능하게 하기 때문이다.

동적 모델과 정적 모델

  • 동적 모델(dynamic model): 시간에 따라서 객체의 상태가 어떻게 변화하고, 어떻게 행동하는지를 포착한다.
  • 정적 모델(static model): 객체의 상태가 아닌, 객체가 속한 타입의 정적인 모습을 표현한다.

개발자들은 애플리케이션의 동적인 관점과 정적인 관점을 모두 다뤄야 한다.

클래스

객체지향 프로그래밍 언어에서 정적인 모델은 클래스를 이용해 구현된다.
타입은 객체를 분류하기 위해 사용하는 개념이다. 반면 클래스는 단지 타입을 구현할 수 있는 여러 구현 메커니즘 중 하나일 뿐이다. (p.104)

정리하자면, 객체를 분류하는 기준은 타입(개념)이며, 타입을 나누는 기준은 객체가 수행하는 행동이다. 그릐고, 클래스는 타입을 구현하기 위한 방법 중 하나이다. (p.105)

댓글남기기