2장 : 이상한 나라의 객체
조끼를 입고 회중시계를 든 토끼를 따라간 앨리스는 굴속에 빠져보린다. 복도 끝에서 문을 발견하고 그 너머 정원을 보는데, 문이 너무 작아 앨리스는 통과할 수 없었다. 몸을 작게 할 방법을 찾다가 '마셔라' 라고 적힌 병을 마시고 문에 들어갈 수 있어졌지만 키가 없어 통과할 수 없었다. 탁자 아래의 케이크를 발견하고 케이크를 먹는데 이번에 앨리스의 몸이 매우 커져서 문으로 들어갈 수 없었다...
객체지향과 인지 능력
- 인간은 세상을 독립적인 객체로 분리할 수 있는 인지 능력을 가지고 있다. 물리적인 객체 뿐 아니라 개념적인 객체도 인지 가능하다.
이상한 나라의 엘리스
- 앨리스라는 객체다.
- 앨리스는 키라는 상태를 가진다.
- 앨리스의 키는 음료를 마시는 행위에 의해서 앨리스의 상태가 변하게 된다.
- 행위는 상태에 의존적이다 (앨리스의 키가 작아졌는데 다시 물약을 먹어서 더 작게 하지는 않을것이다. 키가 작아졌으면 케이크를 먹어야 한다.)
- 행위의 순서는 중요하다. 행위는 이전 행위들에 영향을 받는다. (물약을 먹어 키가 작아져 키를 못찾았기 때문에 케이크를 먹어 키를 키워야 한다.)
- 앨리스의 키가 작아지든 커지든 앨리스는 앨리스다.
앨리스의 특징
- 앨리스는 상태를 가지며 상태는 변경 가능하다.
- 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다.
- 행동의 결괴는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 결과에 영향을 미친다.
- 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다.
객체
- 객체를 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보는 것이 효과적이다.
- 책에서는 다음과 같이 객체를 정의한다.
- 객체란 식별 가능한 개체 또는 사물이다.
- 객체는 구체적인 사물, 추상적인 개념 모두 포함한다.
- 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.
- 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드로 구현된다.
상태가 필요한 이유
- 객체의 행위는 이전 행위들에 영향을 받는다.
- 그러나 과거의 행동 이력만으로 행위를 결정하는것은 복잡하고 번거롭다. (앨리스가 물약을 3번먹고 케이크를 2번먹고 물약 케이크를 번갈아 가며 먹었을때 키라는 상태가 없다면 문을 통과하기 위해 물약을 먹을지 케이크를 먹을지 알 수 없다.)
- 상태를 이용하면 과거의 모든 행동이력들을 설명하지 않아도 행동의 결과를 예측 가능하다. ("내 키가 지금 110 이니 물약을 먹으면 60 높이의 문을 통과할 수 있겠군")
- 상태가 있어 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.
상태와 프로퍼티
- 객체의 상태를 구성하는 모든 특징을 통틀어 포로퍼티(property)라고 한다. (엘리스에게는 키, 위치, 물약 등이 있을것이다.)
- 일반적으로 프로퍼티는 변경되지 않아 정적이다.
- 프로퍼티 값은 시간이 흐름에 따라 변경되서 동적이다.
- 프로퍼티는 단순한 값을 가지는 프로퍼티가 있다. (키, 위치 등)
- 다른 객체를 가리키는 프로퍼티도 있다. 이를 링크(link)라고 한다.
- (상태와 프로퍼티가 거의 비슷한 말인 것 같다. 다만 상태가 좀더 큰 범위고 프로퍼티는 상태를 설명하기 위해 사용되는 말같다.)
행동
- 외부 객체는 직접적으로 다른 객체의 상태를 주무를 수 없다.
- 객체의 상태를 바꿀 수 있는건 오직 객체의 자발적인 행동뿐이다.
- 객체의 행동은 상태를 변화시키지만 행동의 결과는 객체의 상태에 의존적이다.
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동은 상태를 변경시킨다.
협력과 행동
- 객체가 다른 객체와 메시지를 통해서만 협력 할 수 있다.
- 객체의 행동은 두가지 부수효과를 가져온다.
- 객체 자신의 상태 변경
- 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
- (앨리스가 물약을 먹으면 키가 커지면서 물약의 양도 줄어야한다.)
- 행동은 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있다. 객체는 행동을 통해 다른 객체와 협력해 참여하므로 행동은 가시적이여햐 한다.
현실세계와 객체지향 세계의 차이와 캡슐화
- 현실세계에서 물을 마시면 물은 그냥 마셔진다. 수동적이다.
- 객체지향에서는 물은 수동적 으로 마셔지는게 아니라 스스로 줄어들어야 한다. 능동적이다.
- 객체는 스스로 판단하고 스스로 결정해야한다.
- 캡슐화를 잘 이루어야 객체의 자율성이 올라가고 객체의 지능이 높아져 협력이 유연하고 간결해진다.
식별자
- 객체를 서로 구별해주는 프로퍼티가 객체에 있다. 이것을 식별자라고 부른다.
- 단순한 값은 상태가 같다면 두 인스턴스를 같은것으로 판단한다. (두 값이 같은지 판단할 수 있는 성질을 동등성(equality) 라고함)
- 하지만 객체는 시간에 따라 변경되는 가변상태를 가지므로 두 객체의 상태가 완전히 같아도 독립적인 별개의 객체다.
- 두 객체의 상태가 다르더라도 식별자가 같으면 두 객체는 같은 객체다. (식별자를 기반으로 객체가 같은지를 판단할수 있는 성질을 동일성(identical)이라 한다.)
객체의 특징
위의 앨리스의 특징에서 앨리스만 객체로 바꾸면 된다.
- 객체는 상태를 가지며 상태는 변경 가능하다.
- 객체의 상태를 변경시키는 것은 객체의 행동이다.
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 결과에 영향을 미친다.
- 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.
기계로서의 객체
- 쿼리(query) : 객체의 상태를 조회
- 명령(command) : 객체의 상태를 변경시키는 작업
- 객체는 다른 객체의 내부를 조작하는게 아니라 다른 객체의 쿼리, 명령 버튼을 통해서만 다른 객체에 접근 가능하다.
행동이 상태를 결정한다.
- 상태를 중심으로 객체를 바라보면 안된다.
- 캡슐화가 저해된다.
- 객체를 고립시킨다.
- 재사용성이 저하된다.
- 행동을 초점에 맞춰야 한다. 객체는 다른 객체와 협력하기 위해 존재하기 때문이다.
- 객체의 적합성을 결정하는건 행동이다.
- 객체의 행동을 결정한 후에야 행동에 필요한 정보가 무엇인지를 고려하고 이 과정에서 상태가 결정된다.
은유와 객체
- 객체지향은 현실세계를 모방하는게아니다.
- 객체지향은 현실세계를 은유한다.
- 형실 객체를 소프트웨어 객체로 설명하면 우리는 쉽게 이해할 수 있다.
내가 이해한 내용을 정리하면...
객체는 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체다.
상태를 중심으로 객체를 바라보지 말고 행동을 중심으로 객체를 바라봐야 한다.