객체지향의 사실과 오해 정리
객체지향이란 무엇인가?
- 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분리하는 방법이다.
- 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
- 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메소드를 자율적으로 선택한다.
객체지향 설계의 핵심은 객체가 협력을 위해 어떤 책임을 지녀야 하는지를 결정하는 것이다.
객체란?
객체지향 애플리케이션의 아름다움을 결정하는 것이 협력이라면 협력이 얼마나 조화를 이루는지를 결정하는 것이 객체이다. 객체는 다른 객체가 무엇을 수행하는지 알 수 있지만 어떻게 수행하는지에 대해서는 알 수 없다. 객체는 다른 객체의 명령에 복종하는 것이 아니라 요청에 응답할 뿐이다. 객체지향에서는 데이터와 프로세스를 객체라는 하나의 틀 안에 함께 묶어 놓음으로써 객체의 자율성을 보장한다. 객체의 다양한 특성을 이해하려면 객체를 상태, 행동, 식별자를 지닌 실체로 보는 것이 가장 좋다.
상태
상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다. 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티라고 한다. 프로퍼티는 일반적으로 변경되지 않고 고정되기 때문에 정적이고, 프로퍼티 값은 시간의 흐름에 따라 변경되기 때문에 동적이다. 객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.
행동
객체의 상태는 저절로 변경되지 않는다. 행동은 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있다. 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이야 한다.
식별자
식별자는 어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티다. 값은 식별자를 가지지 않기 때문에 상태를 이용한 동등성 검사를 통해 두 인스턴스를 비교해야 한다. 객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스를 비교할 수 있다.
리처드 파인만
현상은 복잡하다, 법칙은 단순하다. 버릴 게 무엇인지 알아내라
추상화란?
추상화를 통한 복잡성 극복하는 방법으로 불필요한 부분을 도려 내가면서 사물의 놀라운 본질을 드러나게 하는 과정이라고 할 수 있다. 즉, 추상화의 목적은 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성을 극복하는 것이다. 복잡성을 극복하는 방법으로 구체적인 사물들 간의 공통점을 취하고 차이점을 버리는 일반화를 통해 단순하게 만드는 것과 중요한 부분을 가지기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 방법이 있다.
객체지향에서는 객체라는 추상화를 통해 현실의 복잡성을 극복한다.
추상화 기법
- 분류와 인스턴스화
분류는 객체의 세부 사항을 숨기고 인스턴스 간에 공융하는 공통적인 특성을 기반으로 범주를 형성하는 과정이다. (역 - 인스턴스화) - 일반화와 특수화
일반화는 범주 사이의 차이를 숨기고 범주 간에 공유하는 공통적인 특성을 강조한다. (역 - 특수화) - 지합과 분해
집합은 부분과 관련된 세부 사항을 숨기고 부분을 사용해서 전체를 형성하는 과정을 가리킨다. ( 분해)
객체란?
객체는 특정한 개념을 적용할 수 있는 구체적인 사물을 의미한다. 개념이 객체에 적용됐을 때 객체를 개념의 인스턴스라고 한다. 인스턴스는 객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때이다. 객체가 존재하는 이유는 행위를 수행하며 협력에 참여하기 위해서다.
소프트웨어 객체는 현실 속의 객체를 모방하거나 추상화한 것이 아니라 단지 의미를 쉽게 유추할 수 있도록 '은유'한 것이다.
타입과 추상화
타입이란?
타입은 우리가 인식하고 있는 다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념을 의미하고 어떤 객체에 타입을 적용할 수 있을 때 그 객체를 타입의 인스턴스라고 한다. 타입의 인스턴스는 타입을 구성하는 외연인 객체 집합의 일부이다. 어떤 객체들이 동일하게 행동한다면 그 객체들은 동일한 타입에 속한다고 말할 수 있다. (동일한 행동 == 동일한 책임 == 동일한 메시지 수신) 타입을 이용하면 객체의 동적인 특성을 추상화하여 복잡성을 단순화할 수 있다. 인간의 인지 능력으로는 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기 어려워 타입을 사용한다. 타입은 시간에 따라 동적으로 변하는 값과 무관한 정적인 모습으로 다룰 수 있다.
객체의 타입을 결정하는 것은 객체의 행동이고 객체가 어떤 데이터를 보유하고 있는지는 타입에 결정하는 데 아무런 영향도 미치지 않는다.
책임과 메시지
책임
책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소다. 객체지향 설계의 예술은 적절한 객체에게 적절한 책임을 할당하는 데 있다. 협력 안에서 객체는 다른 객체로부터 요청이 전송됐을 경우에만 자신에게 주어진 책임을 수행한다. 책임의 범위를 설정하는 것이 중요한데 책임이 너무 구체적인 것도 문제지만 협력의 의도를 명확하게 표현하지 못할 정도로 추상적인 것도 문제이다.
자율적인 책임의 특징은 어떻게 해야 하는가가 아니라 무엇을 해야 하는가를 설명한다는 것이다.
메시지
메시지는 객체로 하여금 자신의 책임, 즉 행동을 수행하게 만드는 유일한 방법이다. 하나의 객체는 메시지를 전송함으로써 다른 객체에 접근한다. 메시지를 수신받은 객체는 자신이 해당 메시지를 처리할 수 있는지 확인 후 처리가 가능할 때 메시지에 해당하는 행동을 수행한다. 따라서 객체가 수신할 수 있는 메시지의 모양이 객체가 수행할 책임의 모양을 결정한다. 메시지는 객체들이 서로 협력하기 위해 사용할 수 있는 유일한 의사소통 수단이다. 메시지는 행동에 대한 요청을 표현하고, 요청을 수행하는 데 필요한 추가적인 정보를 인자를 통해 전달한다.
인터페이스
일반적으로 인터페이스란 어떤 두 사물이 마주치는 경계 지점에서 서로 상호작용할 수 있게 이어주는 방법이나 장치를 의미한다.
인터페이스의 특징
- 사용법을 익히기만 하면 내부 구조나 동작 방식을 몰라도 쉽게 대상을 조작하거나 의사를 전달할 수 있다.
- 인터페이스 자체를 변경하지 않고 단순히 내부 구성이나 작동 방식만을 변경하는 것은 사용자에게 어떤 영향도 미치지 않는다.
- 대상이 변경되더라도 동일한 인터페이스를 제공하기만 하면 아무런 문제 없이 상호작용할 수 있다.
인터페이스와 구현의 분리 원칙
인터페이스와 구현의 분리 원칙은 변경을 관리하기 위한 것이다. 변경될 만한 부분을 객체의 내부에 숨겨 놓는 것을 의미한다. 이런 방법을 캡슐화라고 한다.
캡슐화란?
객체의 자율성을 보존하기 위해 구현을 외부로부터 감추는 것을 캡슐화라고 한다. 객체는 상태와 행위를 캡슐화함으로써 충분히 협력적이고 만족스러울 정도로 자율적인 존재가 될 수 있다. 캡슐화를 정보 은닉이라고 부르기도 한다.
정리
객체 지향은 자주 변경되는 기능이 아니라 안정적인 구조를 기반으로 시스템을 구조화시킨다. 객체지향 세계에서는 모든 객체가 능동적이고 자율적인 존재다.
'책리뷰' 카테고리의 다른 글
그림으로 배우는 네트워크 원리 기억 남기기 (0) | 2022.09.01 |
---|---|
세상을 바꾼 아홉가지 알고리즘 기억 남기기 (0) | 2022.08.23 |
함께 자라기 기억 남기기 (0) | 2022.07.28 |