- 객체지향 프로그래밍에서 어플리케이션이 클래스의 집합으로 구성된다는것은 오해다.
- 클래스라는 구현 도구에 지나치게 집착하면 경직되고 유연하지 못한 설계에 이를 수 있다.
- 좋은 객체지향 코드를 얻기 위해서 클래스가 아닌 객체를 지향해야 한다.
- 이는 곧 협력 안에서 객체가 수행하는 책임에 초점을 맞춰야 한다.
- 책임은 객체가 수신할 수 있는 메시지의 기반이 된다.
협력과 메시지
클라이언트-서버 모델
- 메시지는 객체 사이의 협력을 가능하게 하는 매개체다.
- 객체가 다른 객체에게 접근할 수 있는 유일한 방법은 메시지를 전송하는 것뿐이다.
- 협력 안에서 메시지를 전송하는 객체를 클라이언트, 메시지를 수신하는 객체를 서버라고 부른다.
- 협력은 클라이언트가 서버의 서비스를 요청하는 단방향 상호작용이다.
- 객체는 협력에 참여하는 동안 클라이언트와 서버의 역할을 동시에 수행하는 것이 일반적이다.
- 메시지의 집합은 수신 메시지의 집합과 전송 메시지의 집합으로 구성된다.
메시지와 메시지 전송
- 메시지 message : 객체들이 협력하기 위해 사용할 수 있는 유일한 의사소통 수단
- 오퍼레이션명 operation name
- 인자 argument
- 메시지 전송 message sending 또는 메시지 패싱 message passing : 한 객체가 다른 객체에 도움을 요청하는 것
- 메시지 전송자 message sender : 메시지를 전송하는 객체
- 메시지 수신자 message receiver : 메시지를 수신하는 객체
예를들어..
isSatisfiedBy(screening); // 메시지
condition.isSatisfiedBy(screening); // 메시지 전송
메시지와 메서드
- 메시지를 수신했을 때 실제로 어떤 코드가 실행되는지는 메시지 수신자의 실제 타입이 무엇인가에 달려있다.
- 메시지를 수신했을 때 실제로 실행되는 함수 또는 프로시저를 메서드 Method 라고 부른다.
- 동일한 이름의 변수 (condition) 에게 동일한 메시지를 전송하더라도 객체의 타입에 따라 실행되는 메서드가 달라질 수 있다.
- 전통적인 개발자는 어떤 코드가 실행될지 정확하게 알고 있는 상황에서 함수 호출이나 프로시저 호출 구문을 작성한다.
- 객체는 메시지와 메서드라는 두 가지 서로 다른 개념을 실행 시점에 연결해야 하기 때문에 컴파일 시점과 실행 시점의 의미가 달라질 수 있다. 메시지 전송을 코드 상에 표기하는 시점에는 어떤 코드가 실행될 것인지 정확하게 알 수 없다. 실행 시점에 객체의 타입에 따라 달라지기 때문에 메시지에 응답할 수 있는 객체가 존재하고 그 객체가 적절한 메서드를 선택해서 응답해야 한다.
- 실행 시점에 메시지와 메서드를 바인딩하는 메커니즘은 두 객체 사이의 결합도를 낮춤으로써 유연하고 확장 가능한 코드를 작성할 수 있게 한다.
퍼블릭 인터페이스와 오퍼레이션
- 퍼블릭 인터페이스 : 객체가 의사소통을 위해 외부에 공개하는 메시지의 집합
- 오퍼레이션 : 퍼블릭 인터페이스에 포함된 메시지, 수행 가능한 어떤 행동에 대한 추상화. 시그니처라고 부르기도 한다. UML 관점에서는 실행하기 위해 객체가 호출될 수 있는 변환이나 정의에 관한 명세라고 한다.
시그니처
- 시그니처 Signature : 오퍼레이션 또는 메서드의 이름과 파라미터 목록 전체
메서드는 시그니처에 구현을 더한것을 의미한다. 오퍼레이션은 실행 코드 없이 시그니처만 정의한 것.
용어 정리
- 메시지 : 객체가 다른 객체와 협력하기 위해 사용하는 의사소통 매커니즘. 일반적으로 객체의 오퍼레이션이 실행되도록 요청하는 것을 “메시지 전송” 이라고 부른다. 메시지는 협력에 참여하는 전송자와 수신자 양쪽 모두를 포함하는 개념이다.
- 오퍼레이션 : 객체가 다른 객체에게 제공하는 추상적인 서비스다. 메시지가 전송자와 수신자 사이의 협력 관계를 강조하는 데 비해 오퍼레이션은 메시지를 수신하는 객체의 인터페이스를 강조한다. 다시 말해서 메시지 전송자는 고려하지 않은 채 메시지 수신자의 관점만을 다룬다. 메시지 수신이란 메시지에 대응되는 객체의 오퍼레이션을 호출하는 것을 의미한다.
- 메서드 : 메시지에 응답하기 위해 실행되는 코드 블록을 메서드라고 부른다. 메서드는 오퍼레이션의 구현이다. 동일한 오퍼레이션이라고 해도 메서드는 다를 수 있다. 오퍼레이션과 메서드의 구분은 다형성의 개념과 연결된다.
- 퍼블릭 인터페이스 : 객체가 협력에 참여하기 위해 외부에서 수신할 수 있는 메시지의 묶음. 클래스의 퍼블릭 메서드를 집합이나 메시지의 집합을 가리키는 데 사용된다. 객체를 설계할 때 가장 중요한 것은 훌륭한 퍼블릭 인터페이스를 설계하는 것이다.
- 시그니처 : 시그니처는 오퍼레이션이나 메서드의 명세를 나타낸 것으로, 이름과 인자의 목록을 포함한다. 대부분의 언어는 시그니처의 일부로 반환 타입을 포함하지 않지만 반환 타입을 시그니처의 일부로 포함하는 언어도 존재한다.
객체의 퍼블릭 인터페이스가 객체의 품질을 결정한다. 즉, 메시지가 객체의 품질을 결정한다.