코드로 우주평화

객체지향의 강력함은 책임을 자율적으로 만드는 것에 달려있다 본문

나는 이렇게 본다/객체지향의 사실과 오해

객체지향의 강력함은 책임을 자율적으로 만드는 것에 달려있다

daco2020 2022. 4. 4. 20:48

* 이 글은 책을 읽고 주관적인 생각과 함께 요약 정리한 글입니다.

 

 

 

제목 : 객체지향의 사실과 오해

저자 : 조영호

범위 : 05 책임과 메시지

 

 


 

요약 정리

  • 객체가 행동을 하는 유일한 이유는 다른 객체로부터 요청(메시지)을 수신했기 때문이다. 
  • 요청을 처리하기 위해 객체가 수행하는 행동을 책임이라고 한다.
  • 자율적인 책임은 객체가 '어떻게'해야 하는가가 아니라 '무엇'을 해야 하는가를 설명한다.
  • 메서드 - 메시지를 처리하기 위해 내부적으로 선택하는 방법을 메서드라고 한다.
  • 필요한 경우 메시지에는 인자가 함께 전달된다.
  • 다형성
    • 서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신한다.
    • 객체들은 서로 다른 메서드를 이용해 메시지를 처리할 수 있다.
    • 즉, 동일한 메시지를 서로 다른 메서드(처리방법)를 이용해 처리한다. 
    • 다형성은 동일한 역할(책임)을 수행할 수 있는 객체들 사이의 대체 가능성을 의미한다.
    • 객체 타입의 결합도를 메시지에 대한 결합도로 낮춘다.
    • 다형성을 사용하면 메시지를 이해할 수 있는 어떤 객체와도 협력할 수 있는 유연한 확장 구조를 가진다.
  • 메시지
    • 독립된 객체의 상태와 행위에 대해 고민하지 말고, 시스템의 기능을 구현하기 위해 객체가 다른 객체에게 제공해야 하는 메시지에 대해 고민하라.
    • 메시지가 객체를 선택하게 해야 하며, 메시지를 중심으로 협력을 설계해야 한다.
    • 메시지가 수신자의 책임을 결정한다.
    • 책임 주도 설계의 핵심은 어떤 행위가 필요한지를 먼저 결정한 후에 이 행위를 수행할 객체를 결정하는 것이다. 여기서 어떤 행위가 바로 메시지이다.
    • 메시지를 먼저 결정함으로써 객체의 인터페이스를 발견할 수 있다.
  • 인터페이스
    • 특성 1. 사용법만 알고 있으면 내부 구조나 동작 원리를 몰라도 상호작용이 가능하다.
    • 특성 2. 내부 구조나 동작 원리가 변경되어도 사용자에게 아무런 영향을 미치지 않는다.
    • 특성 3. 인터페이스가 동일하면 어떤 대상과도 상호작용할 수 있다.
    • 객체가 다른 객체와 상호작용하는 방법은 메시지이기 때문에 메시지가 인터페이스의 모양을 빚는다.
    • 여기서 메시지를 수신하는 인터페이스가 공용 인터페이스이다.
    • 너무 구체적인 인터페이스보다는 추상적인 인터페이스를 설계하는 것이 좋다.
    • 최소 인터페이스 - 외부에서 사용하지 않는 인터페이스는 최대한 노출하지 말라.
  • 공용 인터페이스
    • 객체의 공용 인터페이스를 구성하는 것은 객체가 외부로부터 수신하는 메시지의 목록이다.
  • 구현
    • 객체에서 내부 구조와 작동 방식을 가리키는 용어는 '구현'이다.
    • 공용 인터페이스에 포함되지 않는 모든 것이 구현에 포함된다.
    • ex. 상태, 메서드를 구성하는 코드
  • 인터페이스와 구현의 분리 원칙
    • 공개되는 인터페이스와 감춰진 구현은 분리되어야 한다.
    • 그 이유는 변경에 의한 파급효과를 최소화하기 위해서다. (변경을 관리하기 위함)
    • 송신자와 수신자가 구체적인 구현 부분이 아니라 느슨한 인터페이스에 대해서만 결합되도록 만드는 것이다.
    • 변경해도 무방한 것은 감춰진 구현이고, 변경하면 외부에 영향을 미치는 것이 공용 인터페이스이다.
    • 즉, 객체 외부에 영향을 미치는 변경은 객체의 공용 인터페이스를 수정할 때 뿐이다.
    • 변경될 만한 부분을 객체의 내부에 숨겨 놓는 것을 캡슐화라고 한다.
  • 캡슐화(정보 은닉)
    • 상태와 행위의 캡슐화 -> 데이터 캡슐화라고 한다.
    • 사적인 비밀의 캡슐화 -> 불안정한 비밀(구현과 관련된 세부 사항)이 외부의 불필요한 간섭으로부터 격리한다.
  • 책임의 자율성이 중요한 이유
    • 첫째, 자율적인 책임은 협력을 단순하게 만든다. -> 책임이 적절하게 추상화된다.
    • 둘째, 자율적인 책임은 외부와 내부를 명확하게 분리한다. -> 몰라도 되는 부분은 캡슐화, 외부 객체는 인터페이스에만 의존한다.
    • 셋째, 책임이 자율적일 경우 내부 방법이 변경되더라도 외부에 영향을 미치지 않는다. -> 이는 변경의 파급효과가 적어지고 명확해진다. (두 객체 간의 결합도가 낮아진다.)
    • 넷째, 자율적인 책임은 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다. -> 설계가 유연해지고 재사용성이 높아진다.
    • 다섯째, 책임들이 자율적일수록 객체의 역할을 이해하기 쉬워진다. -> 객체의 존재 이유가 명확해지고 객체의 응집도가 높아진다.
    • 요약
      • 책임이 자율적일수록 협력을 이해하기 쉽고, 
      • 객체의 외부와 내부의 구분이 명확해지며, 
      • 변경에 의한 파급효과를 제한할 수 있고, 
      • 유연하게 변경할 수 있는 동시에 다양한 문맥에서 재활용할 수 있다.
    • 키워드
      • 적절한 추상화
      • 응집도 증가
      • 결합도 감소
      • 캡슐화 증진
      • 인터페이스와 구현의 분리
      • 설계의 유연성과 재사용성 향상
    • 결론
      • 객체지향의 강력함은 책임을 자율적으로 만드는 것에 달려있다.
      • 그리고 이것은 메시지에 따라 달라진다.

 

 

 

 

하고 싶은 말

  • 파이썬에서 인터페이스를 다뤄본 적이 없다 보니 그 개념을 이해하기 어려웠다.
  • 메시지를 통해 책임을 자율적으로 만드는 것이 객체를 설계하는데 매우 중요하다는 것을 알게 되었다.