[Object Oriented] 5. 책임과 메시지

이성민·2024년 5월 9일
post-thumbnail

자율적인 책임

객제치향 공동체를 구성하는 단위는 자율적인 객체
즉, 객체가 맡은 책임을 어떻게 수행하는지는 객체 스스로, 자율적으로 판단해서 행동

  • 협력관계 내에서 객체는 요청을 받아서 어떤 행동을 수행
    → 이 수행을 책임이라고 함

  • A 객체와 B 객체가 협력관계 내에 있다고 가정
    → 이때, A객체가 B 객체에게 특수한 요청을 함
    → B 객체는 이 요청을 수행하기만 하면 됨, 어떻게 수행할지는 전적으로 B의 자율에 맡김

  • 재판장이 모자장수에게 증언을 요청

    • “증언하라”
      → 모자장수가 자율적으로 알아서 증언하면 됨
    • “목격했던 장면을 떠올려라” / “떠오르는 기억을 시간 순서대로 ~” / “말로 간결하게 표현”
      → 책임을 어떻게 수행할지를 제한하고 있으므로 원활한 수행이 이루어지지 않을 수도 있음
    • “설명하라”
      → 어떤걸 설명하라는지 너무 모호(추상적)
  • 추상적이고 포괄적인 책임은 협력관계에서 해당 책임을 재사용할 수 있도록 해줌
    → 자율성을 보장할 수 있도록 추상적이되, 협력의 의도를 파악할 수 있을 정도로 뚜렷해야 함

  • 자율적인 책임의 특징은 협력을 위해 어떻게가 아니라 무엇을 해야 하는지가 핵심



메시지와 메서드

메시지

어떤 객체가 다른 객체에게 요청을 하기 위해 전송하는 것

  • 메시지의 구성
    메시지 이름(함수명)인자(전달 값) 으로 구성
    증언하라(어제, 왕국)

  • 메시지 전송의 구성
    → 수신자와 메시지의 조합
    모자장수.증언하라(어제, 왕국)

  • 모자 장수는 증언하라는 메시지를 전달받았을 때, 처리 방법을 자유롭게 선택할 수 있음
    → 모자 장수가 메시지 자체를 변경하지만 않는다면, 책임을 수행하는 방법을 바꿔도 재판장은 이를 알 수 없음
    → 객체의 외부와 내부가 분리되어 있다는 것


메서드

메시지를 처리하기 위해 내부적으로 선택하는 방법


다형성

서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것

서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드를 이용해 처리

  • 다형성을 만족시킨다는 것
    → 객체들이 동일한 책임을 공유한다는 것
    → 메시지 송신자의 입장에서는 다형적인 수신자들을 구별할 필요가 없고, 송신자의 요청만 수행하면 됨
    대체 가능성을 의미

  • 다형성이 설계를 유연하고 재사용 가능하게 만듬
    다형성이 수신자의 종류를 캡슐화

  • 송신자와 수신자 간의 결합도를 메시지에 대한 결합도로 낮춤


유연하고 확장 가능하고 재사용성이 높은 협력의 의미

  • 송신자가 수신자에 대해 매우 조금만 알아도 협력이 가능

    • 협력이 유연해짐
      → 송신자 입장에서 수신자가 메시지를 이해하기만 하면 어떤 타입으로 바꿔도 상관이 없음
      → 송신자는 수신자에게 어떤 메시지를 보낼 수 있는지만 알고 있음
      → 송신자에 대한 파급효과 없이 유연하게 협력 변경 가능
    • 협력이 수행되는 방식을 확장할 수 있음
    • 협력이 수행되는 방식을 재사용할 수 있음
      → 협력에 영향을 미치지 않고 다른 객체가 수신자의 자리를 대체할 수 있음



메시지를 따라라

객체지향의 핵심, 메시지

  • 객체지향의 핵심은 책임을 수행하는 자율적인 객체들의 협력을 통해 어플리케이션을 구축하는 것
    → 협력을 하기 위해 사용할 수 있는 유일한 수단은 메시지의 전송
    → 그렇기 때문에 메시지를 중심으로 객체의 내부 구조를 정의해야 함
    → 독립된 객체의 상태와 행위에 대해 고민하지 말고 시스템의 기능을 구현하기 위해 객체가 다른 객체에게 제공해야 하는 메시지에 대해 고민
    → 객체가 메시지를 선택하는 것이 아닌, 메시지가 객체를 선택하게 하기

책임-주도 설계 다시 살펴보기

책임을 완수하기 위해 협력하는 객체들을 이용해 시스템을 설계하는 방법

  • 책임-주도 설계의 역할, 책임, 협력을 식별
    애플리케이션이 수행하는 기능을 시스템의 책임으로 보는 것에서 시작
    → 시스템의 책임을 동작하게 하기 위해 적절한 협력관계를 찾기
    → 이렇게 찾은 시스템의 책임의 협력관계를 몇 가지 객체들의 책임으로 분산하여 할당

What/Who 사이클

책임-주도 설계를 위해, 어떤 행위가 필요한지를 먼저 결정한 후에 객체를 결정하는 사이클

  • 협력이라는 맥락에서, 객체부터 정하는 것이 아닌, 메시지부터 먼저 결정하는 것
    → 이렇게 메시지들이 모여, 책임을 구성함

묻지 말고 시켜라

  • 책임-주도 설계는 객체가 아닌 객체들이 주고받는 메시지에 집중하여 객체지향의 장점을 극대화
    → 메시지에 집중하게 되면, 메시지 수신자의 캡슐화를 증진시킴
    → 그 결과, 더 유연하고 재사용 가능한 설계할 수 있음 & 결합도가 낮아짐

  • ‘어떻게’보다 ‘무엇을’에 집중하기
    → 객체의 인터페이스의 크기를 급격하게 줄일 수 있음
    → 외부에서 이 객체에 의존하게 되는 영역이 더 줄어듬
    → 협력관계의 송/수신자 사이의 결합도가 줄어듬



객체 인터페이스

인터페이스

두 사물이 마주치는 경계 지점에서 서로 상호작용할 수 있도록 이어주는 방법이나 장치

  • 인터페이스가 갖는 3가지 특징
    • 인터페이스를 사용할 수만 있으면, 내부 동작 원리는 몰라도 됨
    • 인터페이스를 변경하지 않고 내부 동작 원리만 바꾸는 것은 인터페이스에 아무 영향도 끼치지 않음
    • 동일한 인터페이스를 제공하기만 한다면, 손쉽게 사용할 수 있음

책임, 메시지, 그리고 인터페이스

  • 책임의 수행이 자율적이어야 함
    → 자율적이라 함은, 수행만 한다면, 수행 방법은 어떻게 하든 상관 없음

  • 한 객체가 다른 객체에게 요청을 할 때 사용하는 메시지
    → 객체의 인터페이스가 객체가 수행할 수 있는 책임으로 채워져, 인터페이스를 통해 메시지를 전송
    → 특정 메시지를 수신했을 때, 그에 대한 동작을 수행
    → 메서드는 특정 메시지를 수행하는 방법을 의미
    → 이렇게 메시지와 메서드를 구분했기에, 객체의 내부와 외부를 분리된 영역으로 구분할 수 있고, 다형성을 통해 다양한 타입의 객체를 수용할 수 있는 유연성 부과

  • 객체가 책임을 수행하기 위해 메시지를 받기 위한 통로인 인터페이스
    → 객체가 다른 객체와 협력하기 위한 접점



인터페이스와 구현의 분리

객체 관점에서 생각하는 방법

  • 맷 와이스펠드의 인터페이스 관련 세 가지 원칙

    • 좀 더 추상적인 인터페이스
      → 자율적인 책임을 부여한다
      → 단, 너무 추상적이면 역효과
    • 최소 인터페이스
      → 외부에서 사용할 필요가 없는 인터페이스는 최대한 노출하지 않기
      → 외부에 최소한의 정보만 공개할 수 있고, 그만큼 결합도가 낮아지며, 재사용성이 올라감
    • 인터페이스와 구현 간에 차이가 있다는 점을 인식
      → 아래에서 더 설명

구현

객체를 구성하지만 인터페이스에 해당하지 않는 모든 것

  • 객체의 상태
  • 객체의 행동(메서드)

인터페이스와 구현의 분리 원칙

객체 외부에 노출되는 인터페이스와 내부에 숨겨지는 구현을 명확하게 분리해서 고려
→ 외부에 공개되는 인터페이스와 내부에 감춰지는 구현, 두 가지 영역으로 나누어 설계

  • 변경에 대한 안전지대와 위험 지대를 구분
    → 안전지대를 만드는 것은 객체를 더욱 자율적이게 만듬
    → 이 안전지대에서 변경을 주었을 때에는 외부에 어떤 변경사항도 야기해서는 안됨

  • 이 원칙을 수행하기 위한 객체 설계 방법
    캡슐화


캡슐화

객체의 자율성을 보존하기 위해 구현을 외부로부터 감추는 것
(정보 은닉이라고도 함)

상태와 행위의 캡슐화

  • 객체는 스스로 상태를 관리하고, 행동을 내부에 보관
    데이터 캡슐화
    → 인터페이스와 구현을 분리하기 위한 전제 조건

사적인 비밀의 캡슐화

  • 외부 객체가 객체 본인 내부를 알 수 없도록 막고, 일부만 의사소통 가능하게 노출
    인터페이스
  • 외부에 제공할 필요가 있는 메시지들의 모음
    공용 인터페이스
    → 개인적인 비밀은 공용 인터페이스의 뒤에 감춤



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

  • 첫 번째 이유 - 자율적인 책임은 협력을 단순하게 만듬
    → 세부사항을 무시하고 의도만을 명확하게 표현하면, 협력을 이해하기 쉽게 됨
    → 책임이 적절하게 추상화 됨

  • 두 번째 이유 - 자율적인 책임은 모자 장수의 외부와 내부를 명확하게 분리
    → 책임이 자율적이기에, 책임만 완수한다면 어떻게 동작할지는 모자 장수의 몫
    → 요청하는 객체가 몰라도 되는 사적인 부분은 캡슐화
    → 인터페이스와 구현이 분리됨

  • 세 번째 이유 - 책임이 자율적일 경우 책임을 수행하는 내부적인 방법을 변경하더라도 외부에 영향을 미치지 않음
    → 변경에 의한 파급효과가 객체 내부만으로 한정됨
    → 두 객체 간의 결합도가 낮아짐

  • 네 번째 이유 - 자율적인 책임은 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공
    → 다양한 문맥에서 재사용할 수 있게 됨
    → 설계가 유연해지고, 재사용성이 높아짐

  • 다섯 번째 이유 - 객체가 수행하는 책임들이 자율적일수록 객체의 역할을 이해하기 쉬워짐
    → 책임이 자율적일수록 객체의 응집도를 높은 상태로 유지하기 쉬워짐

profile
TIL을 기록하기 위한 게시글들 | 노션에 기록해 둔 것들 옮길 예정 !

0개의 댓글