추상화
추상화란 복잡한 현실을 단순화하기 위해서 사용하는 인간의 가장 기본적인 인지 수단이라고 할 수 있다. 이에 모든 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이다. 그리고 복잡성을 다루기 위해 추상화는 두 차원에서 이루어진다.
- 첫 번째 차원은 구체적인 사물들 간의 공통점은 취하고, 차이점은 버리는 일반화를 통해 단순하게 만드는 것
- 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것
객체지향 페러다임은 객체라는 추상화를 통해 현실의 복잡성을 극복한다. 그리고 객체지향 패러다임을 이용해 유용하고 아름다운 애플리케이션을 개발위해 추상화의 두 차원을 올바르게 이해하고 적용해야 한다.
- 객체: 명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물
- 개념: 공통점을 기반으로 객체들을 묶기 위한 그릇
- 개념을 이용하면 객체를 여러 그룹으로 분류(classification)할 수 있다.
- 인스턴스: 객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴라고 한다.
즉, 개념에 따른 객체와 인스턴스는 다음과 같이도 정의할 수 있다.
- 객체: 특정한 개념을 적용할 수 있는 구체적인 사물
- 인스턴스: 개념이 객체에 적용됐을 때 객체를 개념의 인스턴스라고 한다.
이때, 개념을 이용해 객체들을 분류할 수 있다는 사실이 중요한데. 여기서 분류(classification)란
- 분류: 특정한 객체를 특정한 개념의 객체의 집합에 포함시키거나 포함시키지 않는 작업을 의미한다.
그리고 어떤 객체를 어떤 개념으로 분류할지가 객체지향의 품질을 결정한다. 따라서 객체를 적절한 개념에 따라 분류하는 분류 체계 확립이 중요하다는 것이다.
타입
애플리케이션 안에서 타입이 없는 메모리 내부의 데이터에 특정한 의미를 부여하기 시작하며, 사람들은 데이터의 용도와 행동에 따라 그것들을 분류했다. 즉, 데이터를 목적에 따라 분류하기 시작하면서 타입 시스템이 자라나기 시작했고, 타입 시스템의 목적은 데이터가 잘못 사용되지 않도록 제약사항을 부과하는 것이다. 따라서 전통적인 데이터에 대한 타입에 관련된 2가지 사실은 다음과 같다.
- 타입은 데이터가 어떻게 사용되느냐에 관한 것이다. 즉, 어떤 데이터에 어떤 연산자를 적용할 수 있느냐가 그 데이터의 타입을 결정한다.
- 타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부로부터 철저하게 감춰진다.
이를 통해 객체의 타입에 동일하게 적용할 수 있다.
- 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.
- 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다.
즉, 객체의 타입을 결정하는 것은 객체의 행동뿐이다. 여기서 동일한 행동은 곧 동일한 책임을 의미하며, 동일한 책임은 곧 동일한 메시지 수신을 의미한다. 따라서 동일한 타입에 속한 객체는 내부의 데이터 표현 방식이 다르더라도 동일한 메시지를 수신하고 이를 처리할 수 있다. 여기서 다형성에 의미를 부여할 수 있다.
- 다형성: 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력
결과적으로 다형적인 객체들을 동일한 타입에 속하게 된다. 또한 데이터의 내부 표현 방식과 무관하게 행동만이 고려 대상이라는 사실은 외부에 데이터를 감춰야 한다는 것을 의미한다. 이 원칙을 캡슐화라고 한다.
- 캡슐화: 훌륭한 객체지향 설계는 외부에 행동만을 제공하고, 데이터는 행동 뒤로 감춰야 한다.
정리하면 다음과 같은 외부에 제공하는 행동. 즉, 책임을 먼저 결정하는 책임-주도 설계(Reponsibility-Driven Design)가 나온다.
- 책임-주도 설계: 객체가 외부에 제공해야 하는 책임을 먼저 결정하고, 그 책임을 수행하는데 적합한 데이터를 나중에 결정한 후, 데이터를 책임을 수행하는데 필요한 외부 인터페이스 뒤로 캡슐화한다.
그래서 결국 타입은 추상화다. 타입은 상태를 시간과 무관한 정적인 모습으로 다룰 수 있게 해준다.이런 관점에서 타입은 추상화다.
- 타입: 타입을 이용하면 객체의 동적인 특성을 추상화할 수 있다. 결국 타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화할 수 있는 효과적인 방법인 것이다.
그리고 클래스와 타입은 동일한 것이 아니다. 단지 클래스는 타입을 구현할 수 있는 여러 구현 메커니즘 중 하나일 뿐이다.
정리
- 상태: 동적으로 변하는 객체의 상태
- 행동: 상태를 변겨하는 행동
- 객체를 분류하는 기준은 타입이다.
- 타입을 나누는 기준은 객체가 수행하는 행동이다.
- 클래스는 타입을 구현하기 위한 구현 메커니즘 중 하나
'책 - 요약 정리 > 객체지향의 사실과 오해' 카테고리의 다른 글
객체 지도 (0) | 2023.09.06 |
---|---|
05. 책임과 메시지 (0) | 2023.09.04 |