💡 객체 지향의 패러다임은 지식을 추상화하고 추상화한 지식을 객체 안에 캡슐화함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다.
- 객체지향과 인지 능력
- 객체, 그리고 이상한 나라
- 이상한 나라의 앨리스
- 앨리스 객체
- 객체, 그리고 소프트웨어 나라
- 상태
- 행동
- 식별자
- 기계로서의 객체
- 행동이 상태를 결정한다
- 은유와 객체
- 두 번째 도시전설
- 의인화
- 은유
- 이상한 나라를 창조하라
- 앨리스는 상태를 가지며 상태는 변경 가능하다.
- 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다.
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 결과에 영향을 미친다.
- 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다. (앨리스가 아무리 작아지고 커진다 한들, 앨리스는 그 누구도 아닌 앨리스다.)
❓ 처음에는 물음을 던졌다. “엥? 행동이 상태에 의존적이라고? 오히려 행동이 상태를 변화시키니까 상태가 행동에 의존적이 되는것이 아닌가?”
하지만 아무리 행동
이 상태
를 변화시킨다고 하더라도, 우리가 불을 끄고, 켤 때를 생각해보자.
불을 끄기위해서는 (행동) -> 불이 켜져 있어야한다. (상태)
반대로 불을 키기 위해서는 (행동) -> 불이 꺼져 있어야한다. (상태)
이렇듯, 모든 행동은 결국 주체가 되는 무언가의 상태에 따라 행동이 결정되기 때문에 행동이 상태에 의존한다라고 말한다.
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동으 상태를 변경시킨다.
일본으로 여행을 가기 위한 “Me” 가 객체로 되어있다고 해보자.
나는 일본을 가기위해 여권을 소지했는가가 Key Point 라고 말할 수 있을 것이다.
아무리 돈이 많고, 아무리 시간이 많다고 한들, 내가 항공권이 있는지 없는지 ( true, false ) 에 대한 상태가 결국 내가 일본으로 갈 수 있는지 없는지가 결정되는 것이다.
상태를 이용하면 내가 누구인지, 어떤사람 인지에 대한 과거에 얽매이지 않고, “이름” “나이” “여권의 여부” 로 일본을 갈 수 있는 행동의 결과를 쉽게 예측할 수 있다.
객체가 다른 객체와 협력
하는 유일한 방법은 메시지를 보내는 것
이다. (요청)
메시지를 보내는 방법은 결국 행동
에 의해서 발생되지 않는가?
결국, 협력을 위해서 행동을 해야만 하는 것이다.
이에 따라 행동의 역할은 2가지로 정의할 수 있을 것 같다.
- 행동을 통해, 본인의 상태를 변경시킬 수 있다.
- 행동을 통해, 다른 객체의 메시지를 보낼 수 있다.
우리는 현실세계에서 남자가 음료수를 마신다. 라고 하였을 때, 남자는 능동적인 객체이며, 음료수는 수동적인 객체이기 때문에 음료의 양이 줄어들게 만드는 것은 오직 남자가 될 것이다.
하지만, 객체지향 세계에서는 조금 다르다. 객체의 주체는 모두 스스로가 가지고 있기 때문에 메시지
협력
과 같은 키워드가 추가될 것이다. 예를 들자면, "남자가 음료수를 마신다." 라고 하였을 때, 남자 / 음료수 라는 2가지 객체가 만들어지는데, 능동과 수동의 개념이 사라진다,
남자는 오직 음료수에게 음료수를 마셨다. 라는 메시지 하나만 보낼 수 있으며, 음료의 양이 줄어들고 말고는(상태의 변화) 남자에게 메시지를 전달받은 음료수가 결정할 일이다.
객체는 캡슐안에 본인의 정보를 감춰놓는 것 처럼, 본인의 상태를 숨긴 채 외부로 노출시키지 않는다.
외부로 노출시키는 것은 오직 행동뿐이며, 외부에서 접근할 수 있는 방법도 역시 오직 행동뿐이다.
송신자는 오직 "~해주세요" 라는 메시지만 보낼 수 있을 뿐, 수신자가 어떤 상태인지 그리고 수신자가 어떻게 상태를 변화시키는지는 전혀 알 수도, 알 필요가 없는 것이다.
위에 내용에 남자가 아무리 "음료를 마셨다." 라고 음료수에게 메시지를 보내더라도 음료수가 스스로 본인의 음료수 상태를 줄이지 않는다면, 더이상 남자는 음료수를 어떠한 경우에서도 간섭할 수 없다.
결론적으로 잘 정의된 행동 아래에서 캡슐화를 진행했다면, 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다. 이것이 상태를 캡슐화해야 하는 이유이다.
객체지향에 갓 입문한 사람들이 가장 쉽게 빠지는 함정은, 상태를 중심으로 객체를 바라보는 것이다.
안타깝게도, 상태를 먼저 결정하고 행동을 결정하는 방법은 객체를 파멸로 이끈다.
객체의 주 역할 중 하나는 무엇일까? 바로 협력
이다.
애플리케이션에 필요한 협력을 생각하고, 협력을 위해서 행동이 필요로 된다. 행동을 결정한 후에야 행동에 필요한 정보가 무엇인지 고려하여, 그 과정에서 상태가 결정되어야한다.
협력 안에서 객체의 행동은 결국, 협력에 참여하기 위해 완수해야 하는 책임을 의미한다!
객체지향은 현실세계를 모방하여 생겨났다기에는 다소 받아들이기 힘든 부분이 많다. 어떻게 현실세계와 소프트웨어를 똑같이 볼 수가 있겠는가? 최대한 현실세계처럼 보이려 노력한다. 가 맞는 표현일 것 같다.
그렇다면 어떻게 현실세계처럼 보이려 노력하는걸까? 그것은 바로 객체를 의인화
하여 보는 것이다.
다만 의인화를 현실세계와 가장 크게 다른점이라고 한다면, 모든 객체가 능동적
이라는 것이다. 위 내용중, 남자와 음료수 내용을 기억하겠는가? 여기서 보이듯이, 우리는 음료조차도 의인화하여 주도적으로 행동하는 의인화가 적용되었다는 것을 알 수 있다.
자, 이제 모든 객체가 살아 움직이는 “이상한 나라를 창조해보자”