본문 바로가기
Book/객체지향의 사실과 오해

[정리] 객체지향의 사실과 오해 - 5장

by 따라쟁이개발자 2022. 12. 30.

05 / 책임과 메시지

왕이 모자장수에게 증언을 요청했을 때, 필요한 행동들을 좀 더 상세하게 요청했다면 어땠을까? 

왕이 모자장수에게 "정확히 묘사하라", "표현은 간결하게 하라" 와 같이 상세하게 요청했다면?

 

모자장수는 본인이 할 수 있는 최적의 방법으로 증언할 수도 있었겠지만,

왕이 상세한 요청을 주는 바람에 행동에 제약이 생겼을 수도 있다.

 

5장에서는 디테일한 요청(메시지)은 객체 간 협력에 어떠한 영향을 주는지

객체간 협력을 설계할 때 어떤 것에 초점을 맞춰야 할지 메시지, 인터페이스 등과 연관지어 설명한다.


자율적인 책임

왕이 모자장수에게 증언을 요청했을 때,

필요한 행동들을 좀 더 상세하게 요청했다면 어땠을까? 

 

모자장수는 본인이 할 수 있는 최적의 방법으로 증언할 수도 있었겠지만,

왕이 상세한 요청을 주는 바람에 행동에 제약이 생겼을 수도 있다.

 

'어떻게(how)' 할지는 객체 자율에 맡기고

'무엇(what)' 해야할지에만 초점을 맞춰주면 된다.

 

메시지와 메서드

'증언하라' = 메시지 /  '어제','왕국' = 인자 /  '모자장수' = 수신자

모자장수.증언하라(어제, 왕국)

 

메시지와 메서드

  • 메시지 : 객체의 행동을 유발. 객체간 소통에 사용됨
  • 메서드 : 수신자가 메시지 처리를 위해 사용하는 방법. 내부 구현

 

모자장수.증언하라(어제, 왕국)
앨리스.증언하라(어제, 왕국)

수신자는 메시지에 응답한다. 다만 메시지를 처리하는 방식은 수신자가 정한다.

송신자인 왕의 관점에선 이 객체들이 동일한 책임을 수행하고 있는 중이다.

 

다형성

  • 서로 다른 객체들이 동일한 메시지를 수신하고 서로 다른 구현으로 처리 가능
  • 송신자 관점에선 수신자가 어떤 방식으로 처리했던 동일한 책임을 수행했다고 인지
  •  

적은 정보의 메시지로 협력했을 때 장점

송신자는 메시지에 대한 응답만 받으면 되기 때문에 아래 상황이 가능해진다.

  • 수신자는 타입을 맘대로 바꿀 수 있음 (유연한 협력)
  • 수신자의 수행방식, 구현을 맘대로 바꿀 수 있음 (협력 방식 확장)
  • 다양한 객체들이 수신자의 자리 대체 가능 (협력 재사용)

 

클래스 간 관계에 집중하면 객체 결합도가 높아지지만,

메시지를 사용하면 객체 결합도를 낮출 수 있다.

 

메시지를 따라라

데이터 주도 설계

  • 데이터 중심으로 객체를 설계하는 것. 데이터 구조(내부 구조)를 객체 정의의 일부로 만들어 버림
  • 데이터 주도 설계 시 객체 내부구조를 바꾸기 어려움. 객체 내부로 바꾸면 외부까지 영향을 받게 됨

책임 주도 설계

  • 책임 완수를 목적으로 객체들을 이용해 시스템을 설계
  • 데이터에 대한 결정보다 객체 행위에 대해 먼저 고려
  • 객체가 책임 완수를 위해 다른 객체 도움을 필요로 하는지 판단한 후 (= 메시지가 필요한지 판단)
    메시지가 필요하다고 판단되면 적합한 수신 객체를 선택하는 식으로 설계
  • 수신자는 송신자가 보낸 메시지에 대한 기대(책임)를 만족시켜야 함

What,Who 사이클 / 묻지 말고 시켜라 / 데메테르 법칙 (Law of Demeter)

  • 'What'(메시지 = 어떤 행위를 수행할 것인지), 'Who' (수신 객체 = 누가) 그 행위를 수행할 것인지 결정
  • ‘How’ 어떻게 처리할 지는 묻지 말고, 그냥 수신 객체에게 시키자!
  • 책임을 완수할 것이라 믿고, 어떻게 처리할지는 객체에게 맡긴다
  • 객체를 자율적으로 만들고 캡슐화를 보장한다

 

객체 인터페이스

우리는 TV를 켜기 위해 리모콘에 노출된 버튼을 누를 뿐, 실제 어떤 방식으로 동작하는지는 모른다
리모콘 버튼 사용법만 이해하고 있다면 우리는 원하는 결과를 얻을 수 있다.

 

리모콘과 같이 두 사물이 마주치는 경계지점에서 서로 상호작용할 수 있게 이어주는 방법 또는 장치를

인터페이스라고 하기도 한다. (인터페이스의 범용적 정의)

 

인터페이스의 특징

  • 사용법만 알고 있으면 대상의 내부 구조나 동작 방법을 몰라도 상호 작용이 가능
  • 인터페이스가 변경되지 않고 단순히 내부 구성이나 작동방식이 변경되는것은 사용자에게 영향을 미치지 않음.
  • 인터페이스가 동일하기만 하다면 어떤 대상과도 상호 가능
  • 인터페이스의 구성은 곧 객체가 외부로부터 수신할 수 있는 메시지 목록

 

인터페이스와 구현의 분리

메시지로 구성된 인터페이스는 객체 외부와 내부를 명확하게 구분한다.

객체지향의 힘은 객체의 외부와 내부를 구분하는 것에서 나온다.

객체지향적 사고를 위한 세 가지 원칙

  • 좀 더 추상적인 인터페이스 : 디테일한 메시지는 객체 자율성을 저해하므로 추상적인 메시지를 만들 것
  • 최소 인터페이스 : 외부에서 사용할 필요 없는 인터페이스는 최대한 노출하지 말 것
  • 인터페이스와 구현의 차이가 있다는 것을 인지할 것

 캡슐화

  • 인터페이스, 구현 분리를 위한 설계 방법
  • 상태와 행위를 캡슐화
  • 사적인 비밀을 캡슐화 (변경이 빈번하게 일어나는 사적인 범위는 캡슐화)

 

책임의 자율성이 협력의 품질을 결정한다

책임이 얼마나 자율적인지가 전체적인 협력의 설계 품질을 결정하게 된다.

그 이유는 아래와 같다.

 

첫째, 자율적인 책임은 협력을 단순하게 만든다

둘째, 자율적인 책임은 모자 장수의 외부와 내부를 명확하게 분리한다.

셋째, 책임이 자율적일 경우 책임을 수행하는 내부적인 방법을 변경하더라도 외부에 영향을 미치지 않는다.

넷째, 자율적인 책임은 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다.

다섯째, 객체가 수행하는 책임들이 자율적일수록 객체의 역할을 이해하기 쉬워진다.

댓글