도서/객체지향의 사실과 오해

객체지향의 사실과 오해 2장 요약

w.llama 2025. 6. 15. 20:19

객체, 그리고 소프트웨어 나라

객체란 식별 가능한 개체 또는 사물이다. 객체는 만질수 있는 구체적인 사물일 수 있고, 시간처럼 추상적인 개념일 수도 있다. 객체는 구별이 가능한 식별자, 특징적인 행동, 변경이 가능한 상태를 가지고 소프트웨어 안에서 저장된 상태실행 가능한 코드를 통해 구현된다.

 

상태가 왜 필요한가? 객체가 주변 환경과의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤 일이 발생 했느냐에 좌우된다.

예를 들어 여행을 가기위해 비행기를 타려면 탑승전 항공권을 발권해야한다. 이때 발권해놨다면 비행기 좌석에 앉아 출발하지만 발권을 하지 않았다면 비행기를 탈수없듯 이런 발권을 했냐 안했냐의 과거의 행동이 비행기 탑승여부에 영향을 주는것이다.

상태를 이용하면 과거의 모든 행동이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명이 가능하다. 또한 상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다. 따라사 상태는 근본적으로 세상의 복잡성을 완화 하고 인지 과부화를 줄일 수 있는 중요한 개념이다.

 

상태와 프로퍼티의 상관관계

객체의 상태는 단순한 값과 객체의 조합으로 표현 할 수 있는데, 이때 객체의 상태를 구성하는 모든 특징을 객체의 프로퍼티라고 한다. 예를들어 맥북이라고 하면 맥북의 cpu, ram, 용량이 맥북의 프로퍼티가 된다 일반적으로 프로퍼티는 변경되지 않고 고정되기 때문에 '정적'이다. 하지만 프로퍼티의 값은 시간에 따라 변경되기 때문에 '동적'이다 즉 명사는 변하지 않고 그 해당하는 값은 변동된다.  또한 맥북에 보조 배터리를 연결해 배터리를 충전한다고 생각해보자, 맥북이라는 객체와 보조배터리의 객체 사이의 의미 있는 연결을 링크라 한다 이 링크가 있어야 서로 요청을 주고 받을수 있다. 하지만 이 링크가 끊긴다면 맥북은 보조배터리의 남은 배터리양이나 이런 정보를 알 수 없다.

 

상태와 행동

객체의 상태는 저절로 변하지 않는다. 객체의 상태를 변경하는것은 객체의 자발적인 행동뿐이다. 객체의 행동은 상태에 영향을 받고, 상태를 변경한다.

 

협력과 행동

객체는 자신에게 주어진 책임을 완수하기 위해 다른 객체를 이용하고 다른 객체에게 서비스를 제공한다. 객체는 다른 객체와 적극적으로 상호작용하며'협력하는 객체들의 공동체'에 참여하기 위해 노력한다. 객체끼리 협력하는 유일한 방법은 요청을 보내는것이다. 수신 받은 객체는 요청을 처리하기위한 적절한 방법에 따라 행동하여 응답한다. 이때 객체는 수신된 요청에 따라 적절히 행동하며 협력을 참여하고 그 결과로 자신의 상태를 변경한다. 

 

캡슐화

객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다. 객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할수 있는 방법도 역시 행동뿐이다.

 

식별자

객체란 인간의 인지 능력을 이용해 식별 가능한 경계를 가진 사물을 의미한다. 객체가 식별 가능하다는 것은 객체를 서로 구별할 수 있는 특정한 프로퍼티가 객체안에 있고 그 프로퍼티를 식별자라 한다.

 

행동이 상태를 결정한다

처음 객체지향에 입문한 사람들이 가장 쉽게 빠지는 함정은 상태 중심으로 객체를 바라보는것이다. 즉 상태를 먼저 결정하고 행동을 나중에 결정하는데 이러한 설계는 3가지 문제가 있다.

첫째, 상태를 먼저 결정할 경우 캡슐화가 저해된다. 상태에 초점을 맞출 경우 상태가 객체 내부로 깔끔하게 캡슐화 되지 못하고 공용 인터페이스에 그대로 노출될 수 있다.

둘째, 객체를 협력자가 아닌 고립된 섬으로 만든다. 객체가 필요한 이유는 애플리케이션의 문맥 내에서 다른 객체와 협력하기 위해서다. 하지만 상태를 먼저 고려하게되면 되려 협력에 적합하지 못한 객체를 창조하게 된다.

셋째, 객체의 재사용성이 저하된다. 객체의 재사용성은 다양한 협력에 참여할 수 있는 능력에서 나온다 . 상태에 초점을 맞춘 객체는 다양한 협력에 참여하기 어렵기 때문에 재사용성이 저하될 수 밖에없다.

따라서 협력에 참여하는 휼륭한 객체를 만들기 위해선 상태가아니라 행동에 초점을 맞춘다.

객체지향 설계는 애플리케이션에 필요한 협력을 생각 -> 협력에 필요한 행동을 생각 -> 행동을 수행할 객체를 선택 하는방식으로 수행된다. 행동을 결정한 후에 행동에 필요한 정보가 무엇인지를 고려하게 되며 이 과정에서 필요한 상태가 결정된다.

협력 안에서 객체의 행동은 결국 객체가 협력에 참여하면서 완수해야 하는 책임을 의미한다. 따라서 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야한다 즉 책임-주도 설계는 협력이라는 문맥 안에서 객체의 행동을 생각하도록 도움으로써 응집도 높고 재사용 가능한 객체를 만들 수 있게 한다.