[도서] 객체지향의 사실과 오해 - Ch2. 이상한 나라의 객체

곽동현·2023년 12월 8일
0

Ch2. 이상한 나라의 객체

💡 객체 지향의 패러다임은 지식을 추상화하고 추상화한 지식을 객체 안에 캡슐화함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다.

📃목차

  • 객체지향과 인지 능력
  • 객체, 그리고 이상한 나라
    • 이상한 나라의 앨리스
    • 앨리스 객체
  • 객체, 그리고 소프트웨어 나라
    • 상태
    • 행동
    • 식별자
  • 기계로서의 객체
  • 행동이 상태를 결정한다
  • 은유와 객체
    • 두 번째 도시전설
    • 의인화
    • 은유
    • 이상한 나라를 창조하라


📌 모든 객체는 상태를 가진다. (앨리스가 이상한나라로 가기위한 일화중..)

  • 앨리스는 상태를 가지며 상태는 변경 가능하다.
  • 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다.
    • 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
    • 행동의 순서가 결과에 영향을 미친다.
  • 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다. (앨리스가 아무리 작아지고 커진다 한들, 앨리스는 그 누구도 아닌 앨리스다.)

📌 행동은 상태에 의존적이다.

❓ 처음에는 물음을 던졌다. “엥? 행동이 상태에 의존적이라고? 오히려 행동이 상태를 변화시키니까 상태가 행동에 의존적이 되는것이 아닌가?”

하지만 아무리 행동상태를 변화시킨다고 하더라도, 우리가 불을 끄고, 켤 때를 생각해보자.
불을 끄기위해서는 (행동) -> 불이 켜져 있어야한다. (상태)
반대로 불을 키기 위해서는 (행동) -> 불이 꺼져 있어야한다. (상태)

이렇듯, 모든 행동은 결국 주체가 되는 무언가의 상태에 따라 행동이 결정되기 때문에 행동이 상태에 의존한다라고 말한다.

📌 행동과 상태 사이의 관계

  • 객체의 행동은 상태에 영향을 받는다.
  • 객체의 행동으 상태를 변경시킨다.

🔍 왜 상태가 필요할까?

일본으로 여행을 가기 위한 “Me” 가 객체로 되어있다고 해보자.
나는 일본을 가기위해 여권을 소지했는가가 Key Point 라고 말할 수 있을 것이다.
아무리 돈이 많고, 아무리 시간이 많다고 한들, 내가 항공권이 있는지 없는지 ( true, false ) 에 대한 상태가 결국 내가 일본으로 갈 수 있는지 없는지가 결정되는 것이다.

상태를 이용하면 내가 누구인지, 어떤사람 인지에 대한 과거에 얽매이지 않고, “이름” “나이” “여권의 여부” 로 일본을 갈 수 있는 행동의 결과를 쉽게 예측할 수 있다.


📌 협력과 행동

객체가 다른 객체와 협력하는 유일한 방법은 메시지를 보내는 것이다. (요청)
메시지를 보내는 방법은 결국 행동에 의해서 발생되지 않는가?

결국, 협력을 위해서 행동을 해야만 하는 것이다.
이에 따라 행동의 역할은 2가지로 정의할 수 있을 것 같다.

  • 행동을 통해, 본인의 상태를 변경시킬 수 있다.
  • 행동을 통해, 다른 객체의 메시지를 보낼 수 있다.

📌 현실 세계의 객체 vs 객체지향 세계의 객체 (차이점)

우리는 현실세계에서 남자가 음료수를 마신다. 라고 하였을 때, 남자는 능동적인 객체이며, 음료수는 수동적인 객체이기 때문에 음료의 양이 줄어들게 만드는 것은 오직 남자가 될 것이다.

하지만, 객체지향 세계에서는 조금 다르다. 객체의 주체는 모두 스스로가 가지고 있기 때문에 메시지 협력과 같은 키워드가 추가될 것이다. 예를 들자면, "남자가 음료수를 마신다." 라고 하였을 때, 남자 / 음료수 라는 2가지 객체가 만들어지는데, 능동과 수동의 개념이 사라진다,

남자는 오직 음료수에게 음료수를 마셨다. 라는 메시지 하나만 보낼 수 있으며, 음료의 양이 줄어들고 말고는(상태의 변화) 남자에게 메시지를 전달받은 음료수가 결정할 일이다.

🔍 이것이 캡슐화!

객체는 캡슐안에 본인의 정보를 감춰놓는 것 처럼, 본인의 상태를 숨긴 채 외부로 노출시키지 않는다.
외부로 노출시키는 것은 오직 행동뿐이며, 외부에서 접근할 수 있는 방법도 역시 오직 행동뿐이다.

송신자는 오직 "~해주세요" 라는 메시지만 보낼 수 있을 뿐, 수신자가 어떤 상태인지 그리고 수신자가 어떻게 상태를 변화시키는지는 전혀 알 수도, 알 필요가 없는 것이다.

위에 내용에 남자가 아무리 "음료를 마셨다." 라고 음료수에게 메시지를 보내더라도 음료수가 스스로 본인의 음료수 상태를 줄이지 않는다면, 더이상 남자는 음료수를 어떠한 경우에서도 간섭할 수 없다.

결론적으로 잘 정의된 행동 아래에서 캡슐화를 진행했다면, 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다. 이것이 상태를 캡슐화해야 하는 이유이다.


📌 책임-주도 설계 (Responsibility-Driven Design, RDD)

객체지향에 갓 입문한 사람들이 가장 쉽게 빠지는 함정은, 상태를 중심으로 객체를 바라보는 것이다.
안타깝게도, 상태를 먼저 결정하고 행동을 결정하는 방법은 객체를 파멸로 이끈다.

❗ 행동이 상태를 결정한다.

객체의 주 역할 중 하나는 무엇일까? 바로 협력이다.
애플리케이션에 필요한 협력을 생각하고, 협력을 위해서 행동이 필요로 된다. 행동을 결정한 후에야 행동에 필요한 정보가 무엇인지 고려하여, 그 과정에서 상태가 결정되어야한다.

협력 안에서 객체의 행동은 결국, 협력에 참여하기 위해 완수해야 하는 책임을 의미한다!

📌 의인화

객체지향은 현실세계를 모방하여 생겨났다기에는 다소 받아들이기 힘든 부분이 많다. 어떻게 현실세계와 소프트웨어를 똑같이 볼 수가 있겠는가? 최대한 현실세계처럼 보이려 노력한다. 가 맞는 표현일 것 같다.

그렇다면 어떻게 현실세계처럼 보이려 노력하는걸까? 그것은 바로 객체를 의인화하여 보는 것이다.
다만 의인화를 현실세계와 가장 크게 다른점이라고 한다면, 모든 객체가 능동적이라는 것이다. 위 내용중, 남자와 음료수 내용을 기억하겠는가? 여기서 보이듯이, 우리는 음료조차도 의인화하여 주도적으로 행동하는 의인화가 적용되었다는 것을 알 수 있다.


자, 이제 모든 객체가 살아 움직이는 “이상한 나라를 창조해보자”

profile
실패의 경험들을 채워나가기!

0개의 댓글