05.책임과 메시지

  • 훌륭한 객체지향의 세계는 명확하게 정의된 역할과 책임을 지닌 객체들의 상호 협력하는 세계

자율적인 책임

설계의 품질을 좌우하는 책임

  • 요청을 처리하기 위해 객체가 수행하는 행동을 책임이라고 한다.

  • 따라서 자율적인 객체란 스스로의 의지와 판단에 따라 각자 맡은 책임을 수행하는 객체를 의미

  • 협력에 참여하는 객체가 얼마나 자율적인지가 전체 애플리케이션의 품질을 결정

자신의 의지에 따라 증언할 수 있는 자유

  • 객체가 책임을 자율적으로 수행하기 위해서는 객체에 할당되는 책임이 자율적이어야 한다.

'어떻게'가 아니라 '무엇'을

  • 자율적인 책임의 특징은 객체가 '어떻게(how)'해야 하는가가 아니라 '무엇(what)'을 해야 하는가를 설명한다는 것

책임을 자극하는 메시지

  • 메시지는 객체로 하여금 자신의 책임, 즉 행동을 수행하게 만드는 유일한 방법

메시지와 메서드

메시지

  • 하나의 객체는 메시지를 전송함으로써 다른 객체에 접근

  • 메시지 전송은 수신자, 메시지 이름, 인자의 조합

  • 송신자는 메시지 전송을 통해서만 다른 객체의 책임을 요청할 수 있고, 수신자는 오직 메시지 수신을 통해서만 자신의 책임을 수행할 수 있다.

    • 객체가 수신할 수 있는 메시지의 모양이 객체가 수행할 책임의 모양을 결정

  • 메시지는 객체들이 서로 협력하기 위해 사용할 수 있는 유일한 의사소통 수단

  • 외부의 객체는 메시지에 관해서만 볼 수 있고 객체 내부는 볼 수 없기 때문에 자연스럽게 객체의 외부와 내부가 분리

메서드

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

다형성

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

  • 서로 다른 객체들이 다형성을 만족시킨다는 것은 객체들이 동일한 책임을 공유한다는 것을 의미

  • 동일한 역할을 수행할 수 있는 개체들 사이의 대체 가능성을 의미

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

  • (메시지)송신자가 수진자에 대해 매우 적은 정보만 알고 있더라도 상호 협력이 가능하다는 사실은 설계의 품질에 큰 영향을 미친다.

    1. 협력이 유연해진다.

    2. 협력이 수행되는 방식을 확장할 수 있다.

      • 협력의 세부적인 수행 방식을 쉽게 수정할 수 있다.

    3. 협력이 수행되는 방식을 재사용할 수 있다.

송신자와 수신자를 약하게 연결하는 메시지

  • 메시지는 송신자와 수신자 사이의 결합도를 낮춤으로써 설계를 유연하고, 확장 가능하고, 재사용 가능하게 만든다.

메시지를 따라라

객체지향 핵심, 메시지

  • 객체지향 세계에서 객체들이 서로 협력하기 위해 사용할 수 있는 유일한 방법은 메시지를 전송하는 것

  • 객체지향 애플리케이션의 중심 사상은 연쇄적으로 메시지를 전송하고 수신하는 객체들 사이의 협력 관계를 기반으로 사용자에게 유용한 기능을 제공하는 것이다.

  • 객체들의 공통적인 행위와 속성을 포학하기 위해서는 먼저 협력하는 객체들의 관점에서 시스템을 바라봐야 한다.

  • 시스템의 기능을 구현하기 위해 객체가 다른 객체에게 제공해야 하는 메시지에 대해 고민하라.

  • 훌륭한 객체지향 설계는 어떤 객체가 어떤 메시지를 전송할 수 있는가와 어떤 객체가 어떤 메시지를 이해할 수 있는가를 중심으로 객체 사이의 협력 관계를 구성하는 것이다.

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

  • 객체가 책임을 완수하기 위해 다른 객체의 도움이 필요하다고 판단되면 도움을 요청하기 위해 어떤 메시지가 필요한지 결정한다.

  • 메시지를 결정한 후에는 메시지를 수신하기에 적합한 객체를 선택한다.

  • 결과적으로 메시지가 수신자의 책임을 결정한다.

What/Who 사이클

  • 객체 사이의 협력 관계를 설계하기 위해서는 먼저 어떤 행위(what)를 수행할 것인지를 결정한 후에 누가(who) 그 행위를 수행할 것인지를 결정해야 한다는 것이다.

  • 협력이라는 문맥 안에서 객체의 책임을 결정하는 것은 메시지다.

  • 역할을 수행할 객체의 인터페이스를 발견하기 위해 메시지를 이용하는 책임-주도 설계의 핵심 아이디어를 명확하게 표현

  • 협력에 필요한 메시지를 먼저 결정한 후 메시지를 수신할 객체(후보)를 선택하는 것으로 초점이 이동

묻지 말고 시켜라 Style

  • 송신자는 수신자가 어떤 객체인지는 모르지만 자신이 전송한 메시지를 잘 처리할 것이라는 것을 메시지를 전송하는 스타일의 협력 패턴

  • 객체를 자율적으로 만들고 캡슐화를 보장하며 결합도를 낮게 유지시켜 주므로 설계를 유연하게 만든다.

  • 메시지가 어떻게 해야하는지를 지시하지 말고 무엇을 해야 하는지 요청하는 것

객체 인터페이스

인터페이스

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

  • 인터페이스의 특징

    1. 인터페이스의 사용법을 익히기만 하면 내부 구조나 동작 방식을 몰라도 쉽게 대상을 조작하거나 의사를 전달할 수 있다.

    2. 인터페이스 자체는 변경하지 않고 단순히 내부 구성이나 작동 방식만을 변경하는 것은 인터페이스 사용자에게 어떤 영향도 미치지 않는다.

    3. 대상이 변경되더라도 동일한 인터페이스를 제공하기만 하면 아무런 문제 없이 상호작용 할 수 있다.

메시지가 인터페이스를 결정한다.

  • 객체의 인터페이스는 객체가 수신할 수 있는 메시지의 목록으로 구성되며 객체가 어떤 메시지를 수신할 수 있는지가 객체가 제공하는 인터페이스의 모양을 빚는다.

  • 객체가 협력에 참여하기 위해 수행하는 메시지가 객체의 공용 인터페이스의 모양을 암시한다.

  • 책임은 객체가 메시지를 수신했을 때 수행해야 하는 객체의 행동이며, 실제로 객체의 공용 인터페이스를 구성하는 것은 객체가 외부로부터 수신할 수 있는 메시지의 목록이다.

인터페이스와 구현의 분리

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

  • 객체지향적인 사고 방식을 이해하기 위한 세 가지 원칙

    1. 좀 더 추상적인 인터페이스

      • 객체의 자율성을 존중

    2. 최소 인터페이스

      • 외부에서 사용할 필요가 없는 인터페이스는 최대한 노출하지 말자

      • 메시지를 먼저 결정하고 객체를 나중에 선택하는 책임-주도 설계 방법

    3. 인터페이스와 구현 간에 차이가 있다는 점을 인식

      • 객체의 외부를 공용 인터페이스, 객체의 내부를 구현

구현 (implementation)

  • 내부 구조와 작동 방식

  • 메서드를 구성하는 코드

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

  • 객체를 설계할 때 객체 외부에 노출되는 인터페이스와 객체의 내부에 숨겨지는 구현을 명확하게 분리해서 고려해야 한다.

  • 객체 설계의 핵심은 객체를 두 개의 분리된 요소(외부, 내부)로 분할해 설계하는 것

  • 소프트웨어는 항상 변경되기 때문에 인터페이스와 구현의 분리 원칙이 중요 (변경 관리)

  • 객체가 가져야 할 상태와 메서드 구현은 객체 내부에 속한다.

    • 이 부분을 수정하더라도 객체 외부에 영향을 미쳐서는 안 된다.

캡슐화 (=정보 은닉, informaion hiding)

  • 구현을 외부로부터 감추는 것.

  • 객체지향의 세계에서의 캡슐화

    1. 상태와 행위의 캡슐화

      • 객체는 상태와 행위를 한데 묶은 후 외부에서 반드시 접근해야만 하는 행위만 골라 공용 인터페이스를 통해 노출

    2. 사적인 비밀의 캡슐화

      • 외부의 불필요한 공격과 간섭으로부터 내부 상태를 격리

      • 외부의 간섭 없이 변경 가능

  • 객체의 외부와 내부를 명확하게 구분하자. 그러면 설계가 단순하고 유연하고 변경하기 쉬워질 것이다 !

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

  1. 자율적인 책임은 협력을 단순하게 만든다.

    • 자율적인 책임은 의도를 명확하게 표현함으로써 협력을 단순하고 이해하기 쉽게 만든다.

  2. 자율적인 책임은 객체의 외부와 내부를 명확하게 분리한다.

    • 요청하는 객체가 몰라도 되는 사적인 부분이 객체 내부로 캡슐화, 인터페이스와 구현이 분리

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

    • 변경의 파급효과가 객체 내부로 캡슐화되기 때문에 두 객체 간의 결합도가 낮아진다.

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

    • 설계가 유연해지고 재사용성이 높아진다.

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

    • 책임이 자율적일수록 객체의 응집도를 높은 상태로 유지하기 쉬워진다.

  • 자율적인 책임

    • 협력이 이해하기 쉬워짐

    • 객체의 외부와 내부의 구분이 명확해짐

    • 변경에 의한 파급효과를 제한할 수 있음

    • 유연하게 변경할 수 있음

    • 다양한 문맥에서 재활용할 수 있음

  • 책임의 자율화

    • 적절한 추상화

    • 높은 응집도

    • 낮은 결합도

    • 캡슐화 증진

    • 인터페이스와 구현의 명확한 분리

    • 설계의 유연성재사용성 향상

객체지향 강력함의 출발점은 책임을 자율적으로 만드는 것 이것은 선택하는 메시지에 따라 달라진다..

Last updated