요즘 재밌게 읽고 있는 '객체지향 사실과 오해' 를 정리해볼려고 합니다.
보통 학교 수업에서 java 나 C++ 수업을 듣게 된다면, 교재나 강의 자료에서 항상 강조되는 언어들이 있었습니다.
그 중 하나가 바로 '클래스' 였습니다. 올바른 클래스 설계가 마치, 올바른 객체지향과 연결된다는 설명이 많았습니다.
저 또한 이러한 고정적인 관념으로 코딩을 하는 실수를 많이 저질렀던 것 같습니다. 그도 그럴 것이, 대부분의 자료가 '클래스' 관점에서 쉽게 객체지향을 풀어내려고 했기에 다소 틀린 관점도 내포했다고 생각이 듭니다.
책에 저자는, 1장에서 강조하는 것이 객체의 역할, 책임, 협력에 집중해야 한다고 말합니다.
또한 '객체간의 협력의 관점' 에서 '설계'를 진행하라고 합니다.
2장에 해당 내용이 나옵니다 - 상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 나쁜 설계이다.
즉, 저희가 여태 알고 있던 클래스를 먼저 설계하고나서, 객체끼리 소통을 하는 방식은 잘못됐다고 말합니다.
1장 내용 요약
1장 흔한 오해 - 클래스가 객체지향의 핵심
- 객체의 역할, 책임, 협력에 집중해야함
독립적인 하나의 단위로 인식할 수 있는 모든 사물은 객체다.
객체의 다양한 특성을 효과적으로 설명하기 위해
- 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체
책에서 객체의 정의
객체란 식별 가능한 개체 또는 사물이다.
객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수도 있다.
객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가짐
소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현
2장 내용 요약
상태 (47P)
객체가 주변 환경과의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤 일이 발생했느냐에 좌우된다.
⇒ 비행기 이용, 그전에 미리 탑승권 구매 했는가? 영향
어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존한다.
(과거에 꾸준히 열심히 공부 ⇒ 좋은 개발자가 되있는)
상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.
(결국 상태가 필요한 것은, 과거의 행동에 대해 의존성을 가지지 않기 위해?)
상태는 근본적으로 세상의 복잡성을 완화하고 인지 과부하를 줄일 수 있는 중요한 개념
⇒ 심플하게 객체를 이해하기 위해 필요한게 ‘상태(State)’ 이다.
엘리스의 ‘키'와 ‘위치', 음료 케이크 ‘양', 문이 열려있는지 ‘여부'
⇒ 분명하게 인식할 수 있음에도 객체의 영역에 포함 X
⇒ 숫자, 문자열, 양, 속도, 시간, 날짜, 참/거짓 단순한 값들은 객체 X
이러한 종류는 객체의 프로퍼티(property) 이고, 책의 예시에서는 엘리스가 음료를 들고 있는가?
표현때 핑료한 엘리스의 키, 위치, 음료가 엘리스의 프로퍼티가 된다.
프로퍼티는 ‘정적', 프로퍼티 값은 시간이 흐름에 따라 변경되기에 ‘동적’
책에서 객체의 상태 정의
상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현
객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성
객체의 프로퍼티는 단순한 값(속성State)과 다른 객체를 참조하는 링크로 구분할 수 있다.
추가: 프로퍼티는 속성과 연관관계의 두 가지 종류로 구분, 연관관계는 정적인 관계(Value)를 의미, 링크(객체간의 참조)는 연관관계의 인스턴스다.
⇒ 객체지향의 기본 사상 = 상태와 상태를 조작하기 위한 행동을 하나의 단위로 묶는 것
⇒ 객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장함으로써 객체의 자율성 유지
행동(53P)
객체의 행동에 의해 객체의 상태가 변경된다는 것은, 행동 → 부수 효과(side effect)를 초래
상태를 이용하면 복잡한 객체의 행동을 쉽게 이해할 수 있다.
(ex: 엘리스 키가 40cm 이하라면 문 통과 가능)
객체의 행동으로 인해 발생하는 결과는 두 가지 관점 설명
- 객체 자신의 상태 변경
- 행동 내에서 협력하는 다른 객체에 대한 메세지 전송
책에서 행동 정의
- 행동이란 외부의 요청 또는 수신된 메세지에 응답하기 위해 동작하고 반응하는 활동
- 행동의 결과로 객체는 자신의 상태를 변경하거나, 다른 객체에게 메세지 전달
- 객체는 행동을 통해 다른 객체와의 협력에 참여하므로, 행동은 외부에 가시적
현실 세계 객체와 객체지향 세계의 객체 사이 차이
- 현실에서 음료 객체는 스스로 아무것도 못함, 수동적인 존재
- 객체지향 세계에선 엘리스가 메세지를 통해 음료 객체와 협력, 음료 양을 줄이는 것은 메세지를 전달 받은 음료 객체 스스로의 몫
캡슐화 의미
⇒ 엘리스가 음료를 마시고, 음료에게 druken(quantity) 메세지 전달
⇒ 이것으로 엘리스의 키가 줄어든다거나 음료의 양이 줄어든다는 상태 변경 예상하지 못함
⇒ 객체가 외부에 노출하는 것은 행동뿐이고, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동
객체의 상태를 변경할지 여부는 객체 스스로 결정
자율적인 객체는 스스로 판단하고 스스로 결정하기에, 객체의 자율성이 높아질수록 객체의 지능도 높아진다. 협력에 참여하는 객체들의 지능이 높아질수록 협력은 유연하고 간결해진다.
⇒ 객체의 자율성 높아질수록, 협력은 유연하고 간결
⇒ 상태를 잘 정의된 행동 집합 뒤로 캡슐화 ⇒ 객체의 자율성 높이고 협력 단순화 및 유연화
(캡슐화의 이유)
식별자(57P)
값: 숫자,문자열,날짜,시간,금액 등과 같이 변하지 않는 양을 모델링
- 값의 상태는 변하지 않기 때문에 불변 상태(immutable state)를 가진다고 말함
- 값의 상태가 같으면 두 인스턴스는 동일한 것으로 판단, 다르면 다른 두 인스턴스로 판단
- 상태를 이용해 두 값이 같은지 판단 가능 동등성(equality), 값의 상태가 결코 변하지 않기에
- 객체는 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태 변경한다. 따라서 객체는 가변 상태(mutable state)를 가진다고 말한다.
- 타입이 같은 두 객체의 상태가 완전히 똑같아도, 두 객체는 독립적인 별개의 객체로 다뤄야 한다.
- (이름이 엘리스고 키와 몸무게가 같아도, 어느 누구도 둘을 같은 엘리스 라고 생각하지 않음. 얼굴 몸 형태 등이 다 다르므로)
- 식별자를 기반으로 객체가 같은지 판단할 수 있는 성질 = 동일성(identical)
식별자 = 어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티다.
값은 식별자 X, 상태를 이용해 동등성(equality) 검사를 통해 두 인스턴스 비교
객체는 상태가 변경될 수 있기 때문에 식별자를 이용해 동일성(identical) 검사를 통해 두 인스턴스 비교
참조 객체(reference object), 엔티티(entity)는 식별자를 지닌 객체
값 객체(value object)는 식별자를 가지지 않는 값 의미
객체 최종 요약
- 객체는 상태를 가지며 상태는 변경 가능하다
- 객체의 상태를 변경시키는 것은 객체의 행동
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술
- 행동의 순서가 실행 결과에 영향을 미친다
- 객체는 어떤 상태에 있더라도 유일하게 식별 가능
행동이 상태를 결정한다. 64~65P
상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 나쁜 설계이다.
- 캡슐화 저해
- 객체를 협력자가 아닌 고립된 섬으로 만듬
- 객체의 재사용성이 저하된다.
객체는 다른 객체와 협력하기 위해 존재한다. 객체의 행동은 객체가 협력에 참여하는 유일한 방법이다. 객체가 적합한지 결정하는 것은 그 객체의 상태가 아닌 행동이다.
⇒ 협력 안에서 객체의 행동 = 객체가 협력에 참여하면서 완수해야할 책임
‘협력’이라는 문맥 안에서 객체의 행동을 생각하면, ‘응집도’ 높고 ‘재사용 가능한' 객체 만들 수 있다.
(위 내용이 책에서 가장 강조 되고, 이 책을 한마디로 요약 할 수 있는 부분이라고 생각합니다.)
저자: 창조한 객체의 특성을 상기시킬 수 있다면, 현실 속의 객체의 이름을 이용해 객체를 묘사해라, 그렇지 않으면 깔끔하게 현실을 무시하고 자유롭게 새로운 세계(객체)를 설계해라 (엘리스의 이상한나라 처럼)
- 해당 저자의 말은, 객체 지향 언어를 처음 접하는 사람들이 알게되면 더 좋을 내용이라고 생각했습니다. 객체간의 협력을 설계 할 때, 어떠한 근거로 기준을 나눌 때 도움이 되는 말이라고 느꼈습니다.
1장 오해 - 클래스가 객체지향의 핵심
- 객체의 역할, 책임, 협력에 집중해야함
- 객체간의 협력, 객체의 행동의 관점에서 객체지향을 바라보는 관점이 필요
2장 오해 - 객체지향 = 현실세계 모방
- 현실 속에서 수동적인 존재가 소프트웨어 객체로 구현될 때는 능동적으로 변함 (음료 객체)
- 소프트웨어 객체의 특징 = 의인화 (능동적인 존재가 됨, 현실에서 트럼프 카드는 스스로 뒤집을 수도 말할수도 없음, 전화기는 스스로 통화 버튼 누르지 못함)
- 소프트웨어 안에 구축되는 객체지향 세계는 현실 모방 X, 현실의 모습을 조금 참조, 오히려 현실 속의 객체보다 더 많은 특징과 능력을 보유한 객체들로 넘쳐남 / 궁긍적인 목적 = 현실과 전혀 다른 새로운 세계 창조
- ‘협력’이라는 문맥 안에서 객체의 행동을 생각하면, ‘응집도’ 높고 ‘재사용 가능한' 객체 만들 수 있다.