일반화와 특수화

범주의 계층

18세기 자연에 대한 관심 증가로 매년 수천 종의 생물들이 새롭게 발견

끝임없이 쏟아져 보편적 분류 체계가 필요하다 느낌

1735 카를로스 린네 자연의 체계를 발표

계문강목과속종

 

린네의 분류 체계는 범주 간의 계층적인 구조를 가짐

모든 포유류는 척추가 있고 새끼를 낳아 젖을 먹여 기른다는 특징을 공유

따라서 얼룩고양이도 척추가 있고 새끼를 낳아 기르며 젖을 먹여 새끼를 기를 것이라는 사실을 쉽게 있다.

 

린네의 계층 구조는 세부적인 범주가 계층의 하위에 위치하고 일반적인 범주가 계층의 상위에 위치한다.

계층 상위에 위치한 범주를 계층 하위에 위치한 범주의 일반화

계층의 하위에 위치한 범주는 계층의 상위에 위치한 범주의 특수화라고 한다.

 

서브타입

객체지향의 세게에서 범주는 개념, 개념은 타입

따라서 일반화와 특수화는 계층 구조 안에서 존재하는 타입 간의 관계를 의미한다.

어떤 타입이 다른 타입보다 일반적이라면 슈퍼 타입(supertype)

어떤 타입이 다른 타입보다 특수하다면 서브타입(subtype)이라고 한다.

슈퍼타입은 서브타입의 일반화

서브타입은 슈퍼타입의 특수화

 

일반화와 특수화 계층 구조에서 서브타입은 슈퍼타입이 가진 본질적인 속성과 함께 자신만의 추가적인 속성을 가진다.

 

크레이그 라만은 어떤 타입이 다른 타입의 서브타입이 되기 위해서는 100% 규칙과 Is-a 규칙을 준수해야한다고 했다.

100% 규칙은 내연 관련

Is-a 규칙은 외연 관련 규칙이다.

  • 100%규칙
    슈퍼타입의 정의가 서브타입에 100% 적용되어야 한다
    서브타입은 속성과 연관관계 면에서 슈퍼타입과 100% 일치해야 한다.
  • Is-a 규칙(is-a-kind-of)
    서브타입의 모든 인스턴스는 슈퍼타입 집합에 포함돼야 한다.
    "서브타입은 슈퍼타입이다" 라는 말에 대입해서 맞다면 적용되는 것으로 본다.
    인간은 동물이다. (일치) / 컴퓨터는 동물이다(불일치)
    서브타입이 슈퍼타입의 부분집합인 것을 알 수 있다.

 

상속

일반화 특수화 관계를 구현하는 일반적인 방법은 클래스 상속을 사용하는

반드시 모든 상속 관계가 일반화 관계인 것은 아니다.

 

일반화의 원칙은 타입이 다른 타입의 서브타입이 되기 위해서는 슈퍼타입에 순응(conformance)해야 한다는

순응은 구조적인 순응(structural conformance) 행위적인 순응(behavioral conformance) 가지 종류가 있다.

가지 모두 특정 기대 집합에 대해 서브타입의 슈퍼타입에 대한 대체 가능성 의미한다.

  • 구조적인 순응의 경우 기대 집합은 속성과 연관관계에 관한 것
  • 행위적인 순응의 경우 기대 집합은 행위가 동일한 계약을 기반으로 하느냐

 

구조적인 순응은 타입의 내연과 관련된 100% 규칙을 의미(속성)

Person 클래스에 name 속성이 있다고 가정, Person 서브타입인 Employee 역시 name 속성을 가져야 한다.

Employee 클래스는 구조적으로 Person클래스를 대체할 있다.

 

행위적 순응은 흔히 리스코프 치환 원칙(Liskov Substitution Principle,LSP)이라고 한다.

Person.getAge() 나이를 반환한다면 Employee.getAge()역시 나이를 반환해야 한다.

Employee Person 대해 행위적으로 순응하기 때문에 대체 가능하다.

 

상속의 또다른 용도는 코드 중복을 방지 공통 코드를 재사용하기 위한 언어적 메커니즘을 제공하는

 

 

상속은 서브타이핑(subtyping) 서브클래싱(subclassing) 가지 용도로 사용될 있다.

  • 서브 클래스가 슈퍼클래스를 대체할 수 있는 경우 이를 서브타이핑이라고 한다.
  • 서브 클래스가 슈퍼클래스를 대체할 수 없는 경우 서브클래싱이라고 한다.

 

서브타이핑은 설계의 유연성이 목표

서브클래싱은 코드의 중복 제거와 재사용이 목적

 

서브타이핑은 인터페이스 상속(interface inheritance)

서브클래싱을 구현 상속(implementation inheritance)이라고 한다.

 

클래스가 다른 클래스를 상속받았다는 사실만으로 클래스 간의 관계가 서브타이핑인지, 서브클래싱인지 여부를 결정할 없다.

서브타이핑의 전제 조건은 대체 가능성이기 때문에 클라이언트 관점에서 실제로 어떻게 사용되고 있는지를 확인해야 한다.

 

가능한 모든 상속관계가 서브타이핑의 대체 가능성을 준수하도록 하는 것이 좋다

 

여러 클래스로 구성된 상속 계층에서 수신된 메시지를 이해하는 기본적인 방법은 클래스 위임(delegation) 사용하는  

 

 

집합과 분해

계층적인 복잡성

복잡성은 계층의 형태를 띈다.

단순한 형태로부터 복잡한 형태로 진화하는데 걸리는 시간은 그 사이에 존재하는 안정적인 형태의 수와 분포에 의존한다

 

시계는 중간 부품들을 조립해서 만들어진다.

중간 부품은 작은 부품들을 조립해서 만들어진다.

결국 시계는 전체적으로 연쇄적인 계층 구조 구성된다.

같이 안정적인 형태의 부분으로부터 전체를 구축하는 행위를 집합이라고 한다.

반대로 전체를 부분으로 분할하는 행위를 분해라고 한다.

 

집합의 가치는 많은 수의 사물들의 형상을 하나의 단위 다룸으로써 복잡성을 줄일 있다는 있다.

 

집합은 불필요한 세부 사항을 배제하고 그림에서 대상을 다룰 있게 한다. (추상화, 캡슐화)

그러나 필요한 시점에는 전체를 분해함으로써 안에 포함된 부분들을 새로운 전체 다룰 있다.

 

합성 관계

상품 주문을 생각해보자.

상품 주문은 여러 상품을 번에 주문할 있다.

이때 상품을 주문했는지를 가리켜 주문 항목이라고 한다.

주문 항목은 주문과 독립적으로 존재할 없다. 반드시 어느 주문에 주문항목이 일부로 생성되기 때문이다.

객체와 객체 사이의 전체-부분 관계를 구현하기 위해서는 합성 관계를 사용한다.

 

합성관계는 부분을 전체 안에 캡슐화함으로써 단순화한다.

, 주문과 상품만이 존재하는 것처럼 모델을 다룰 있다.

필요시 주문 내부의 세부적인 주문항목을 보는

 

주문항목은 주문과 전체와 부분을 나타내는 합성관계다.

주문항목과 상품 간에도 선이 연결되어 있는데 이를 연관 관계라 한다.

 

일반적으로 합성관계로 연결된 객체는 포함하는 객체가 제거되면 같이 제거된다.

주문이 제거되면 주문항목이 존재할 없으니 같이 제거

 

연관 관계는 주문 제거되더라도 상품은 계속 판매될 것이다.

 

 

패키지

합성 관계를 통해 단순화 하더라도 결국 클래스 수가 많아지면 복잡해진다.

 

서로 관련성이 높은 클래스 집합을 논리적인 단위로 통합

 

관련된 클래스 집합을 하나의 논리적인 단위로 묶는 구성 요소를 패키지(package)또는 모듈(module)이라한다.

 

합성 관계가 내부에 포함된 객체들의 존재를 감춤으로써 내부 구조를 추상화하는 처럼 패키지는 내부에 포함된 클래스들을 감춤으로써 시스템의 구조를 추상화한다.

 

추상화 기법

추상화는 도메인의 복잡성을 단순화하고 직관적인 멘탈 모델을 만드는 사용할 있는 기본적인 인지 수단이다

동일한 특성을 공유하는 객체들을 타입으로 분류하는 것이 추상화 기법의 예다.

 

추상화 기법은 결국 복잡성을 낮추기,세부사항 감추기

 

  • 분류와 인스턴스화 
    분류는 객체의 구체적인 세부 사항을 숨김, 인스턴스 간 공유하는 공통적인 특성을 기반으로 범주화
    인스턴스화는 범주로부터 객체를 생성하는 것
  • 일반화와 특수화
    범주 사이의 차이를 숨기고 번주 간에 공유하는 공통적인 특성을 강조
    이 반대가 특수화
  • 집홥과 분해
    부분과 관련된 세부 사항을 숨기고 부분을 사용해서 전체를 형성하는 과정을 가리킴
    집합의 반대 과정은 전체를 부분으로 분리하는 분해

 

 

분류와 인스턴스화

개념과 범주

 

개념이란 속성과 행위가 유사한 객체에 공통적으로 적용되는 관념이나 아이디어다 -Martin

객체를 분류하고 범주로 묶는 것은 객체들의 특정 집합에 공통의 개념을 적용하는 것을 의미한다.

 

나무라는 범주에는 '푸른 잎과 갈색의 줄기를 가진 다년생 식물'이라는 개념을 적용할 있다.

객체들을 공통적인 특성을 기반으로 범주로 묶고, 개념을 적용하는 것은 범주라는 정신적인 렌즈를 통해 세상을 바라보는 것과 유사하다.

자동차라는 렌즈를 통해 바라본 세상은 자동차 범주에 속한 객체만 보일

 

세상에 존재하는 객체에 개념을 적용하는 과정을 분류라고 한다. -Martin

분류는 객체를 특정한 개념을 가타내는 집합의 구성 요소로 포함시킨다.

 

세상에 존재하는 서로 다른 상태를 가진 무수히 많은 자동차와 나무를 개별적으로 다루기는 불가능하다. 그래서 범주로 묶어 세상이 가진 복잡성을 낮춘다.

사람들은 분류를 통해 개별 현상을 하나의 개념으로 다룬다.

이때 '수많은 개별적인 현상들' 객체라하고, '하나의 개념' 타입이라고 한다.

분류는 객체를 타입과 연관시키는 것이다.

 

분류의 역은 타입에 해당하는 객체를 생성하는 과정으로 인스턴스화 또는 예시라고 한다.

 

객체지향 세계에서 개념을 가리키는 표준 용어는 타입이다. -Martin

객체를 타입의 인스턴스라고 한다.

 

분류는 객체와 타입 간의 관계를 나타낸 것이다.

어떤 객체가 타입의 정의에 부합할 경우 객체는 해당 타입으로 분류되며 자동으로 타입의 인스턴스가 된다.

 

타입

타입을 객체의 분류 장치로서 적용할 수 있으려면 다음과 같은 세 가지 관점에서의 정의가 필요하다 - Martin
  • 심볼
    타입을 가리키는 간단략 명칭
  • 내연
    타입의 완전한 정의
  • 외연
    타입에 속하는 모든 객체들의 집합

 

 

외연과 집합

타입의 외연은 타입에 속하는 객체들의 집합으로 표현

집합 = 외연

객체들은 동시에 서로 다른 집합에 포함 수도 있다.

 

객체가 하나의 타입에 속하는 경우 단일 분류(single classification)

여러 타입에 속하는 경우 다중 분류(multiple classification) 한다.

 

대부분의 객체지향 프로그래밍 언어들은 단일 분류만을 지원한다.

대부분의 언어에서 객체는 오직 클래스의 인스턴스여야만 하며 동시에 개의 클래스의 인스턴스일 수는 없다. 관점에서 다중 분류를 다중 상속과 혼동해서는 안된다.

다중 상속은 하나의 타입이 다수의 슈퍼타입을 가질 있도록 허용하지만 타입 정의를 생략할 수는 없다. 반면 다중 분류는 특정한 타입을 정의하지 않고도 하나의 객체가 서로 다른 타입의 인스턴스가 되도록 허용한다.

 

객체를 특정한 타입으로 분류하면 해당 객체는 타입의 집합에 포함된다.

객체가 집합에서 다른 집합의 원소로 자신이 속하는 타입을 변경할 있는 경우 이를 동적 분류(dynamic classification)이라고 한다.

객체가 자신의 타입을 변경할 없는 경우 이를 정적 분류(static classification) 한다.

 

하나의 컴퓨터가 시간의 흐름에 따라 교육용 컴퓨터에서 사무용 컴퓨터로, 다시 사무용에서 교육용 컴퓨터로 분류가 바뀌는 과정은 컴퓨터가 여러 집합에 속할 있다는

 

다중 분류와 동적 분류는 서로 배타적인 개념이 아니다. 함께 적용하는 것이 실세계의 복잡성을 모델링하는데 유용하다.

 

클래스 기반의 객체지향에서 타입은 클래스로 구현된다.

대부분의 언어는 일단 클래스로부터 인스턴스를 생성한 클래스를 변경할 있는 방법을 제공하지 않는다. , 객체의 타입을 변경할 없다. 따라서 우리가 사용하는 대부분의 언어는 정적 분류만 허용하며 동적 분류를 구현할 있는 방법을 제공하지 않는다.

 

이처럼 언어의 제약으로 인해 다중 분류와 동적 분류를 구현으로 옮기기 쉽지 않다.

절충안으로 도메인 모델의 초안을 다중 분류와 동적 분류로 만들고, 실제 구현에 적합하도록 단일 분류와 정적 분류 방식으로 객체들의 범주를 재조정하는 것이 좋다.

 

디자인 템플릿은 유연성이라는 측면에서 필요한 경우에만 사용

단순함을 위해서는 단일 분류와 정적 분류를 선택

 

 

클래스

타입을 구현하는 가장 보편적인 방법

클래스는 타입 구현 용도 외에 코드 재사용 용도로 사용할 있다.

추상 클래스, 인터페이스도 타입 구현 가능

 

현재 객체지향 패러다임은 아리스토텔레스 분류법의 근간을 형성하는 아이디어를 근간으로 한다

 

아리스토 텔레스는 객체의 특성을 본질적인 속성과 우연적인 속성으로 분류했다.

본질(essence)이란 사물의 가장 핵심적이고 필수불가결한 솓성

본질적인 속성 속성을 우연적(accidental)속성이라고 한다.

예컨대 사람이 취직을 해서 회사원이 되어도 사람은 여전히 사람이다. 회사원이 사람의 본질을 바꾸지는 못한다.

 

클래스는 객체가 공유하는 본질적인 속성을 정의한다. 대부분의 객체지향 언어에는 우연적인 속성은 추가할 없다.

안타깝지만 분류 수준과 결과는 누가 분류를 하는가와 무엇을 기반으로 분류하는가에 따라 크게 달라진다. 실제로 사람들은 동일한 사물을 다양한 방식으로 인식하며 다양한 방식으로 분류한다.

 

자바스크립트처럼 클래스가 존재하지 않는 프로토타입 기반의 언어는 아리스토텔레스의 객관적인 분류 체계가 존재한다는 사상 대한 철학적 의문에 뿌리를 두고 있다. 클래스가 없는 프로토타입 언어에서 분류와 인스턴스화는 프로토타입이라는 객체의 복사를 통해 이뤄진다.

 

타입의 계층

트럼프 계층

트럼프는 트럼프 인간을 포괄하는 일반적인 개념이다.

트럼프 인간은 트럼프보다 특화된 행동을 하는 특수한 개념이다.

개념 사이의 관계를  일반화/특수화(generalization/specialization)관계라고 한다.

부분 집합

 

일반화/특수화 관계

일반적이라는 말은 포괄적이라는 의미를 내포한다.

특수하다는 것은 일반적인 개념보다 범위가 좁다는 것을 의미한다.

 

객체지향에서는 행동이 중요하다고 했다.

내부의 상태가 일반적인지 특수한지가 중요하지 않다.

일반화/특수화 개념을 대입하면 일반적인 행동을 하느냐 특수한 행동을 하느냐가 것이다.

, 객체의 일반화/특수화 관계에 있어서도 중요한 것은 객체가 내부에 보관한 데이터가 아니라 객체가 외부에 제공하는 행동이다.

 

그렇다면 행동의 관점에서 일반적 타입과 특수한 타입은 무엇일까?

일반적 타입이란 특수한 타입이 가진 모든 행동들 중에서 일부 행동만을 가지는 타입이다.

특수한 타입이란 일반적인 타입이 가진 모든 타입을 포함하지만 거기에 더해 자신만의 행동을 추가하는 타입을 가리킨다.

따라서 일반적인 타입은 툭수한 타입보다 적은 수의 행동을 가지고

특수한 타입은 일반적인 타입 행동을 포함하며 보다 많은 수의 행동을 가진다.

 

여기서 주의할 점은 타입의 내연을 의미하는 행동의 가짓수와 외연을 의미하는 집합의 크기는 서로 반대라는 사실이다.

일반화/특수화 관계에서 일반적인 타입은 특수한 타입보다 적은 수의 행동을 가지지만 크기의 외연 집합을 가진다. 특수한 타입은 일반적인 타입보다 많은 수의 행동을 가지지만 적은 크기의 외연 집합을 가진다.

슈퍼타입과 서브타입

일반화/특수화 관계를 타입으로 바꾼

일반적인 타입을 슈퍼타입(Supertype), 특수한 타입을 서브타입(Subtype)이라 한다.

 

역시나 슈퍼타입과 서브타입에서 중요한 것은 타입 간의 관계가 행동에 의해 결정된다는 것이다.

 

어떤 타입이 다른 타입의 서브타입이 되기 위해서는 행위적 호환성을 만족시켜야 한다.

서브타입은 슈퍼타입을 대체할 있어야 한다.

 

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

추상화 번째 원칙, 중요한 부분 강조를 위해 불필요한 세부 사항을 제거해 단순화

일반화/특수화 계층은 번째 원칙의 예시가 된다.

 

거의 대부분의 경우에 분류와 일반화/특수화 기법을 동시에 적용하게 된다.

 

 

정적 모델

타입의 목적

인간의 인지 능력으로 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기가 너무 어렵기 때문에 타입을 사용한다.

 

앨리스가 어떤 음식을 먹을 마다 키와 ,다리 길이가 시시각각 달라진다. 하지만 모든 경우에 앨리스는 단지 앨리스일 뿐이다.

 

앨리스라고 하는 객체의 상태는 변하지만 앨리스를 다른 객체와 구별할 있는 식별성은 동일하게 유지된다.

 

타입은 시간에 따라 동적으로 변하는 앨리스의 상태를 시간과 무관한 정적인 모습으로 다룰 있게 해준다.

아래 그림과 같이 앨리스의 상태에 복잡성을 부과하는 시간이라는 요소를 제거함으로써 시간에 독립적인 정적인 모습으로 앨리스를 생각할 있게 해준다.

 

 

 

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

어떤 시점에 앨리스에 관해 생각할 불필요한 시간이라는 요소와 상태 변화라는 요소를 제거하고 철저하게 정적인 관점에서 앨리스의 모습을 묘사하는 것을 가능하게 해준다.

 

타입은 추상화다. 타입을 이용하면 객체의 동적인 특성을 추상화할 있다. 결국 타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화할 있는 효과적인 방법인 것이다.

 

 

동적 모델과 정적 모델

객체를 생각할 가지 모델

 

첫째, 객체가 특정 시점에 구체적으로 어떤 상태를 가지느냐.

이를 객체의 스냅샷(snapshot)이라고 한다.

UML에서 스냅샷은 객체 다이어그램이라고도 불린다.

스냅샷처럼 실제로 객체가 살아 움직이는 동안 상태가 어떻게 변하고 어떻게 행동하는지를 포착하는 것을 동적 모델(dynamic model)이라고 한다.

 

둘째, 객체가 가질 있는 모든 상태와 모든 행동을 시간에 독립적으로 표현하는 것이다.

이를 타입 모델(type diagram)이라고 한다.

모델은 동적으로 변하는 객체의 상태가 아니라 객체가 속한 타입의 정적인 모습을 표현하기 때문에 정적모델(static model)이라 한다.

 

클래스를 만드는 행위가 정적인 모델링

디버그를 위해 상태 변경을 추적하는 것은 동적 모델링을 탐험하는

 

 

클래스

객체지향 프로그래밍 언어에서 정적인 모델은 클래스를 이용해 구현된다.

따라서 타입을 구현하는 가장 보편적인 방법은 클래스를 이용하는 것이다.

타입을 구현한다고 표현한 것은 클래스와 타입은 동일한 것이 아니라는 뜻이다.

타입은 객체를 분류하기 위해 사용하는 개념이다.

반면 클래스는 단지 타입을 구현할 있는 여러 구현 메커니즘 하나일 뿐이다.

실제로 자바스크립트와 같은 프로토타입 기반 언어에는 클래스가 존재하지 않는다.

 

객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체가 수행하는 행동이다.

 

객체지향에서 중요한 것은 동적으로 변하는 객체의 상태와 상태를 변경하는 행위다.

클래스는 타입을 구현하기 위해 프로그래밍 언어에서 제공하는 구현 메커니즘이다.

 

 

 

영국에 지하철이 처음 생기고 이후 런던 지하철 노선을 쉽게 알아볼 지하철 노선도를 만들었다. 이때 실제 지형도에 맞는 위치에 구불구불한 운행 노선과 불규칙적인 간의 거리를 사실적으로 묘사했다. 결과 노선도는 매우 이해하기 어려웠다

 

지하철 노선도 디자인에서 가장 중요한 것은 얼마나 사실적으로 지형을 묘사했느냐가 아니라 역과 사이의 연결성을 얼마나 직관적으로 표현했느냐다.

해리 벡은 사실적인 지형과 축척은 무시하고 사이의 연결성에만 집중한 지하철 노선도를 창조했다. 노선도는 역의 순서와 갈아타는 역의 표시를 제외하면 어느 하나 정확한 것이 없었다. 하지만 현재까지 계속 쓰이고 있는 것은 해리 벡의 지하철 노선도다.

노선도의 핵심은 정확성을 버리고 목적에 집중한 결과다. 지하철 노선도의 목적은 지형이 아닌 연결이다.(추상화)

 

해리 벡은 지하철 승객들을 면밀하게 관찰해 승객이 알아야 하는 사실만 정확하게 표현하고 몰라도 되는 정보는 무시함으로써 이해하기 쉽고 단순하며 목적에 부합하는 지하철 노선도를 창조해 있었다.

, 지하철 노선을 추상화한 것이다.

 

 

추상화를 통한 복잡성 극복

현실은 복잡하며 예측 불가능한 혼돈의 덩어리다.

나비효과는 현실의 복잡성을 이해하고 예측하는 것이 얼마나 어려운지를 설명해 주는 적절한 메타포다.

 

인간이 지닌 인지 능력과 저장 공간은 현실의 복잡성 전부를 받아들이기에는 부족하다. 따라서 인간은 본능적으로 이해하기 쉽고 예측 가능한 수준으로 현실을 분해하고 단순화하는 전략을 따른다.

 

해리 벡이 고안한 추상화는 지형 정보를 제거하고 사이 연결성을 강조함으로써 지하철 노선도 목적에 맞게 현실을 단순화했다.

 

진정한 추상화란 현실에서 출발하되 불필요한 부분을 도려내 가면서 사물의 놀라운 본질을 드러나게 하는 과정이다

 

만약 런던 곳곳의 정확한 위치와 실제 거리를 알고자 했다면 당연히 초기 런던 지하철 노선도가 적절한 노선도이다. 중요한 것은 목적이다.

 

어떤 추상화도 의도된 목적이 아닌 다른 목적으로 사용된다면 오도될 있다.

현상은 복잡하다. 법칙은 단순하다. 버릴 무엇인지 알아내라.

 

 

이 책에서는 추상화를 다음과 같이 정의한다.

추상화

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

 

복잡성을 다루기 위해 추상화는 두 자원에서 이뤄진다[Kramer 2007].

• 첫 번째 자원은 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것이다.

• 두 번째 자원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것이다.

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

 

객체지향 패러다임은 객체라는 추상화를 통해 현실의 복잡성을 극복한다.

추상화의 차원을 반드시 이해하고 적용하자

 

객체지향과 추상화

모두 트럼프일

엘리스 이야기 예시

앨리스는 분명한 경계를 가지는 식별 가능한 하나의 객체다.

3명의 정원사 역시 객체다. 클로버 병사들 역시 객체다. 하얀 토끼도 객체다.

장면에 객체는 제각기 독특한 모습을 하고 있지만, 앨리스는 객체들 대부분을 하나로 아울러 생각하고 있다. '기껏해야 트럼프에 불과해' 그렇다. 앨리스는 객체들 중에서 하얀 토끼를 제외한 모든 객체를 '트럼프'라는 하나의 개념으로 단순화해서 바라보고 있다.

과감하게 차이점을 무시하고 공통점만 취해 단순화해 버렸다.

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

정원사, 병사, 신하, 왕자, 공주, 하객 얼핏 보면 비슷해보이지만 인물들에게는 다양한 측면에서 서로를 구별할 있는 독특한 특징이 있다.

이처럼 명확한 경계를 가지고 서로 구별할 있는 구체적인 사람이나 사물을 객체지향 패러다임에서는 객체라고 한다.

 

앨리스는 인물들을 하나씩 살펴보면서 자신이 알고 있는 '트럼프' 의미에 적합한 인물은 '트럼프'그룹에 포함하고 이외 적합하지 않은 인물은 그룹에서 제외했다.

 

결과적으로 개의 그룹으로 나눴다. 하나는 트럼프 그룹, 나머지 하나는 토끼 그룹이다.

이제 트럼프와 토끼라는 개의 렌즈를 통해 정원을 바라보는 것은 정원에 내재된 복잡성을 효과적으로 감소시킨다.

 

개념

구체적이고 실제적인 객체들 모두를 개별적인 단위로 취급하기에는 인간이 지닌 인지능력은 턱없이 부족하다. 따라서 사람들은 본능적으로 공통적인 특성을 기준으로 객체를 여러 그룹으로 묶어 동시에 다뤄야 하는 가짓수를 줄임으로써 상황을 단순화하려고 노력한다.

 

공통점을 기반으로 객체들을 묶기 위한 그릇을 개념(concept)이라고 한다.

개념이란 일반적으로 우리가 인식하고 있는 다양한 사물이나 객체에 적용할 있는 아이디어나 관념을 뜻한다.

 

개념 적용 예시

길거리를 빠른 속도로 누비는 교통수단 = 자동차 개념 적용

하늘을 나는 교통수단  = 비행기 개념 적용

 

개념을 이용하면 객체를 여러 그룹으로 분류(classification) 있다.

개념은 공통점을 기반으로 객체를 분류할 있는 일종의 체라고 있다.

 

결국 객체는 특정한 개념을 표현하는 그룹의 일원으로 포함된다.

하트 여왕은 트럼프 그룹에 일원

하얀 토끼는 토끼 그룹에 일원

이처럼 객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 객체를 개념의 인스턴스라고 한다.

 

객체란 특정한 개념을 적용할 있는 구체적인 사물을 의미한다. 개념이 객체에 적용됐을 객체를 개념의 인스턴스라고 한다.

 

개념은 세상의 객체들을 거르는 사용하는 렌즈를 제공한다. 렌즈를 통해 세상을 바라보면 수백 수천 개의 다양한 객체가 존재하는 복잡한 세상을 개의 개념만으로 단순화할 있다.

개념은 객체를 분류할 있는 틀을 제공한다.

 

+ Recent posts