객체지향의 사실과 오해 5장 : 책임과 메시지

일단 해볼게·2023년 6월 19일
0

book

목록 보기
5/13

자율적인 책임을 가진 객체

  • 어떻게 해야하는가가 아니라 무엇을 해야하는가를 설명

메시지

  • 메시지 이름 + 인자의 조합
  • 메시지 전송
    • 수신자 + 메시지 이름 + 인자의 조합
  • 수신자는 메시지 수신을 통해서 자신의 책임 수행
  • 메시지를 처리하기 위해 책임을 수행하는 방법은 외부의 다른 객체가 볼 수 없다.

메서드

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

다형성

  • 서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것
  • 서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드를 이용해 메시지를 처리할 수 있는 메커니즘
  • 다형성을 만족시킨다. = 객체들이 동일한 책임을 공유한다.
  • 객체들의 대체 가능성을 이용해 설계를 유연하고 재사용 가능하게 만든다.
    • 송신자가 수신자의 종류를 모르더라도 메시지 전송 가능
    • 다형성은 수신자의 종류를 캡슐화

클래스

  • 클래스가 코드를 구현하기 위해 사용할 수 있는 중요한 추상화 도구인 것은 사실이지만 객체지향의 강력함은 클래스가 아니라 객체들이 주고받는 메시지로부터 나온다.
    • 실제로 애플리케이션을 살아있게 만드는 것 → 객체
    • 객체들의 윤곽을 결정하는 것 → 메시지
  • 클래스를 중심에 두는 설계는 유연하지 못하고 확장하기 어렵다.
    • 메시지가 아니라 데이터를 중심으로 객체를 설계하는 방식은 객체의 내부 구조를 객체 정의의 일부로 만들기 때문에 객체의 자율성을 저해한다.
  • 데이터에 대한 결정을 뒤로 미루면서 객체의 행위를 고려하기 위해서는 객체를 독립된 단위가 아니라 협력이라는 문맥 안에서 생각해야 한다.

훌륭한 객체지향 설계

  • 어떤 객체가 어떤 메시지를 전송할 수 있는가와 어떤 객체가 어떤 메시지를 이해할 수 있는가를 중심으로 객체 사이의 협력 관계를 구성하는 것
  • 객체가 메시지를 선택하는 게 아닌 메시지가 객체를 선택해야 한다.

What/Who 사이클

  • 어떤 행위를 수행할 것인지 결정 후 누가 그 행위를 수행할 것인지 결정
    • 행위 : 메시지
  • 필요한 메시지를 먼저 결정한 후에 메시지를 수신하기에 적합한 객체를 선택 → 수신된 메시지가 객체의 책임을 결정
  • 수신 가능한 메시지들이 모이면 객체의 인터페이스를 구성한다.

묻지 말고 시켜라(데메테르 법칙)

  • 메시지를 먼저 결정하고 객체가 메시지를 따르게 하는 설계 방식
  • 객체를 자율적으로 만들고 캡슐화를 보장하며 결합도를 낮게 유지시켜 준다.

인터페이스

  • 어떤 두 사물이 마주치는 경계 지점에서 서로 상호작용할 수 있게 이어주는 방법이나 장치
  • 특징
    • 인터페이스의 사용법을 익히기만 하면 내부 구조나 동작 방식을 몰라도 쉽게 대상을 조작하거나 의사를 전달할 수 있다.
      • 자동차 내부를 몰라도 자동차를 운전하는 데에는 지장이 없다.
    • 인터페이스 자체는 변경하지 않고 단순히 내부 구성이나 작동 방식 만을 변경하는 것은 인터페이스 사용자에게 어떤 영향도 미치지 않는다.
      • 자동차 엔진을 변경했다 하더라도 운전하는 방법에는 변함이 없다.
    • 대상이 변경 되더라도 동일한 인터페이스를 제공 하기만 하면 아무런 문제 없이 상호작용 할 수 있다.
      • 하나의 자동차를 운전할 수 있다면 다른 자동차도 운전 가능하다.
  • 공용 인터페이스
    • 내부에서만 접근 가능한 사적인 인터페이스와 구분하기 위해 공개된 인터페이스

인터페이스와 구현의 분리

    1. 좀 더 추상적인 인터페이스
    • 수신자의 자율성을 보장
    1. 최소 인터페이스
    • 인터페이스를 최소로 유지하면 객체의 내부 동작에 대해 가능한 한 적은 정보만 외부에 노출할 수 있다.
      • 객체의 내부를 수정하더라도 외부에 미치는 영향을 최소화
    1. 인터페이스와 구현 간에 차이가 있다는 점을 인식
    • 객체의 외부와 내부를 분리 = 객체의 공용 인터페이스와 구현을 명확하게 분리

캡슐화 (정보 은닉)

  • 객체의 자율성을 보존하기 위해 구현을 외부로부터 감추는 것
    • 상태와 행위의 캡슐화
      • 객체는 상태와 행동을 하나의 단위로 묶는 자율적인 실체
      • 상태와 행위를 한데 묶은 후 외부에서 반드시 접근해야만 하는 행위를 골라 공용 인터페이스를 통해 노출
    • 사적인 비밀의 캡슐화
      • 외부의 객체는 공용 인터페이스에만 의존해야 하고 구현 세부 사항에 대해서는 직접적으로 의존해서는 안된다.
profile
시도하고 More Do하는 백엔드 개발자입니다.

0개의 댓글