자율적인 책임
설계의 품질을 좌우하는 책임
객체지향 공동체를 구성하는 기본 단위는 자율적인 객체다. 적절한 책임이 자율적인 객체를 낳고, 자율적인 객체들이 모여 유연하고 단순한 협력을 낳는다. 따라서 협력에 참여하는 객체가 얼마나 자율적인지가 전체 애플리케이션의 품질을 결정한다.
자신의 의지에 따라 증언할 수 있는 자유
객체가 책임을 자율적으로 수행하기 위해서는 객체에게 할당되는 책임이 자율적이어야 한다. 이해를 돕기위해 앨리스의 재판 이야기로 돌아가 보자.


첫 번째 그림의 협력에서 모자장수는 왕에게 증언할 책임은 있지만 증언을 위한 구체적인 방법이나 절차에 대해서는 최대한의 자유를 누린다. 증언이라는 책임만 완수할 수 있다면 나머지 구체적인 방법이나 절차는 자유롭게 선택하도록 허용한다.
두 번째 그림의 협력을 보면, 여기서의 문제는 모자 장수가 증언하기 위해 선택할 수 있는 자유의 범위를 지나치게 제한한다는 점이다. 결국 두 번째 모자 장수는 자신의 의지나 판단력이 아닌 왕의 명령에 의존할 수 밖에 없다.
너무 추상적인 책임
포괄적이고 추상적인 책임을 선택한다고 해서 무조건 좋은 것은 아니다. 협력의 의도를 명확하게 표현하지 못할 정도로 추상적인 것 역시 문제다.
어떻게가 아니라 무엇을
자율적인 책임의 특징은 객체가 어떻게해야 하는가가 아니라 무엇을 해야하는가를 설명한다는 것이다.
메시지와 메서드
메시지
하나의 객체는 메시지를 전송함으로써 다른 객체에 접근한다. 왕이 모자 장수에게 전송하는 메시지를 가리키는 증언하라라는 부분을 메시지 이름 이라고 한다.
메시지를 전송할 때 추가적인 정보가 필요한 경우 메시지의 인자를 통해 추가 정보를 제공할 수 있다. 메시지는 메시지 이름과 인자의 두 부분으로 구성된다.
메시지 전송은 수신자와 메시지의 조합이다. 결국 메시지 전송은 수신자. 메시지 이름, 인자의 조합이 된다.
메서드
모자 장수가 메시지를 처리하기 위해 내부적으로 선택하는 방법을 메서드라고 한다. 왕이 전송한증언하라라는 메시지를 처리하기 위해 모자 장수가 내부적으로 선택하는 증언 방법이 바로 메서드다.
다형성
다형성이란 서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것을 의미한다. 즉, 서로 다른 메서드를 이용해 메시지를 처리할 수 있는 메커니즘을 가리킨다.
다현성에서 중요한 것은 메시지 송신자의 관점이다. 메시지의 수신자들이 동일한 오퍼레이션을 서로 다른 방식으로 처리하더라도 메시지 송신자의 관점에서 이 객체들은 동일한 책임을 수행하는 것이다.
기본적으로 다형성은 대체가능성을 의미한다. 다형성은 객체들의 대체가능성을 이용해 설계를 유연하고 재사용 가능하게 만든다.
유연하고 확장 가능하고 재사용성이 높은 협력의 의미
송신자가 수신자에 대해 매우 적은 정보만 알고 있더라도 상호 협력이 가능하다는 사실은 설계의 품질에 큰 영향을 미친다.
첫째, 협력이 유연해진다.
둘째, 협력이 수행되는 방식을 확장할 수 있다.
셋째, 협력이 수행되는 방식을 재사용할 수 있다.
송신자와 수신자를 약하게 연결하는 메시지
메시지는 송신자와 수신자 사이의 결합도를 낮춤으로써 설계를 유연하고 확장 가능하고 재사용 가능하게 만든다.
메시지를 기반으로 한 두 객체 사이의 이 낮은 결합도가 바로 설계를 유연하고 확장 가능하며 재사용 가능하게 만드는 비결이다.
메시지를 따라라
객체지향의 핵심, 메시지
객체지향 설계의 중신에는 메시지가 위치한다. 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 해야 한다. 따라서 메시지를 중심으로 협력을 설계해야 한다.
what/who 사이클
what/who 사이클이라는 용어가 의미하는 것은 객체사이의 협력 관계를 설계하기 위해서는 먼저 어떤 행위를 수행할지를 정하고 그 후에 누가 그 행위를 수행할 것인지 결정해야 한다는 것이다. 여기서 그 어떤 행위가 바로 메시지이다.
객체 인터페이스
인터페이스
일반적으로 인터페이스란 어떤 두 사물이 마주치는 경계 지점에서 서로 상호작용할 수 있게 이어주는 방법이나 장치를 의미한다.
일반적으로 인터페이스는 세 가지 특징을 지닌다.
첫째, 인터페이스의 사용법을 익히기만 하면 내부 구조나 동작 방식을 몰라도 쉽게 대상을 조작할 수 있다.
둘째, 내부 구성이나 작동방식의 변경은 사용자에게 영향이 없다.
셋째, 대상이 변경되어도 동일한 인터페이스를 제공하기만 하면 상호작용 가능하다.
메시지가 인터페이스를 결정한다.
객체의 인터페이스는 객체가 수신할 수 있는 메시지의 목록으로 구성되며 객체가 어떤 메시지를 수신할 수 있는지가 객체가 제공하는 인터페이스의 모양을 빚는다.
인터페이스와 구현의 분리
객체의 관점에서 생각하는 방법
맷 와이스펠드는 객체지향인 사고 방식을 이해하기 위해서는 다음의 세가지 원칙이 중요하다고 주장한다.
인터페이스와 구현의 분리 원칙
객체를 설계할 때 객체 외부에 노출되는 인터페이스와 객체의 내부에 숨겨지는 구현을 명확하게 분리해서 고려해야 한다. 이를 인터페이스와 구현의 분리 원칙이라고 한다.
객체가 가져야 할 상태와 메서드의 구현은 객체 내부에 속한다. 이 부분을 수정하더라도 객체 외부에 영향을 미쳐서는 안 된다. 외부에 영향을 미치는 변경은 객체의 공용 인터페이스를 수정할 때뿐이다.
캡슐화
객체의 자율성을 보존학 위해 구현을 외부로부터 감추는 것을 캡슐화라고 한다.
상태와 행위의 캡슐화
객체는 상태와 행위의 조합이다. 이 관점에서 캡슐화를 데이터 캡슐화라고 한다.
객체는 상태와 행위를 항데 묶은 후 외부에서 반드시 접근해야만 하는 행위만 골라 공용 인터페이스를 통해 노출한다. 따라서 데이터 캡슐화는 인터페이스와 구현을 분리하기 위한 전제 조건이다.
사적인 비밀의 캡슐화
캡슐화를 통해 변경이 빈번하게 일어나는 불안정한 비밀을 안정적인 인터페이스 뒤로 숨길 수 있다. 일반적으로 불안정한 비밀은 구현과 관련된 세부 사항을 의미한다.
외부에 제공해야 할 필요가 있는 메시지만을 객체의 공용 인터페이스에 포함시키고 개인적인 비밀은 공용 인터페이스의 뒤에 감춤으로써 외부의 불필요한 공격과 간섭으로부터 내부 상태를 격리할 수 있다.