Taking baby-developer steps

[객체지향의 사실과 오해] 2. 이상한 나라의 객체 -2 객체는 "행동"을 가진다. + 캡슐화 본문

CS 지식/객체지향

[객체지향의 사실과 오해] 2. 이상한 나라의 객체 -2 객체는 "행동"을 가진다. + 캡슐화

Surin Lee 2023. 10. 30. 00:07

- 상태와 행동

 객체는 자율적이다. 그러나 객체의 상태가 저절로 변경되진 않는다. 객체의 상태는 자발적인 행동에 의해 변경된다. ("내"가 현관문을 통과하면 나의 위치(상태)가 '집 안'에서 '집 밖'으로 바뀐다) 객체가 취하는 행동은 자신의 상태를 변경 시키는 등의 부수 효과(side effect)를 발생 시킨다. 이상한 나라의 앨리스에서, 앨리스가 물을 마신 행동이 앨리스 자신의 키를 작게 만들(side effect)고 동시에 물병 안에 있는 물의 양도 감소(side effect)시켰다. 앨리스가 문을 통과하는 행동은 앨리스의 위치를 변화시킨(side effect)다.

 그러나 당시의 행동은 이전에 일어난 과거 행동에 영향을 받는 것을 지난 포스팅을 통해 알았다. 따라서 행동은 상태에 영향을 받는다. 이를 정리하면 다음과 같다.

  • 객체의 행동은 상태에 영향을 받는다.("문을 통과한다"는 행동은 앨리스의 키(상태)가 충분히 작거나 크지 않으면 실패한다)
  • 객체의 행동을 상태를 변화시킨다.("문을 통과한다"라는 행동은 앨리스의 위치(통로->정원)를 변경 시킨다)

- 협력과 행동

 어떤 객체도 섬이 아니다. 객체는 다른 객체와 적극적으로 상호작용하며 '협력하는 공동체'에 참여한다. 이때 다른 객체와 협력하는 유일한 방법은 "요청 메시지"를 보내는 것이다. 요청 메시지를 수신한 객체는 요청을 처리하기 위해 적절하게 행동한다. 이 행동에 따라 객체는 자신과 다른 객체의 상태 변경을 유발 할 수 있다. 

객체가 "행동"해서 발생하는 결과는 두 가지 관점에서 해석할 수 있다. 두 관점의 부수효과가 명확해야한다.

  • 객체 자신의 상태 변경
  • 행동 내에서 협력하는 다른 객체에 대한 메시지 전송

이 책에서는 객체의 "행동"을 다음과 같이 정의한다.

  • 행동이란 수신된 "요청 메시지"에 응답하기 위해 반응하는 활동이다.
  • 행동의 결과로 자신의 상태를 변경하거나 다른 객체에게 "요청 메시지"를 전달(요청 연쇄 발생)할 수 있다.
  • 행동은 외부에 가시적이어야한다.(행동을 통해서만 다른 객체와 협력하므로)

- 상태 캡슐화

 객체는 자신의 상태를 스스로 관리하는 자율적인 존재이다. 앨리스 객체가 링크를 가진 음료 객체를 "마신다"라는 행동을 했다고 하자. 이때 앨리스객체가 음료의 상태(남은 양)를 직접 변경 할 수 없다. 단지 "음료를 5ml 마셨다"라는 메시를 전달한다. 5ml만큼 남은 양(상태)을 줄이는 것은 메시지를 전달받은 음료 객체가 스스로 해야한다. 단, "앨리스가 음료를  5ml 마셨다"를 요청하는 객체와 이 메시지를 받는 객체 모두 서로의 상태 변경(앨리스는 키가 줄고 음료는 양이 줄어든다)은 전혀 알지 못한다. 메시지를 수신한 객체 스스로가 상태를 결정할지 말지 결정한다. 송신자가 수신자의 상태 변경을 기대하더라도 수신자가 상태를 변경하지 않는다면 송신자가 간섭할 수 있는 어떤 여지도 없다.

 => 이것이 캡슐화이다! 객체가 외부에 노출하는 것은 행동뿐이고, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동 뿐이다!

상태를 외부에 노출 시키지 않고 행동을 경계로 캡슐화하는 것은 객체의 자율성을 높인다. 객체의 자율성이 높아질수록 객체의 지능도 높아진다. 협력에 참여하는 객체들의 지능이 높아질 수록 협력은 유연하고 간결해진다. => 이것이 캡슐화를 해야하는 이유다.

 


C++ 내장 라이브러리인 STL에서 벡터 및 맵을 만들때 내부 배열 및 트리 구조체를 private으로 두고 get 및 set 메서드로 통해 구현한 clang 의 코드 방식을 보고 "원래 이렇게 하는 건가보다"하고 넘겼었다. 왜 상태를 나타내는 속성등을 객체 내부 private으로 두고 번거롭게 조회 및 업데이트 메서드를 따로 만들어줘야하는지 이번 장의 행동 관련 이야기에서 그 의문을 풀 수 있었다. 상태 캡슐화를 프로그램의 유연성과 간결성과 직접적으로 연관지어 생각해본적 이 없었는데, 깊은 인상을 줬다.

Comments