[Chap 02] 이상한 나라의 객체
객체지향과 인지 능력
우리 주변에는 객체라고 부를 수 있는 다양한 존재를 볼 수 있다. 길을 걷고 있는 사람들, 도로 위를 다니는 자동차, 가로수, 책상, 모니터 등등,, 인간이 직접적으로 지각할 수 있는 대부분의 객체는 물리적인 결계를 지닌 구체적인 사물이다.
1장에서 객체지향은 실세계를 추상화한 개념이라고 볼 수 있다고 했다. 하지만 이는 틀린 개념이다. 왜냐하면 객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이기 때문이다.
새로운 세계를 창조한다는 뜻은 이번 장에서 굉장히 중요한 개념이다. 하지만 간단히 보자면, 소프트웨어 세계에서는 수동적인 존재가 없다. 물이 스스로 줄어들 수 있고, 전등은 스스로 켜고 꺼질 수 있다. 실세계에서는 있을 수 없는 일이다. 이에 대한 설명을 이상한 나라의 앨리스 를 통해서 설명할 예정이다.
객체, 그리고 이상한 나라
우리가 흔히 아는 이상한 나라의 앨리스의 한 장면이다. 앨리스가 문을 통과하기 위해서 키가 작아져야 되고, 이를 위해서는 음료를 마시거나 토끼가 떨어뜨린 부채로 부채질을 하거나 쐬기벌레가 알려준 버섯의 한쪽 부분을 먹으면 된다. 반대로 커지기 위해서는 케이크를 먹거나 버섯의 반대 부분을 먹으면 된다.
좀더 생각을 해보면 앨리스의 키라는 상태 를 변경하기 위해서는 음료를 마시거나, 부채질을 하거나, 버섯을 먹는 행동 을 해야 된다. 또 이런 행동을 통해서 변한 상태를 통해서 문을 통과하는 행동 을 보이고, 문을 통과하게 된다면 앨리스의 위치가 바뀌게 된다. 하지만 앨리스의 키나 위치가 바뀌어도 앨리스는 앨리스이다. 키와 위치가 같다고 해서 그 사람이 앨리스가 되는 것은 아니기 때문이다. 여기서 앨리스의 특징을 알 수 있다.
- 앨리스는 상태를 가지며 상태는 변경 가능하다
- 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다.
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 결과에 영향을 미친다.
- 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다.
객체, 그리고 소프트웨어 나라
객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를
- 상태
- 행동
- 식별자
를 지닌 실체로 보는 것이 가장 효과적이다.
상태
앨리스의 상태는 무엇이 있을까? 키와 위치가 있다. 키와 위치는 특정 행동을 통해서 변경시킬 수 있었다. 즉, 행동의 결과를 상태라는 개념으로 설명을 한 것이다.
상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다. 왜냐하면 현재 앨리스의 키와 문의 크기를 알게 되면 키가 커져야 되는지, 작아져야 되는지를 알게 되고, 이를 통해서 행동을 예측할 수 있기 때문이다.
상태를 이용하면 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.
프로퍼티: 객체의 상태를 구성하는 모든 특징을 통틀어 이르는 말
프로퍼티의 경우는 시간의 흐름의 따라 변경되는 동적인 값이다.
앨리스가 음료를 마셔서 키가 작아진 것은 앨리스라는 객체와 음료라는 객체가 링크 되어 있는 것이다. 객체와 객체 사이에는 링크가 존재해야만 요청을 보내고 받을 수 있다.
객체는 자율적인 존재이기 때문에 링크가 되어 있다고 하더라도 객체가 다른 객체의 상태를 직접적으로 접근할 수도, 상태를 변경할 수도 없다.
행동
객체가 취하는 행동은 객체 자신의 상태를 변경시킨다. 객체의 행동에 의해 객체의 상태가 변경된다는 것은 행동이 부수 효과 를 초래한다는 것을 의미한다.
예를 들어서 앨리스가 음료를 마시는 행동은 키가 작아지는 부수 효과를 야기한다. 앨리스가 문을 통과하는 행동은 위치를 변화시키는 부수 효과를 초래한다.
결론적으로 상태를 통해서 과거의 행동과는 관련없이 현재의 행동을 쉽게 이해할 수 있다.
객체는 다른 객체와 적극적으로 상호작용을 하며 협력하는 객체들의 공동체에 참여하기 위해 노력한다. 객체가 다른 객체와 메시지를 통해서만 의사소통을 할 수 있다는 것이 중요한 점이다.
앨리스가 키가 작아지기 위해서 음료를 마신다는 것은 앨리스의 상태도 변경이 되지만 음료의 상태도 변경이 된다. 따라서 행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경시키기도 하고 다른 객체에게 메시지를 전달할 수 있다.
근데 이런 식으로 메시지를 통해서 전달된 후에야 다른 객체의 상태를 변경시킬 수 있다는 것은 상태 캡슐화/자율화 와 깊은 관련이 있다. 앨리스가 음료를 마셔서 키가 작아졌지만 반대로 음료도 마찬가지로 앨리스 객체로부터 음료의 양을 줄이라는 메시지를 받고 음료라는 객체가 스스로 결정할 몫이다.
메시지 송신자는 메시지 수신자의 상태 변경에 대해서는 전혀 알지 못한다. 단지 메시지를 전달함으로써 다를 객체가 상태를 스스로 변경시켜줄 것을 믿고 요청하는 것일 뿐이다.
이것이 그 유명한 캡슐화에 대한 개념이다.
객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다. 상태를 외부에 노출시키지 않고 행동을 경계로 캡슐화한다는 것은 결론적으로 객체의 자율성을 높인다.
식별자
객체의 상태를 이요해서 두 값이 같은지 판단할 수 있는 성질을 동등성이라고 한다. 하지만 두 인스턴스가 동일한 것인지는 상태를 통해서 판단할 수 없다. 왜냐하면 앨리스 키가 140cm일 때, 내가 140cm라고 해서 앨리스가 되는 것은 아니기 때문이다.
따라서 서로 다른 인스턴스들은 식별자를 기반을 객체가 같은지를 판단할 수 있다. 이러한 객체의 성질을 동일성이라고 한다.
객체의 특징 정리
- 객체는 상태를 가지며 상태는 변경 가능하다.
- 객체의 상태를 변경시키는 것은 객체의 행동이다.
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 실행 결과에 영향을 미친다.
- 객체는 어던 상태에 있더라도 유일하게 식별 가능하다.
기계로서의 객체
이 장에서는 객체의 캡슐화에 대해서 다루고 있다. 예를 들어서
다마고치가 있다고 생각을 해보자. 여기서는 해당 캐릭터의 상태는 반드시 내가 버튼을 눌러야 변경시킬 수 있다. 그리고 현재 기분이 어떤지 가만히 보고 있다고 알 수 없다. 반드시 내가 버튼을 누르는 행동 을 통해서 다마고치라는 객체의 상태 를 알 수가 있다. 이런게 바료 캡슐화 개념이다.
내가 다마고치에 접근할 수 있는 유일한 방법은 다마고치의 버튼을 누르는 행동을 했을 때이다. 다마고치라는 객체가 제공하는 버튼을 통해서만 상태를 접근할 수 있다.
다시 앨리스 예시로 들어간다면 소프트웨어 세계에서는 ‘음료를 마신다’ 라는 메시지를 수신한 앨리스 객체가 메시지를 처리하던 도중 음료 객체에게 ‘마셔지다’ 라는 메시지를 전송한 것과 같은 것이다. 링크를 통해 연결된 두 객체가 메시지 전송을 통해서 협력하고 있는 것이다.
행동이 상태를 결정한다
행동은 객체가 협력에 참여하는 유일한 방법이다. 객체의 적합성을 결정하는 것은 상태가 아니라 객체의 행동이다.
애플리케이션에서의 협력이란
협력에 필요한 행동을 생각하고
이에 맞는 행동을 수행할 객체를 찾고
객체가 행동을 했을 때의 적절한 상태를 결정하게 된다.
즉, 행동이 상태를 결정하게 된다.
은유와 객체
이 장에서는 다시 ‘객체지향이란 현실 세계의 모방’ 이라는 말에 대해서 다시 하게 된다. 현실 세계와 소프트웨어 세계는 비슷할 수 있다. 하지만 다를 수도 있다. 왜냐하면 우리가 설계를 할 때, 현실 세계와 비슷하게 설계를 한다면 비슷해지고, 완전히 새롭게 설계를 한다면 새로워 지는 것이다.
하지만 중요한 사실은 현실 세계가 소프트웨어 세계와 비슷해 질 수 있다는 것이지, 모방, 추상화(현실 세계를 모방해서 단순화한 것)된 것은 절대 아니다.
왜❓
소프트웨어 세계만의 특별한 특징이 있다. 현실 세계에서는 능동과 수동의 의미가 있지만 소프트웨어 세계에서는 능동의 의미밖에 없다. 앨리스라는 객체가 음료를 마신다고 해서 음료라는 객체는 자동적으로 줄어드는 것이 아니다. 앨리스 객체가 음료 객체에게 메시지를 보내면 이에 맞는 행동을 스스로 결정하여서 상태를 변화시키는 것이기 때문이다. 즉, 음료수가 스스로 줄어들고 결론적으로 양이라는 상태는 줄어든다. 이런 과정을 소름돋게도 한 마디로 표현하면 의인화 이다.
다만 왜 모방, 추상화라는 말이 나왔나 조금이라도 생각을 해보면 현실 속의 객체의 의미 일부가 소프트웨어 세계로 전달되기 때문에 프로그램 내의 객체는 현실 속의 객체에 대한 은유이다.
즉, 현실속의 전화기는 스스로 걸리거나 걸 수 없지만 우리가 알고 있는 전화기라는 존재를 이용해서 소프트웨어 세계에서는 스스로 걸고, 걸릴 수 있는 객체로 만들 수 있다.
마지막으로
이 그림을 보고 이제는 이상한 나라의 앨리스 작가는 진작부터 소프트웨어 세계를 이해하고 있다고 느껴질 것이다. 카드를 의인화해서 마치 객체처럼 표현을 하고 있기 때문이다.
객체지향 설계자로서 우리의 목적은 현실을 모방하는 것이 아니라 단지 이상한 나라를 창조하기만 하면 된다.
정리
정리하기에 앞서,, 일단 위에 저 말,,,, 이상한 나라를 창조하기만 하면 된다…. 이 말이 너무 와닿는다. 너무 멋지다라는 생각이 들었다. 지금까지 객체지향은 현실 세계의 모방, 추상화라는 말만 많이 들었다. 하지만 솔직히 깊게 공감이 되지는 않았다. 그 이유를 오늘 알게 된 것 같다. 결국 현실 세계와 소프트웨어 세계는 은유의 관계이지, 동일, 모방의 관계가 아니기 때문이다. 그래서 결국 우리가 객체를 설계를 한다는 것은 나만의 새로운 이상한 나라는 만들면 되는 것이다. 어떤 객체든 의인화를 통해서 현실 세계와 유사하게 할 수도 있고 아니면 아예 다른 세계를 만들 수 있다.
이번 장에서 정리해야 될 것은 위에 계속 정리해주었던 부분인 것 같다.
- 객체는 상태를 가지며 상태는 변경 가능하다.
- 객체의 상태를 변경시키는 것은 객체의 행동이다.
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 실행 결과에 영향을 미친다.
- 객체는 어던 상태에 있더라도 유일하게 식별 가능하다.
상태, 행동, 식별자에 대한 얘기였으며 행동이 상태를 결정하며, 각각의 객체는 다른 객체에게 매시지를 통해서 행동을 전달하고 수신자의 상태는 모른다는 캡슐화에 대해서 알게 되었다.
댓글남기기