"객체지향의 사실과 오해" 책 내용을 체화하기 위해 읽으며 기록하는 노트이다.
자율적인 객체란 스스로 정한 원칙에 따라 판단하고 스스로의 의지를 기반으로
행동하는 객체이다. 스스로의 의지와 판단에 따라 각자 맡은 책임을 수행하는 객체이다.
객체에게 할당되는 책임의 수준 역시 자율적이어야 한다.
하지만 책임은 협력에 참여하는 의도를 명확하게 설명할 수 있는 수준 안에서 추상적이어야 한다.
'어떻게'는 객체가 할 책임의 방법 제한하게 된다.
객체는 메시지를 전송함으로 다른 객체에 접근한다.
메시지 이름과 추가 정보가 필요할 경우 메시지의 인자를 함께 제공한다.
메시지를 수신한 객체는 자신이 해당 메시지를 처리할 수 있는지 확인하며,
처리할 수 있다는 것은 객체가 해당 메시지에 대한 행동을 수행해야 할 책임이 있음을 말한다.
객체는 메시지를 처리하기 위한 방법을 자율적으로 선택할 수 있다.
메시지를 처리하기 위해 내부적으로 선택하는 방법
클래스 안 함수 또는 프로시저를 통해 구현된다.
메시지는 '어떻게' 수행될 것인지 명시하지 않고 '무엇'을 수행할 지를 알려준다.
서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드를 이용해
메시지를 처리할 수 있다.
서로 다른 객체들이 다형성을 만족시킨다는 것은 객체들이 동일한 책임을 공유한다는 것이다.
수신자들은 서로 다른 방식으로 처리하더라도 송신자 관점에서는 수신자들은
동일한 책임을 수행하는 것이다.
다형성은 동일한 역할을 수행할 수 있는 객체들 사이의 대체 가능성을 의미한다.
다형성은 수신자의 종류를 캡슐화 한다.
객체지향 애플리케이션은 클래스를 이용해 만들어지지만 메시지를 통해 정의된다.
객체지향은 시스템을 클래스들의 집합으로 보는 것이 아닌 메시지를 주고받는
동적인 객체들의 집합으로 바라봐야 한다.
협력 관계 속에서 다른 객체에게 무엇을 제공해야 하고 다른 객체로부터
무엇을 얻어야하는가라는 관점에서 접근할 때 훌륭한 책임을 얻을 수 있다.
객체들 간 주고받는 메시지를 기반으로 적절한 역할과 책임, 협력을 발견하는 것이다.
메시지가 수신자의 책임을 결정한다.
어떤 행위가 필요한지를 먼저 결정한 후 이 행위를 수행할 객체를 결정하는 것
여기서 어떤 행위가 바로 메시지이다.
행위를 식별한 후 행위를 수행할 적절한 객체를 찾는다.
협력이라는 문맥 안에서 필요한 메시지를 먼저 결정한 후 메시지를 수신할 객체를 선택한다.
수신된 메시지가 객체의 책임을 결정한다.
메시지를 먼저 결정하고 객체를 선택하는 방식이면, 송신자는 수신자를 모르기 때문에
객체의 상태에 관해 캐물을 수 없다.
객체의 인터페이스는 객체가 수신할 수 있는 메시지의 목록으로 구성되며 어떤 메시지를
수신할 수 있는지가 객체가 제공하는 인터페이스의 모양을 빚는다.
외부에서 접근 가능한 공개된 인터페이스와 내부에서만 접근 가능한 감춰진 인터페이스로 구분된다.
외부에서 접근 가능한 공개된 인터페이스를 공용 인터페이스라고 한다.
모든 인터페이스는 메시지 전송을 통해서만 접근할 수 있다.
객체지향에서 내부 구조와 작동 방식을 가리키는 용어
객체를 구성하지만 공용 인터페이스에 포함되지 않는 모든 것
상태를 어떻게 표현할 것인가는 객체의 구현이다.
메서드를 구성하는 코드 자체는 객체의 구현이다.
객체 외부에 노출되는 인터페이스와 내부에 숨겨지는 구현을 명확히 분리해 고려해야 한다.
구현을 수정하더라도 객체 외부에 영향을 미쳐선 안된다.
객체는 상태와 행위의 조합이다. 이를 캡슐화 하는 것을 데이터 캡슐화라고 한다.
외부에서 객체와 의사소통할 수 있는 고정된 경로를 공용 인터페이스라고 한다.
객체의 자율성이란 객체의 내부와 외부를 엄격하게 분리하는 것이다.
세부사항을 무시함으로써 책임이 적절하게 추상화된다.
책임만 완수할 수 있으면 내부의 방법은 상관 없다.
책임이 자율적일수록 변경에 의해 수정돼야 하는 범위가 좁아진다.
책임이 자율적일수록 협력이 유연해지며 다양한 문맥에서 재활용이 가능해진다.
책임들이 자율적일 수록 객체 존재 이유를 명확히 표현한다.