개념의 세 가지 관점
일반적으로 객체의 분류 장치로서 개념을 이야기할 때는 아래의 세 가지 관점을 함께 언급한다[Martin 1998, Larman 2004]
- 심볼 : 개념을 가리키는 간략한 이름이나 명칭
- 내연 : 개념의 완전한 정의를 나타내며 내연의 의미를 이용해 객체가 속하는지 여부를 확인할 수 있다.
- 외연 : 개념에 속하는 모든 객체의 집합
심볼은 예시에서 '트럼트' '토끼'
내연 예시 몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있다는 트럼프 설명이 예시다.
외연 예시 실제 개념에 일치해 개념에 속한 객체들
개념이 심볼, 내연, 외연으로 구성돼 있다는 사실보다는 개념을 이용해 객체를 분류할 수 있다는 사실이 더 중요하다.
객체지향 패러다임이 복잡성을 극복하는 데 사용하는 가장 기본적인 인지 수단이기 때문이다.
객체지향의 세계에서 Class를 사용한다는 사실을 감안하면
분류(Classification)라는 개념이 얼마나 중요한지 실감할 수 있다.
객체를 분류하기 위한 틀
분류란 객체에 특정한 개념을 적용하는 작업이다. 객체에 특정한 개념을 적용하기로 결심했을 때 우리는 그 객체를 특정한 집합의 멤버로 분류하고 있는 것이다.
분류는 객체지향의 가장 중요한 개념 중 하나다.
분류가 적절치 않다면 애플리케이션 유지보수가 어렵고 변화에 쉽게 대처하지 못한다.
분류는 추상화를 위한 도구다
추상화 두 가지 차원
첫 번째, 구체적인 사물 간의 공통점을 취하고 차이점을 버리는 일반화를 통한 단순화
두 번째, 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거해 단순화
개념을 통한 객체 분류는 추상화의 두 가지 차원을 모두 사용한다.
개념은 객체들의 복잡성을 극복하기 위한 추상화 도구다.
추상화를 사용함으로써 우리는 극도로 복잡한 이 세상을 그나마 제어 가능한 수준으로 단순화할 수 있는 것이다.
타입
타입은 개념이다
개념을 대체할 수 있는 용어를 수학에서 차용, 그것은 바로 타입(Type)
타입은 개념과 동일하다. 따라서 타입이란 우리가 인식하고 있는 다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념을 의미한다. 어떤 객체에 타입을 적용할 수 있을 때 그 객체를 타입의 인스턴스라고 한다. 타입의 인스턴스는 타입을 구성하는 외연인 객체 집합의 일원이 된다.
데이터 타입
실제로 컴퓨터는 01로만 이루어져 있다. 이 비트배열이 숫자인지 문자인지 구분이 안간다.
그래서 메모리 안에 데이터에 특정한 의미를 부여하기 시작했다. 그것이 타입 시스템(Type System)이다.
타입 시스템의 목적은 메모리 안의 모든 데이터가 비트열로 보임으로써 야기되는 혼란을 방지하는 것이다.
타입에 관련된 두 가지 중요한 사실
첫째, 타입은 데이터가 어떻게 사용되느냐에 관한 것이다.
숫자형 데이터는 연산을 할 수 있다.
둘째, 타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부로부터 철저하게 감춰진다.
데이터 타입의 표현은 연산 작업을 수행하기에 가장 효과적인 형태가 선택되며, 개발자는 해당 데이터 타입의 표현 방식을 몰라도 데이터를 사용하는 데 지장이 없다.
단지 데이터 타입을 사용하기 위해 연산자만 알고 있으면 된다.
숫자형 데이터에 산술 연산자를 알고 있다면 메모리 내부에 숫자가 어떤 방식으로 저장되는지를 모르더라도 숫자형 데이터를 사용할 수 있다.
이 책에서는 프로그래밍 언어 관점에서 데이터 타입을 다음과 같이 정의한다.
데이터 타입은 메모리 안에 저장된 데이터의 종류를 분류하는 데 사용하는 메모리 집합에 관한 메타데이터다. 데이터에 대한 분류는 암시적으로 어떤 종류의 연산이 해당 데이터에 대해 수행될 수 있는지를 결정한다.
객체와 타입
객체지향 프로그램에서 객체를 일종의 데이터처럼 사용한다.
객체를 타입에 따라 분류하고 그 타입에 이름을 붙이는 것은 결국 프로그램에서 사용할 새로운 데이터 타입을 선언하는 것과 같다.
객체는 행위에 따라 변할 수 있는 상태를 가지고 있다는 사실을 기억하라
그렇다면 객체는 데이터인가? 그렇지 않다.
다시 한번 강조하지만 객체에서 중요한 것은 객체의 행동이다.
상태는 행동의 결과로 초래된 부수효과를 쉽게 표현하기 위해 도입한 추상적인 개념일 뿐이다.
객체가 협력을 위해 어떤 책임을 지녀야 하는지 결정하는 것이 객체지향 설계의 핵심이다.
협력은 객체간 행동으로만 이루어진다.
데이터 타입 두 가지 조언을 객체의 타입에 적용
첫째, 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.
어떤 객체들이 동일한 행동을 수행할 수 있다면 그 객체들은 동일한 타입으로 분류될 수 있다.
둘째, 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다. 객체의 행동을 가장 효과적으로 수행할 수만 있다면 객체 내부의 상태를 어떤 방식으로 표현하더라도 무방하다.
행동이 우선이다
객체의 내부 표현 방식이 다르더라도 객체들이 동일하게 행동한다면 그 객체들은 동일한 타입에 속한다.
결과적으로 동일한 책임을 수행하는 일련의 객체는 동일한 타입에 속한다고 말할 수 있다.
객체가 어떤 데이터를 보유하고 있는지는 타입을 결정하는 데 아무런 영향도 미치지 않는다.(인터페이스, 다형성)
위 원칙을 다르게 해석해보자
동일한 타입에 속한 객체는 내부의 데이터 표현 방식이 다르더라도 동일한 메시지를 수신하고 이를 처리할 수 있다. 다만 내부의 표현 방식이 다르기 때문에 동일한 메시지를 처리하는 방식은 서로 다를 수밖에 없다.
이것은 다형성에 의미를 부여한다.
다형성은 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 뜻한다.
데이터의 내부 표현 방식과 무관하게 행동만이 고려 대상이라는 사실은 외부에 데이터를 감춰야 한다는 것을 의미한다.
좋은 객체지향 설계는 외부에 행동만을 제공하고 데이터는 행동 뒤로 감춰야 한다.
이 원칙을 흔히 캡슐화라고 한다.
행동에 따라 객체를 분류하기 위해서는 객체가 내부적으로 관리해야 하는 데이터가 아니라 객체가 외부에 제공해야 하는 행동을 먼저 생각해야 한다. 이를 위해서는 객체가 외부에 제공해야 하는 책임을 먼저 결정하고 그 책임을 수행하는 데 적합한 데이터를 나중에 결정한 후, 데이터를 책임을 수행하는 데 필요한 외부 인터페이스 뒤로 캡슐화해야 한다.
책임-주도 설계(Responsibility-Driven Design)는 데이터-주도 설계(Data-Driven Design)방법의 단점을 개선하기 위해 고안됐다.
객체를 결정하는 것은 행동이다. 데이터는 단지 행동을 따를 뿐이다. 이것이 객체를 객체답게 만드는 가장 핵심적인 원칙이다.
'IT책, 강의 > 객체지향의 사실과 오해(역할, 책임, 협력 관점에서 본 객체지향)' 카테고리의 다른 글
04 역할, 책임, 협력 - 2 (0) | 2022.12.16 |
---|---|
04 역할, 책임, 협력 - 1 (0) | 2022.12.13 |
03 타입과 추상화 - 1 (0) | 2022.12.01 |
02 이상한 나라의 객체 -3 (0) | 2022.11.28 |
02 이상한 나라의 객체 -2 (1) | 2022.11.25 |