"객체지향의 사실과 오해" 책의 2부 "이상한 나라의 객체" 부문 리뷰이다.
1부까지는 객체지향이 실세계와 다르며 자율성을 가진 객체들의 협력 시스템이라는 점을 강조했다.
객체들에게 책임감을 부여하고 간섭을 하지 않으려면, 명확한 경계가 필요하다. 어떻게 객체들을 나누어야 하며 객체란 무엇인지 확실히 정의를 해두어야 설계할 때 혼란이 없다. 그렇다면 정의는 과연 무엇일까? 필자도 여러 방면으로 생각을 해보았지만, 가장 근사한 대답은 "일반적인 특징들의 집합" 이 정의라고 생각했다. (주의할 점은 성급한 일반화의 오류는 피해야 한다.)
그래서 이 책에서는 일단 객체들의 특징들을 쉽게 설명하기 위해 '이상한 나라의 엘리스' 동화에 나오는 엘리스를 객체로 보고 특징들을 찾아내기 시작했다. 엘리스가 모험하는 과정에서 키가 작아지고 커져야 비로소 다른 세계를 갈 수 있는데 이런 행동들은 특징점이 있다. 키라는 상태에 따라 행동을 할 수 있고 엘리스의 행동에 의해 위치라는 상태가 바뀐다. 즉 다시 말해, 행동과 상태가 서로를 참조해서 다음 행동들을 결정 짓는다.
게임 프로그래밍 패턴 중 "상태 패턴" 이 있는데 이와 개념이 유사하다. 행동을 했는지 여부를 조건으로 다음 행동을 결정지으면 조건을 삼은 행동이 어떤 행동에 의해 유발되었는지 모두 체크해야 하므로 아래와 같이 복잡한 구조를 띄게 된다.
F 라는 행동 다음에 G 라는 행동을 하려고 한다고 가정하자.
그럼 F 라는 행동이 어떤 행동들로 인해 순차적으로 실행이 되었는지 관련 이력들을 모두 찾아봐야 한다. A 행동으로 부터 온 것인지, C 행동으로 부터 온 것인지 말이다. 예를 들어 F 가 "B 라는 버튼을 누른다" 행동이고 G 가 "플레이어가 점프" 하는 행동이라고 해보자. 게임이 무리없이 진행이 될 것 같아 보인다. 하지만 "이 플레이어는 점프가 가능하게 만들자" 라는 요구사항이 새롭게 요구되면 지금 점프 중인지 체크를 하는 코드를 삽입할 것이다.
행동은 무한하며 과거의 행동들에 대한 이력들을 모두 점검해야 된다. 그러나 상태는 유한하다. (FSM)
상태를 정의하고 상태에 따라 프로그래밍한다면, 더 손쉽게 개발할 수 있게 된다.
친절하게도 객체지향의 사실과 오해라는 책에서는 객체를 정의할 때 위와 같은 특징들을 놓치지 않고 적어두었다.
- 객체는 상태를 가지며 상태는 변경 가능하다.
- 객체의 상태를 변경시키는 것은 객체의 행동이다. 행동의 결과는 상태에 의존적이다.
- 객체는 어떤 상태에 있더라도 유일하게 식별 가능해야 한다.
객체의 정의가 무엇인지 파악하기 위해 위와 같이 특징들을 추출했다. 그렇다면 상태는 무엇일까?
상태는 객체를 표현하는 일반적인 값일 수도 있고 다른 객체일 수도 있다. 객체지향 세계는 객체가 연결되어 있는 세계이기 때문에 다른 객체들을 가지고 있을 수 있다. 하나의 독립적인 자율개체이지만 어떤 객체의 상태를 표현하는 값이 될 수도 있다. 일반적인 값들은 정적이며 프로퍼티라고 하며 객체 안에 포함된 객체들은 동적이며 프로퍼티 값이라고 한다. 객체와 객체 사이에 연결이 되어 있어야만 하나의 상태로 표현될 수 있으며 언제든지 링크를 끊을 수 있다는 특징도 있다.
상태는 어떤 객체가 가지고 있는 정보의 집합으로써 정적인 프로퍼티와 동적인 프로퍼티 값으로 이루어진다는 것이다.
상태를 설명하며 자연스레 행동의 특징이 설명되었다. 행동은 자신의 상태를 변경하는 일련의 작업이다.
그런데 객체는 내부에 다른 객체를 가지고 있을 수도 있다. 직접 내부 객체의 상태를 바꿀 수 없으므로 내부 객체에게 메세지를 전달해야 한다. 개념을 합치면 행동은 자신의 상태를 변경하는 작업 + 내부 객체에게 메세지를 보내는 작업이다.
폐쇄적인 세계이다보니 이상한 특징들이 있다. 내부 객체가 제공하는 행동만 메세지를 보낼 수 있다는 점이다.
그 내부 객체가 행동을 제공하지 않으면 연결 고리가 없는 셈이며 이는 곧 고립이 된다. 그래서 상태부터 고려하지 말고 행동부터 정의하고 그 행동들을 유한 상태로 만들 수 있는 상태들을 정의해야 한다라고 한다.
이를 책임 주도 설계. (Responsibility-Driven Design) 라고 하고 행위가 우선이 되어야 한다라는 점을 나중에 강조하기 위해 복선을 깔아둔다.
2부에서는 객체의 정의가 무엇인지 알 수 있었다. 하지만 아직 특징만 파악했을 뿐 어떻게 나누어야 하는지 알 수 없다.
다음 부에서 설명하게 된다.
'독후감 > 객체지향의 사실과 오해' 카테고리의 다른 글
객체지향의 사실과 오해 (3) (0) | 2022.04.21 |
---|---|
객체지향의 사실과 오해 (1) (0) | 2022.04.03 |