본문 바로가기
📖 독서/오브젝트(Objects)

[오브젝트] 6장. 메시지와 인터페이스

by 말랑한곰탱이 2022. 4. 4.

용어 정리

- 메시지 : 객체가 다른 객체와 협력하기 위해 사용하는 의사소통 메커니즘. 일반적으로 객체의 오퍼레이션이 실행되도록 요청하는 것을 '메시지 전송'이라고 부른다. 메시지는 협력에 참여하는 전송자와 수신자 양쪽 모두를 포함하는 개념이다.

- 오퍼레이션 : 객체가 다른 객체에게 제공하는 추상적인 서비스다. 프로그래밍 언어의 관점에서 퍼블릭 인터페이스에 포함된 메시지다. 메시지가 전송자와 수신자 사이의 협력 관계를 강조하는 데 비해 오퍼레이션은 메시지를 수신하는 객체의 인터페이스를 강조한다. 다시 말해서 메시지 전송자는 고려하지 않은 채 메시지 수신자의 관점만을 다룬다. 메시지 수신이란 메시지에 대응되는 객체의 오퍼레이션을 호출하는 것을 의미한다.

- 메서드 : 메시지에 응답하기 위해 실행되는 코드 블록을 메서드라고 부른다. 메서드는 오퍼레이션의 구현이다. 동일한 오퍼레이션이라고 해도 메서드는 다를 수 있다. 오퍼레이션과 메서드의 구분은 다형성의 개념과 연결된다.

- 퍼블릭 인터페이스 : 객체가 협력에 참여하기 위해 외부에서 수신할 수 있는 메시지의 묶음. 클래스의 퍼블릭 메서드들의 집합이나 메시지의 집합을 가리키는 데 사용된다. 객체를 설계할 때 가장 중요한 것은 훌륭한 퍼블릭 인터페이스를 설계하는 것이다.

- 시그니처 : 시그니처는 오퍼레이션이나 메서드의 명세를 나타낸 것으로, 이름과 인자의 목록을 포함한다. 대부분의 언어는 시그니처의 일부로 반환 타입을 포함하지 않지만 반환 타입을 시그니처의 일부로 포함하는 언어도 존재한다.

- 좋은 인터페이스는 꼭 필요한 오퍼레이션만을 포함하는 '최소한의 인터페이스'어떻게 수행하는지가 아니라 무엇을 하는지를 표현하는 '추상적인 인터페이스'라는 조건을 만족해야 한다.


퍼블릭 인터페이스의 품질에 영향을 미치는 원칙과 기법

1. 디미터 법칙 

: 객체의 내부 구조에 강하게 결합되지 않도록 협력 경로를 제한하라. "오직 하나의 .(도트)만을 사용하라."

- 클래스 내부의 메서드가 아래 조건을 만족하는 인스턴스에게만 메시지를 전송하도록 프로그래밍해야 한다.

  • this 객체
  • 메서드의 매개변수
  • this의 속성
  • this의 속성인 컬렉션의 요소
  • 메서드 내에서 생성된 지역 객체

- 디미터 법칙을 따르는 코드는 메시지 수신자의 내부 구조가 전송자에게 노출되지 않으며, 메시지 전송자는 수신자의 내부 구현에 결합되지 않는다. 따라서 클라이언트와 서버 사이에 낮은 결합도를 유지할 수 있다.

- 디미터 법칙을 위반하는 코드 : screening.getMovie().getDiscountConditions()

 

2. 묻지 말고 시켜라! 

: 훌륭한 메시지는 수신자(객체)의 상태에 관해 묻지 말고 원하는 행동을 시켜야 한다.

- 이 원칙을 따르면 객체의 정보를 이용하는 행동을 객체의 외부가 아닌 내부에 위치시키기 때문에 자연스럽게 정보와 행동을 동일한 클래스 안에 두게 된다.

- 이 원칙에 따르도록 메시지를 결정하다 보면 자연스럽게 정보 전문가에게 할당하게 되고 높은 응집도를 가진 클래스를 얻을 확률이 높아진다.

 

3. 의도를 드러내는 인터페이스

- 수행 방법에 관해서는 언급하지 말고 결과와 목적만을 포함하도록 클래스와 오퍼레이션의 이름을 부여하라.

- 외부의 객체가 메시지를 전송하는 목적을 먼저 생각하도록 만들며, 결과적으로 협력하는 클라이언트의 의도에 부합하도록 메서드의 이름을 짓게 된다.

 

함께 모으기

=> '디미터 법칙'은 객체 간의 협력을 설계할 때 캡슐화를 위반하는 메시지가 인터페이스에 포함되지 않도록 제한한다. '묻지 말고 시켜라' 원칙은 디미터 법칙을 준수하는 협력을 만들기 위한 스타일을 제시한다. '의도를 드러내는 인터페이스' 원칙은 객체의 퍼블릭 인터페이스에 어떤 이름이 드러나야 하는지에 대한 지침을 제공함으로써 코드의 목적을 명확하게 커뮤니케이션할 수 있게 해 준다.

 

4. 명령 - 쿼리 분리 원칙

- 루틴 : 어떤 절차를 묶어 호출 가능하도록 이름을 부여한 기능 모듈

- 프로시저 : 정해진 절차에 따라 내부의 상태를 변경하는 루틴의 한 종류. 값 반환 x

- 함수 :  어떤 절차에 따라 필요한 값을 계산해서 반환하는 루틴의 한 종류. 부수효과 발생 x

- 객체의 상태를 변경하는 명령은 반환 값을 가질 수 없다.

- 객체의 정보를 반환하는 쿼리는 상태를 변경할 수 없다.

=> 코드는 예측 가능하고 이해하기 쉬우며 디버깅이 용이한 동시에 유지보수가 수월해진다.