[객체지향의 사실과 오해] 2장

2020. 4. 12. 16:26책/객체지향의 사실과 오해

2장 협력하는 객체들의 공동체

객체지향 패러다임은 지식을 추상화하고 추상화한 지식을

객체 안에 캡슐화 함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다.

객체를 발견하고 창조하는 것은 지식과 행동을 구조화 하는 문제다. -레베카 워프스브록

 

 

2장에서는 이상한 나라의 앨리스 이야기를 통해 설명을 풀어나간다.

앨리스가 토끼를 따라 정원으로 통하는 문을 통과하기 위해 자신의 상태인 '키'를 줄이는 방법들에 대한 설명으로

객체의 상태(필드)와 행동(메소드)의 관계를 설명하였다.

예를들어 앨리스의 키(상태)를 변화 시킬 수 있는 방법은 음료를 마시거나, 부채질을 하거나, 버섯을 먹거나, 케이크를 먹는등의 행동들이다.

상태행동간에는 세가지 특징이 있다.

첫째,앨리스는 '키'라는 상태를 가지며 이 상태는 변경이 가능하다.

둘째, 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다. 이때 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.

음료를 마시고 키가 커진다, 버섯을 먹어서 키가 작아진다. 등의 문장이 윗문장을 설명해 줄 수 있을 것이다.

셋째, 앨리스는 어떤 상태에 있더라도 유일하게 식별이 가능하다. 즉, 키가 작아진 앨리스도 앨리스이고 키가 커진 앨리스도 앨리스이다.

이에 착안하여 객체를 다음과 같이 정의한다.

객체란 식별 가능한 개체 또는 사물이다.

객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.

소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.

여기서 키워드는 역시 식별자, 행동, 상태인 것 같다.

 

 

상태

객체에 상태는 왜 필요한 것일까?

이 책에 아주 납득이 잘 가도록 설명이 되어있다.

예를들어 앨리스가 문을 통과하기 위해서는 키가 작아져야 한다.

키가 작아지기 위해서는 키가 작아지기 위한 행동(예를들어 키가 작아지는 버섯을 먹거나, 부채질을 하거나 등의)을 해야한다.

즉, 문을 통과하는 행동은 과거의 키가 작아지기 위한 행동에 의존적인 것이다.

두 행동을 예시로 들면 별로 복잡해 보이지 않을 수 있지만, 꼬리에 꼬리를 물어 과거의 행동들을 거슬러 올라가다 보면

그 상관관계가 매우 복잡해 질 것이라는 걸 알 수 있다. (버섯을 먹기위해 버섯을 집어야하고, 버섯을 집기위해 팔을 올려야하고..등)

이러한 복잡성을 없애기 위해 인간은 행동의 과정과 결과를 단순하게 기술할 수 있는 상태라는 개념을 고안해냈다.

상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다.

앨리스가 과거에 어떠한 행동들을 했던간에, 문을 통과하기 위한 '키'라는 상태가 어떠한지만 보면 통과할 수 있는지를 판단할 수 있게 되는 것이다. 이러한 상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동방식을 이해할 수 있다.

객체는 자율적인 존재이다. 객체는 다른 객체의 상태에 직접적으로 접근할 수도, 상태를 변경할 수도 없다.

자율적인 객체는 스스로 자신의 상태를 책임진다. 어떠한 외부의 객체도 직접적으로 다른 객체의 상태를 변경할 수 는 없다.

하지만, 행동을 통해서 간접적으로나마 가능해진다.

객체지향의 기본 사상은 상태와 그것을 조절하는 행동을 하나의 단위로 묶는 것이다.

 

 

행동

객체의 상태는 객체의 자발적 행동때문이다.

앨리스의 '키'라는 상태가 작아질 수 있는 이유는 앨리스가 음료를 마시는 행동을 했기 때문이다.

앨리스의 '위치'라는 상태가 '문 앞'에서 '정원'으로 바뀔 수 있는 이유는 문을 통과하는 행동을 했기 때문이다.

이렇게 객체의 행동에 의해 객체의 상태가 변경되는 것을 부수효과를 초래했다고 표현한다.

그렇다면 객체는 어떻게 타 객체의 상태를 변경할 수 있을까?

책에서는 그 방법이 요청을 보내는 것이라고 표현하였고, (요청을 받고 그 요청을 처리하기 위해 상태를 변경한다는 의미인 것 같다.)

이러한 과정을 협력이라고 표현하였다. 이러한 협력과 행동의 관계를 앨리스 이야기로 표현해보자면,

앨리스는 음료를 마시고 키가 작아졌다.

라는 것은 앨리스 본인의 '키'라는 상태를 변경했으며, 음료를 마시는 행동에 협력한 음료라는 객체의 '양'이라는 상태 또한 변경시켰다.

즉, 행동이란 외부의 요청 또는 수신된 메세지에 응답하기 위해 동작하고 반응하는 활동이다.

행동의 결과로 객체 자신의 상태를 변경하거나 다른 객체에게 요청(메세지)을 전달 할 수 있다는 것이다.

 

 

상태 캡슐화

객체간의 요청메세지에는 어떠한 행동을 해달라는 요구사항만 있을 뿐, 상태에 관한 내용이 포함되어 있지 않다는 것을 뜻한다.

객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다. 노출 되는 것은 오로지 행동뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법은 이러한 행동뿐이다. 즉, 상태를 직접적으로 접근할 수 없다는 것이다.

이러한 캡슐화가 필요한 이유가 무엇일까 생각해보았다.

책에서 계속 강조하듯, 객체는 자신의 상태를 스스로 결정할 수 있어야 한다. 외부의 요청을 받았을때 상태를 변경할지 말지는 객체 스스로가 결정해야 한다는 의미이다. 달리 말하면 이러한 객체를 자율적인 객체라고 할 수 있겠다.

객체가 자율적일수록 전체 소프트웨어는 유연하고 간결해질 수 있지 않을까? 달리 말해, 객체가 그 자신의 역할이 명확하다면 사용하는데에 좀 더 부드럽지 않을까?

그런 의미에서 객체는 자신의 상태를 외부에서 직접 변경시킬 수 없도록 캡슐화 하는 것이 필요한 것 같다.

 

 

식별자

이 식별자 파트는 읽으면서도 많이 헷갈리는 부분이었다.

이 부분은 말로 이해하기가 힘들어서 코드로 표현해 보았는데,

Alice alice = new Alice();
int water ;

이때 alice는 식별자이고 water는 값이다.

즉, 변하지 않는 상태만을 가진 것은 값이고, 변할 수 있는 상태를 가진것은 식별자인 것이다.

객체가 이러한 식별자를 가진다는 의미는, 자신이 스스로 변경할 수 있는 상태 (=프로퍼티)를 가진다는 의미인 것 같다 .

이부분은 추후에 더 자세히 알고나서 정리를 해 봐야겠다는 생각이 들었다.

 

 

행동이 상태를 결정한다.

이 문단을 읽고 굉장히 얻은게 많았던것 같다.

나같은 초보자들이 쉽게 실수하는 것이, 상태를 중심으로 객체를 바라보는 것이다.

앨리스라는 객체를 설계할때, 앨리스 객체에게 필요한 상태가 무엇인지 생각하여 키와 위치를 추가한다.

이후에 키와 위치를 변경하거나 조회할 수 있는 행동을 설계한다.

위와같이 상태를 먼저 결정하고나서 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼친다.

세가지로 요약해 보자면

첫째, 상태를 먼저 결정할 경우 캡슐화 되지 못하고 공용 인터페이스에 그대로 노출될 확률이 높아진다.

둘째, 협력을 위한 객체로 만들기 어려워진다. 객체가 필요한 근본적인 이유는 애플리케이션의 문맥 내에서 다른 객체와 협력하기 위해서 인데, 그 상태를 위주로 생각하다 보면 협력을 위한 행동들을 생각하기 어려워질 수 있다는 뜻이다.

셋째, 객체의 재사용성이 저하된다. 두번째 이유의 연장선인것 같다. 협력이 어려워진 객체는 그만큼 다른곳에서 쓰이기 힘들어 진다는 것을 의미한다.

객체는 다른 객체와 협력하여 애플리케이션을 완성시키는데에 그 존재이유가 있다.

객체가 협력에 참여하는 유일한 방법은 바로 행동이다.

이러한 행동에 초점을 맞추어 객체를 설계하는 것이 전체 애플리케이션을 완성시키는 데에도 좋을 것이라는 생각이 들었다.

정리하자면, 객체지향 설계를 위해서는 애플리케이션에 필요한 어떠한 협력과정을 생각하고, 협력에 참여하는 데 필요한 행동들을 생각한 후에 행동들을 수행할 객체를 선택하는 방식으로 수행한다. 이렇게 행동이 결정되고 나서 행동을 수행하는데에 필요한 상태를 결정하는 것이 바람직하겠다.

 

 

느낀점

2장을 읽고 객체가 가지는 상태와 행동에 대해 많이 이해하게 된 것 같다.

주로 상태를 먼저 고려한 설계를 해왔던 나에게, 그것이 얼마나 잘못된 습관이었는지를 깨달을 수 있었다.

2장의 뒷부분에서는 객체지향의 세계는 현실의 추상화가 아니라고 말하고 있다.

오히려 객체지향 세계는 현실 속의 객체보다 더 많은 특징과 능력을 보유한 객체들로 넘쳐난다는 것이다.

그도 그럴것이, 이상한 나라의 앨리스의 예시에서 음료라는 객체는 스스로 자신의 '남은 양'을 줄인다.

현실에서의 음료는 이렇게 주체적이지 못하다.

'창조한 객체의 특성을 상기시킬 수 있다면 현실 속의 객체의 이름을 이용해 객체를 묘사하라' 라는 말이 참 와닿게 되었다.

우리는 현실세계에 있는 객체의 이름과 특성을 빌려다가 더 멋진 새로운 객체를 창조해 나가는 것이다.

 

 

 

2장 끝