자율적인 책임
설계의 품질을 좌우하는 책임
•
객체지향 공동체를 구성하는 기본 단위는 '자율적'인 객체
•
자율적인 객체: 스스로의 의지와 판단에 따라 각자 맡은 책임을 수행하는 객체
•
협력에 참여하는 객체가 얼마나 자율적인지가 전체 애플리케이션의 품질을 결정한다
자신의 의지에 따라 증언할 수 있는 자유
•
객체지향 세계는 자율적인 객체들의 공동체.
•
객체가 자율적이기 위해서는 객체에게 할당되는 책임의 수준 역시 자율적이어야 한다.
너무 추상적인 책임
•
책임이 수행 방법을 제한할 정도로 구체적인 것도 문제 ex) 증언을 시간 순서대로 구성하라
•
협력의 의도를 명확하게 표현하지 못할 정도로 추상적인 것도 문제 ex) 설명하라
•
추상적이고 포괄적인 책임은 협력을 좀 더 다양한 환경에서 재사용할 수 있도록 유연성 부여
책임은 협력에 참여하는 의도를 명확하게 설명할 수 있는 수준 안에서 추상적이여야 한다
성급한 일반화의 오류를 피하고 현재의 문맥에 가장 적합한 책임을 선택할 수 있는 날카로운 안목이 필요하다
'어떻게`가 아니라 '무엇'을
자율적인 책임은 객체가 어떻게 하는 것이 아닌 무엇 을 해야 하는가를 설명
책임을 자극하는 메시지
메시지는 책임을 수행하도록 만드는 외부에서 전달되는 요청
다른 객체에게 접근할 수 있는 유일한 방법
메시지와 메서드
메시지
하나의 객체는 메시지를 전송함으로써 다른 객체에 접근
메시지 이름 : 왕이 모자 장수에게 전송하는 메시지를 가리키는 '증언하라' 부분
인자 : 메시지를 보낼 때 필요한 추가정보 ex) 특정한 장소와 시간에 목격한 것을 증언하라
메시지 : 메시지 이름 + 인자 ex)증언하라(어제,왕국)
메시지 전송 : 수신자 + 메시지 ex) 모자장수.증언하라(어제,왕국)
메시지 수신받은 객체는 자신이 해당 메시지를 처리할 수 있는지 확인한다.
•
메시지를 처리할 수 있다는 것은 그 책임을 가지고 있다를 의미
•
메시지의 개념은 책임의 개념과 연결
•
송신자는 메시지 전송을 통해 다른 객체의 책임을 요청
•
수신자는 메시지 수신을 통해 책임을 수행
객체는 메시지를 처리하는 방법을 자유롭게 수행할 수 있다.
•
메시지 송신자와는 수신자의 메시지를 제외한 어떤 것도 모른다.
•
객체가 제공하는 메시지는 외부의 다른 객체가 볼 수 있는 공개된 영역(public)
•
메시지를 처리하기 위해 책임을 수행하는 방법은 (private)
메시지는 객체들이 서로 협력하기 위해 사용할 수 있는 유일한 의사소통 수단
메시지를 수신할 수 있다는 것은 객체가 메시지에 해당하는 책임을 수행 할 수 있다.
메서드
메시지를 처리하기 위해 내부적으로 선택하는 방법
객체지향 프로그래밍 언어에서 메서드는 클래스 안에 포함된 함수 또는 프로시저를 통해 구현
메시지는 어떻게 수행 될 것인지는 명시하지 않고 오퍼레이션을 통해 무엇이 실행되기를 바라는지만 명시한다.
메시지를 수신한 객체가 실행 시간에 메서드를 선택할 수 있다는 것은 객체지향 프로그래밍 언어에 핵심적인 특징
다형성
서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것
서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드를 이용해 메시지를 처리할 수 있는 메커니즘
1(메시지) : N(메서드)
서로 다른 객체들이 다형성을 만족시킨다는 것은 객체들이 동일한 책임을 공유하는 것을 의미
송신자의 입장에서 다형성을 가진 객체들을 구별할 필요가 없다.
왕의 입장에서 '증언하라'라는 메세지를 이해할 수 있는 '증인'이라는 객체만 있으면 된다.
→ 다형성은 수신자의 종류를 캡슐화 한다.
동일한 역할을 수행 할 수 있는 객체들 사이의 대체가능성을 의미
다형성은 송신자와 수신자 간의 객체 타입에 대한 결합도를 메시지에 대한 결합도로 낮춤으로써 달성된다.
다형성을 사용하면 메시지를 이해할 수 있는 어떤 객체와도 협력할 수 있는 유연하고 확장가능한 구조를 만들 수 있다.