ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [객체지향의 사실과 오해] 5. 책임과 메시지
    책/객체지향의 사실과 오해 2023. 1. 22. 18:51
    반응형

    이번 장에서 설명하는 내용

    객체에게 자율성을 부여하면 좋은점

    - 협력을 단순하게 만든다.

    - 외부와 내부를 명확하게 분리할 수 있다. 

    - 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다.


     

    1. 자율적인 책임


    객체지향을 구성하는 기본 단위는 객체이고, 객체는 스스로 정해진 원칙과 의지에 행동하는 자율적인 책임감을 가진다.

    객체가 행동할 때는 다른 객체로부터 요청을 수신 받은 것이고, 이때 요청을 처리하기 위해 수행하는 행동을 책임이라고 한다.

    요청을 송신한 객체는 수신 객체가 어떤 방법을 사용하든 책임만 완수할 수 있으면 아무런 터치를 하지 않는다.

     

    자율적인 책임은 요청을 '어떻게' 수행하느냐가 아니라 '무엇을' 해야 하는가를 설명하는게 중요하다.

    만약 내가 알고리즘 문제를 풀어야 한다면 어떻게 알고리즘 문제를 푸는 것이 중요하지 않다. 시간초과, 메모리초과를 피할 수 있게만 코드를 작성하면 된다. 중요한 것은 알고리즘 문제를 풀려면 무엇을 해야하는 것인지 중요하다. 나의 경우엔 Pycharm과 BOJ를 실행하여 Pycharm에서 코드를 작성하다가 BOJ에 코드를 전달해 제출한다. 코드가 중요한 것이 아니다.


     

     

     

    2. 다형성


    메시지는 협력을 위해 다른 객체에 접근할 수 있는 유일한 방법으로 메시지 이름과 추가적인 정보가 필요하면 메시지 인자를 제공할 수 있다. 그래서 특정 객체에 메시지를 전달하면 그 객체는 메시지에 해당하는 메서드를 실행한다.

     

    메시지와 메서드의 차이를 알았으면 다형성에 대한 내용도 쉽게 받아들일 수 있다.

    다형성은 서로 다른 유형의 객체가 동일한 메시지를 받아도 서로 다르게 반응하는 것이다. 이 말은 같은 메시지를 수신해도 각자 다른 메서드를 실행한다는 것이다. 그래서 다형성을 하나의 메시지와 하나 이상의 메서드의 관계로 이해할 수 있다.

    서로 다른 메서드를 사용하는 객체들이라도 송신 객체는 같은 결과를 기대하기 때문에 송신 객체가 보는 수신 객체의 책임은 동일하다고 볼 수 있다.

    다형성은 동일한 역할을 수행할 수 있는 객체를 언제든지 대체할 수 있다는 것을 의미한다. 이것을 통해 송신자는 수신자가 어떤 객체인지 모르더라도 메시지를 전송할 수 있다. 이것은 다형성이 수신자의 종류를 캡슐화한다는 점이다. 객체가 어떤 것인지 이해할 필요도 없고, 수신 객체의 역할을 할 수 있는지만 확인하면 된다.

    객체지향적으로 설명하면 다형성은 메시지의 결합도를 낮추어서 송신 객체와 수신 객체의 결합도를 낮춘다. 


     

     

     

    3. 메시지


    송신자와 수신자 사이에서 매우 적은 정보로 협력을 한다면 아래의 장점이 생긴다.

    - 협력이 유연해진다. 송신자는 구체적인 수신자의 정보를 모르기 때문에 송신자에게 영향을 주지 않고, 수신자를 유연하게 변경할 수 있다.

    - 협력 수행 방식을 확장할 수 있다. 송신자가 수신자에게 구체적인 요구를 하지 않고, 결과만 중요시하기 때문에 확장할 수 있다.

    - 협력 수행 방식을 재사용할 수 있다. 다양한 객체들이 수신자가 될 수 있기 때문에 다양한 경우에서 재사용할 수 있다.

     

    객체지향의 강력함은 클래스가 아니라 객체들이 주고받는 메시지로부터 나온다.

    클래스는 단지 이런 객체들의 속성과 행위를 텍스트로 표현하는 추상화 도구이다.

    메시지가 객체를 선택할 수 있도록 설계 해야 한다.


    [What / Who 사이클]

    책임 주도 설계의 핵심은 어떤 행위가 필요한지 결정하고, 나중에 이 행위를 할 객체를 정하는 것이다. 이것을 What / Who 사이클이라고 부르는데, 객체의 행위를 결정하는건 객체 자체의 속성이 아닌 메시지라는 것을 뜻한다.

    이런 메시지들이 모이면 객체의 인터페이스를 구성하게 된다. 이때 인터페이스란 송신 객체와 수신 객체가 상호작용을 할 수 있게 이어주는방법이다.


     

     

     

    4. 인터페이스


    인터페이스는 공용 인터페이스와 내부 인터페이스로 나뉜다.

    만약 내가 알고리즘 문제를 풀게 된다면 문제 해결하기는 외부에 공개된 공용 인터페이스이다. 하지만 IDE 실행, 코드 작성하기, 코드를 제출하기에서 어떤 프로그램을 실행할 것인지는 객체마다 다르기 때문에 공개할 필요는 없다. 이것을 내부 인터페이스라고 한다.


    인터페이스 설계는 추상적으로 해야한다.

    1. Pycharm을 실행해서 Python 3으로 알고리즘 문제를 푼 다음에 BOJ에 문제를 제출해서 1000번 문제를 해결하라

    2. BOJ 1000번 문제를 해결하라

     

    1번의 경우엔 구체적인 인터페이스를 제공하기 때문에 자율성이 저해된다. 그리고 Pycharm을 사용하는 것과 같은 외부에서 알 필요가 없는 내용은 최대한 내부 인터페이스로 정의하는게 캡슐화를 고려하면 좋은 방법이다.


    먼저 좋은 인터페이스에 대해서 알아보기 전에 구현이라는 단어에 대해 알아야한다.

    구현이란 객체 내부 구조와 작동 방식을 가리키는 것으로 쉽게 설명하면 객체 외부 인터페이스를 제외한 모든 것이다.

    좋은 인터페이스는 이런 구현에 대한 내용 없이 외부 인터페이스만 알면 충분히 구현할 수 있도록 만들어야 한다는 것이다. 그래서 객체를 설계하게 된다면 외부 인터페이스와 내부 구현 2가지로 나누어 분할해서 설계하면 된다. 이렇게 만들 경우에는 캡슐화를 가질 수 있을뿐만 아니라 객체끼리 인터페이스로 결합을 하게 되어 유연하게 변화에 대응할 수 있게 된다.


     

    반응형

    댓글

Designed by Tistory.