컴퓨터 과학 (Computer Science)/OOP

<객체지향의 사실과 오해> 2장: 이상한 나라의 객체

redsiwon 2023. 4. 21. 22:09

지난 장의 내용을 복습해보자

Q. 객체의 본질은 무엇인가?

더보기

A. 객체는 저마다 역할을 갖고 있으며, 그 역할에 맞는 책임을 진다. 각 객체는 다른 객체들과 협력하여 공동의 목표를 이루어낸다!

 

책임, 협력, 공동체라는 개념이 중요한 포인트였다.


객체의 특성

이번 장에서는 그러한 객체에 대해 더 깊이 파고든다. 본 책에서는 동화 "이상한 나라의 엘리스"의 예시를 통해 객체를 탐구한다.

 

엘리스가 40cm의 문을 통과하기 위해 키가 작아지는 음료를 마시는 행동을 예로 들어보자.

"엘리스"가 "음료"를 10ml 마신다.

-> "엘리스"의 "키"가 30cm 줄어든다.

-> "음료"의 "양"이 10ml 줄어든다.

 

객체지향 소프트웨어의 세계도 현실 세계와 비슷하다. 우선은 소프트웨어의 세계가 현실 세계의 "모방"이라는 개념을 차용해서 위의 상황을 자세히 살펴보자.

1. 엘리스와 음료를 서로 다른 사물/객체로 인식할 수 있다.

2. 엘리스는 음료를 마실 수 있다.

3. 엘리스가 음료를 마시면 엘리스의 키가 줄어들고, 음료의 양이 줄어든다.

4. 엘리스는 키, 음료는 양이라는 값과 각각 연관이 있다.

5. 엘리스의 키가 바뀌고 음료의 양이 바뀌어도, 각각 처음에 인식했던 엘리스이고 음료라는 사실은 변하지 않는다.

 

위의 탐구과정을 통해 알 수 있는 것은 객체의 3가지 특성인 상태, 행동, 식별자이다.

1,5번은 객체가 서로 구별될 수 있음을 나타낸다.

2번은 객체가 행동할 수 있음을 나타낸다.

3,4번은 객체는 상태가 있음을 나타낸다.

3번은 객체가 행동하면 상태의 영향을 미친다는 것을 나타낸다. 그리고, 그 행동의 결과는 기존의 상태에 의존적임을 알 수 있다.

다시 정리해서, 객체는 상태, 행동, 식별자로 정의할 수 있다!

 

상태

객체의 상태는 무엇을 설명하는가?

객체의 상태는 객체가 그동안 어떤 행동들을 했는지 축약해준다. 다음 행동의 결과를 알기 위해서 이전 모든 행동들을 다 추적할 필요없다. 그저 상태만을 알면, 다음 행동의 결과를 쉽게 알 수 있다.

 

객체의 상태는 어떻게 나타내는가?

객체의 상태는 프로퍼티로 표현할 수 있다. 엘리스는 키라는 프로퍼티를 갖는다. 음료는 양이라는 프로퍼티를 갖는다. 이것은 변하지 않는다. 즉 프로퍼티는 정적이다.

 

프로퍼티는 값을 갖는다. 요일에는 월화수목금토일이 있고, 날씨는 흐림,맑음,비,눈 등이 있고, 온도,키,몸무게,개수,수량,액체의 양 등은 수치로 표현할 수 있다. 프로퍼티의 값은 객체의 행동에 따라 변할 수 있다. 즉 프로퍼티의 값은 동적이다.

 

그런데 위와 같이 단순한 값을 갖는 프로퍼티 말고, 다른 객체를 가리키는 프로퍼티가 있다. 이를 링크라고 부른다. 예를 들어 엘리스가 하나의 무기를 소유한다고 하자. 이때 엘리스는 무기를 추가적인 프로퍼티로 갖는다. 이 프로퍼티는 링크다. 이 링크가 가리키는 대상은 목검이 될 수도 있고, 야구방망이가 될 수도 있다. 목검이나 야구 방망이는 객체다.

 

행동

객체의 행동은 무엇을 설명하는가?

객체는 행동을 한다. 행동의 결과는 상태에 의존한다. 위에서 엘리스의 현재 키가 130cm라고 했을 때, 음료를 30ml 마시면 키가 90cm가 줄어 40cm가 될 것이다. 40cm가 되면 문을 통과할 수 있다. 그러나 엘리스의 키가 131cm였다고 하자 그러면 음료를 10ml 더 마셔서 키가 11cm가 되어야 문을 통과할 수 있게될 것이다.

 

객체의 행동은 어떻게 일어나는가? 객체의 행동은 다른 객체의 요청에 의해 유발된다. 행동은 객체가 공동체와 협력하는 유일한 방법이다.

<토막 질문> Q. 객체의 행동이 다른 객체의 요청에 의해 유발된다면 최초의 요청과 최초의 객체의 행동은 무엇일까?

더보기

A. 자바에서는 JVM에 의해 main함수가 최초에 실행된다. 이후에는 작성된 코드에 따라 순차적으로 객체들이 생명주기에 따라 생성되고 소멸하며 서로 협력한다.

 

그러면 객체는 다른 객체의 요청이 없으면 아무런 행동도 못하는 수동적인 존재란 말인가? 반은 맞고 반은 틀리다. 지난 장을 기억해보자. 소프트웨어 세계의 객체는 자율적인 존재이다. 행동은 요청에 의해 유발되지만 어떤 방식으로 요청을 처리해서 응답할지는 객체가 자율적으로 판단하고 결정한다. 이런 특성으로 인하여, 객체의 상태는 오직 스스로 결정한다. 즉 행동이 상태를 결정한다. 객체의 핵심은 상태가 아니라 행동이다. 객체의 본질은 협력에 있기 때문이다.

 

식별자

식별자는 무엇을 설명하는가?

식별자는 한 객체를 다른 객체와 구별해주는 정체성을 나타낸다. 식별자도 일종의 프로퍼티다. 다만 각 객체는 공유하지 않는 고유한 프로퍼티 값을 갖는다.

 

앞서 이미 언급했지만, 객체의 상태가 완전히 일치한다고 하더라도 서로 같은 객체는 아니다. 예를 들어 스마트폰 두 대가 있는데, 둘 다 아이폰14이라고 하자. 두 객체는 다른 게 없지만(충분히 이해되시죠? 원자 수준의 다름을 이야기하는 것이 아닙니다. 융통성을 가져주세요.), 누구나 두 아이폰을 별개의 개체로 인식한다. 이러한 식별적 관점의 같음을 동일성(indenticality)이라고 부른다. 세상에는 여러 종류의 스마트폰이 있다. 지금 우리가 가진 것은 '같은 종류'의 아이폰이다. 이러한 상태비교적 관점의 같음을 동등성(equality)라고 부른다.


자, 이제 우리는 객체 전반에 대하여 알게 되었다. 그러나 소프트웨어에서의 객체는 현실의 객체와는 다소 다르다. 무엇이 다를까?

소프트웨어의 객체와 현실의 객체의 차이

눈썰미가 좋은 사람은 아까 '행동' 파트에서 눈치를 챘을 것이다. 현실에서는 자율성도 있지만 완전한 수동성이 존재한다. 내가 음료수를 마시면 음료수 양은 필연적으로 줄어든다. 그러나 소프트웨어 세계에서는 그렇지 않다. 음료가 마치 사람처럼, 자율성을 갖고 동작한다. 자율성! 이것이 소프트웨어의 객체와 현실의 객체의 가장 큰 차이다.

 

따라서 이러한 관점에서, 객체지향이 현실세계의 "모방"이라는 전통적인 해석은 다소 어폐가 있다. 분명 현실 세계는 소프트웨어 세계를 다루는 데 도움을 주는 부분이 있지만, 언제나 현실을 똑같이 그대로 옮겨놓는 것이 아니다. 앞에서 봤듯이 음료는 자아가 없지만 소프트웨어 세계에서는 마치 자아를 갖고 움직이는 것 같다. 더불어 우리는 실체화될 수 없는 추상적 개념(검색, 주문, 결제, 장바구니, etc..)을 소프트웨어 세계에 "창조"한다. 이러한 관점에서 객체지향은 현실세계의 "모방"이 아니라 "은유"다!

우리는 창조자다. 현실세계는 소프트웨어 세계의 창조를 돕는 재료일 뿐이다.