이상한 나라의 객체 | 행동이 상태를 결정한다

728x90

이 장에서 가장 강조하는 말은 바로 "행동이 상태를 결정한다"는 것이다. 처음 객체지향을 배우면 '이 객체는 어떤 데이터를 가져야 할까?'부터 고민하는 경우가 있다. 예를 들어 사람 객체를 만들면 이름, 나이, 성별 같은 속성을 먼저 떠올리는 식이다. 그런데 이 책은 그렇게 상태부터 정하는 방식이 올바르지 않다고 말한다. 오히려 '이 객체는 어떤 행동을 해야 하는가?'를 먼저 생각해야 한다고 강조한다.

상태를 먼저 정하면 문제가 생긴다. 일단, 객체의 속성들이 외부에 너무 많이 드러나게 될 수 있다. 내부의 상태가 숨겨져 있어야 객체답게 행동할 수 있는데, 상태에 집중하다 보면 그 정보를 그대로 밖으로 노출시키기 쉬워진다. 이렇게 되면 객체는 마치 자판기처럼 조작당하기 쉬운 구조가 되고, 내부 구현을 바꾸기 어려워진다. 그리고 객체는 다른 객체들과 협력하기보다는 혼자 고립된 구조가 되기 쉽다. 여러 객체들이 함께 어울려 작동해야 하는데, 상태 위주로 짜인 객체는 마치 외부 요청을 받지 않고 혼자서만 일하는 섬처럼 되어버린다.

무엇보다 중요한 건, 이런 객체들은 재사용하기가 어렵다는 점이다. 행동 중심으로 만든 객체는 어떤 환경에서도 그 행동만 보장하면 되기 때문에 유연하고 재사용이 쉽다. 반면 상태 중심으로 만든 객체는 그 안에 들어 있는 데이터에 너무 의존적이라서, 다른 데서 쓰려면 다시 뜯어고쳐야 할 가능성이 크다.

그래서 이 책에서는 행동을 먼저 생각하라고 말한다. 객체가 시스템 안에서 어떤 역할을 해야 하는지, 즉 어떤 책임을 맡아야 하는지를 먼저 떠올리고, 그 책임을 수행하기 위해 어떤 행동이 필요한지를 정한다. 그리고 그 행동들을 제대로 수행하려면 어떤 정보가 필요한지를 나중에 결정하는 게 더 좋다는 것이다. 즉, "무엇을 할 수 있어야 하는가?"가 우선이고, "그걸 하기 위해 어떤 상태가 필요할까?"는 그 다음이다.

예를 들어 택배를 배송하는 객체를 만든다고 했을 때, 이 객체가 해야 할 행동은 '배송 시작', '배송 완료', '배송 취소' 같은 것들이다. 이런 행동들이 먼저 정의되면, 그걸 하기 위해 현재 위치나 배송 상태 같은 정보가 필요하다는 걸 알게 된다. 이렇게 하면 불필요한 상태를 미리 넣지 않아도 되고, 객체가 해야 할 일에 꼭 맞는 상태만 갖게 된다. 그 결과 객체는 꼭 필요한 정보만 갖고 있고, 역할도 명확해지며, 외부에서 그 객체를 쓸 때도 훨씬 단순해진다.

결국 이 장의 핵심은 단순하다. 객체는 데이터를 담는 그릇이 아니다. 객체는 뭔가 일을 하는 주체다. 그 일이 무엇인지 먼저 고민하고, 그 일을 잘 해내기 위해 필요한 데이터를 생각하라는 것이다. 행동이 곧 책임이고, 객체지향에서 중요한 것은 책임을 다하는 객체를 만드는 것이다. 그렇게 해야 객체들이 서로 잘 협력하고, 변화에 강한 시스템을 만들 수 있다. 이 단순한 원칙이 객체지향의 핵심이라는 점을 다시 상기했다.

 

728x90