티스토리 뷰
728x90
- 객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다.
- 협력에 참여하는 모든 객체들은 역할과 책임을 다하고 있다.
- 객체지향의 핵심은 적절한 객체에게 적절한 책임을 할당하는 것에서 시작된다.
역할, 책임, 협력
역할
- 협력 안에서 차지하는 책임이나 의무를 의미한다.
- 관련성 높은 책임의 집합이다.
협력
"어떤 객체도 섬이 아니다" - 워드 커닝험
- 객체는 역할과 책임을 다하는 동시에, 다른 객체와 협력한다.
- 객체 간의 연쇄적인 요청과 응답의 흐름으로 구성되어 있다.
- 협력이 얼마나 조화를 이루는지는 객체가 결정한다.
- 협력의 품질을 결정하는 것은 객체의 품질이다.
객체의 역할
- 여러 객체가 동일한 역할을 수행할 수 있다.
- 객체를 사용하는 다른 객체의 입장에서는, 어떤 객체가 자신의 요청에 응답하는지는 중요하지 않다.
- 역할은 대체 가능성을 의미한다.
- 대체 가능한 역할은 다형성과도 깊이 연관되어 있다.
- 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
- 다른 객체의 요청을 받아서 어떻게 처리할지는 객체마다 다를 수 있으며, 자율적으로 선택한다.
- 하나의 객체가 동시에 여러 역할을 수행할 수 있다.
협력 속에 사는 객체
객체의 두 가지 덕목
- 충분히 협력적이어야 한다
- 객체는 다른 객체의 요청에 충실히 귀 기울이고 다른 객체에게 적극적으로 도움을 요청해야 한다.
- 다른 객체의 요청에 따라 행동하는 수동적인 존재를 의미하는 것이 아니다.
- 다른 객체의 요청에 복종하는 것이 아닌, 응답할 뿐이다. 요청에 응답할지, 어떤 방식으로 응답할지는 객체 스스로 결정한다.
- 충분히 자율적이어야 한다
- 자신의 행동을 스스로 결정하고 책임진다.
- 다른 객체의 요청에 따르지만, 자신의 판단에 따라 결정하고 행동한다.
상태(state)와 행동(behavior)을 함께 지닌 자율적인 객체
- 객체가 협력에 참여하는 과정 속에서 스스로 판단하고 결정하는 자율적인 존재가 되기 위해서는, 필요한 행동과 상태를 함께 지니고 있어야 한다.
- 객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로부터 나온다.
- 자신의 상태를 직접 관리하고 상태를 기반으로 스스로 판단하고 행동한다.
- 즉, 객체는 다른 객체가 '무엇(what)'을 수행하는지는 알 수 있지만 '어떻게(how)' 수행하는지는 알 수 없다.
협력과 메시지
- 객체 간의 유일한 의사소통 수단을 메시지라고 한다.
- 한 객체가 다른 객체에게 요청하는 것을 "메시지를 전송한다"고 말하고 다른 객체로부터 요청을 받는 것을 "메시지를 수신한다"고 말한다.
- 이때 메시지를 전송하는 객체를 송신자(sender)라고 부르고 메시지를 수신하는 객체를 수신자(receiver)라고 부른다.
- 협력은 메시지를 전송하는 객체와 메시지를 수신하는 객체 사이의 관계로 구성된다.
메서드와 자율성
- 객체가 수신된 메시지를 처리하는 방법을 메서드(method)라고 부른다.
- 메시지와 메서드의 분리는 객체들 간의 자율성을 증진시킨다.
- ex: 바리스타에게 커피 제조를 요청한 캐시어는 커피가 제조될 것이라고 기대하지만, 커피를 제조하는 구체적인 방법에 관해서는 관여하지 않는다. 바리스타는 자신만의 자율적인 방법으로 커피를 제조한다.
- 외부의 요청을 표현하는 메시지와 요청을 처리하는 방법인 메서드를 분리하는 것은 캡슐화(encapsulation)와도 깊이 관련되어 있다.
객체지향의 본질
- 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.
- 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
- 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.
클래스를 지향하는 것이 아닌, 객체를 지향하라
- 클래스를 강조하는 프로그래밍 관점은 객체의 캡슐화를 저해하고 클래스를 서로 강하게 결합시킨다.
- 중요한 것은 어떤 클래스가 필요한가가 아닌 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가다.
- 클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과하다.
- 클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하라.
728x90
'oop' 카테고리의 다른 글
[객체지향의 사실과 오해] 2장 이상한 나라의 객체 (0) | 2024.03.08 |
---|---|
[엘레강트 오브젝트] 1장 출생 (1) | 2024.02.25 |