02/ 이상한 나라의 객체
"이상한나라의 앨리스는 40cm 작은 문을 통과하기 위해 마법 물을 마시고 키가 작아진다. 그리고 그 문을 통과해 정원에 도착할 수 있었다. 그리고 키가 작아진 앨리스를 여전히 앨리스라고 부른다."
상태와 행동
키를 변화시키는 것 : 행동
행동의 결과를 결정하는 것: 상태
앨리스는 문을 통과하기 전에 먼저 키를 작게 줄이고 병안의 음료를 마셔야한다.
-> 행동 간의 순서가 중요하다.
- 앨리스는 상태를 가지며 상태는 변경이 가능하다.
- 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다.
행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
행동의 순서가 결과에 영향을 미친다. - 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다.
객체의 특성:
상태(state), 행동(behavior), 식별자(identity)
앨리스는 상태, 행동, 식별자를 지닌 실체다.
상태
비행기 탑승 여부는 과거에 항공권을 발권하는 행동이 발생했는지 여부에 따라 달라진다. -> 어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존한다.
행동의 과정과 결과를 단순하게 기술하기 위한 개념.
상태를 사용하면 과거의 모든 행동 이력을 설명하지 않고 행동의 결과를 쉽게 예측하고 설명할 수 있다.(비행기 발권상태 -> 탑승, 자동차 시동상태 -> 데이트)
현재를 기반으로 객체의 행동방식을 이해
단순한 값:
숫자, 문자열, 양, 속도, 시간, 날짜, 참/거짓 그 자체로 독립적인 의미가 아니라 다른 객체의 특성을 표현
-> 단순한 값은 객체가 아니지만 객체의 상태를 표현하기 위한 중요한 수단
앨리스의 키, 위치, 음료의 양: 단순한 값
프로퍼티
단순한 값과 객체의 조합
객체의 상태를 구성하는 모든 특징: 프로퍼티(property)
-> 앨리스의 키, 위치, 음료, 음료
프로퍼티는 변경되지 않고 고정되므로 '정적'
프로퍼티 값(property value)는 시간이 흐름에 따라 변경됨 '동적'
상태가 바꼈다. 40cm로 줄어들고 음료를 마셔서 버렸다.
-> 음료에 관해 알지 못하는 상태
링크
객체와 객체 사이의 의미 있는 연결
링크가 존재해야만 요청을 보내고 받을 수 있다.
객체가 다른 객체를 참조할 수 있다를 의미
한 객체가 다른 객체의 식별자를 알고 있다.
속성
객체를 구성하는 단순한 값
객체는 단순한 값인 속성과 다른 객체를 가리키는 링크라는 두가지 종류의 조합으로 표현할 수 있다.
상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징
객체의 상태는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성됨
객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분한다.
행동
객체는 자율적인 존재다. 스스로 자신의 상태를 책임져야한다. 외부의 객체가 직접적으로 객체의 상태를 주무를 수 없다. -> 간접적으로 객체의 상태를 변경하거나 조회해야한다.
스스로의 행동에 의해서만 상태가 변경되는 것을 보장함 -> 객체의 자율성 유지
객체의 상태를 변경하는 것: 자발적인 행동
객체 자신의 상태를 변경시킨다.
상태가 변경된다 -> 부수효과(side effcet)를 초래한다.
행동은 객체의 상태를 변화시키지만 행동의 결과는 객체의 상태에 의존적이다.
(음료를 마신 후 앨리스의 키는 전보다 작아져야한다.)
-> 음료를 마시는 행동의 결과가 앨리스의 키에 의존한다.
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동은 상태를 변경시킨다.
상호작용이 현재의 상태에 어떤 방식으로 의존하는가?
-> 앨리스의 키가 40cm 이하라면 문을 통과할 수 있다.
상호작용이 어떻게 현재의 상태를 변경시키는가?
-> 문을 통과한 후에 앨리스의 위치는 아름다운 정원으로 바뀌어야한다.
협력과 행동
객체는 다른 객체를 이용하고 다른 객체에게 서비스를 제공한다.
객체가 협력하는 유일한 방법은 '요청'(메시지)을 보내는 것
어떤 행동을 하도록 만드는 것: 외부로부터 수신한 메시지
다른 객체의 상태변경 유발 가능 -> 음료마시면 앨리스 키 ↓ , 음료 양 ↓
음료의 양이 줆, 음료의 상태 변경
행동은 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동.
행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달
다른 객체와의 협력에 참여하므로 외부에 가시적이어야한다.
상태 캡슐화
음료 객체의 양을 줄이는 것 : 음료 자신의 몫
앨리스가 상태를 변경할 수 없다. 음료를 마셨다는 메시지를 전달만 함
송신자는 수신자의 상태 변경에대해서 전혀 알지 못함 -> 캡슐화
상태를 캡슐 안에 감춰둔채 외부로 노출하지 않는다.
외부에 노출하는 것은 행동뿐, 외부에서 객체에 접근하는 방법도 행동뿐
상태 변경할지 여부는 스스로 결정
상태를 외부에 노출시키지 않고 행동을 경계로 캡슐화 -> 자율성 ↑, 협력 유연
식별자
식별 가능한 경계를 가진 모든 사물: 프로퍼티
식별자를 이용해 객체를 구별할 수 있다.
동등성(equality)
상태를 이용해 두 값이 같은지 판단할 수 있는 성질
값의 상태는 결코 변하지 않기 때문에 어떤 시점에 동일한 타입의 두 값이 같다면 두 값은 동등한 상태를 유지한다.
값은 오직 상태만을 이용해 동등성을 판단 -> 인스턴스 구별을 위한 별도 식별자 필요x
동일성(identical)
두 객체의 상태가 다르더라도 식별자가 같다면 두 객체를 같은 객체로 판단할 수 있다. 식별자를 기반으로 객체가 같은지 판단하는 성질
객체의 상태가 변하기 때문에 식별자로 판단.
상태가 가변적인 두 객체 동일성 판단 -> 별도의 식별자 필요
식별자는 어떤 객체를 다른 객체와 구분하는데 사용하는 객체의 프로퍼티
값은 식별자를 가지지않기 때문에 상태를 이용한 동등성 검사를 통해 두 인스턴스 비교해야한다.
객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스 비교할 수 있다.
상태를 조회하는 작업: 쿼리(query)
변경하는 작업: 명령(command)
잘못된 설계
초보자들은 앨리스 객체에 필요한 상태가 무엇인지를 찾고 키와 위치를 앨리스에 추가한다. 그리고 키와 위치를 조회할 수 있는 행동이 무엇인지 고민한다.
상태를 먼저 결정할 경우
1. 캡슐화가 저해된다.
2. 객체를 협력자가 아닌 고립된 섬으로 만든다.
(상태 먼저 고려시 협력에서 벗어난채 설계함)
3. 재사용성이 저하된다.
(협력이 저해됐기 때문에)
=>행동에 초점을 맞출 것!!
책임-주도 설계(Responsibility-Driven Design, RDD)
어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야한다.
응집도 높고, 재사용 가능한 객체를 만들 수 있게한다.
"행동이 상태를 결정한다."
의인화(anthropomorphism)
현실의 객체보다 더 많은 일을 할 수 있는 소프트웨어 객체의 특징을 의인화라고 부른다.
객체지향의 세계는 현실의 추상화가 아니다. 현실보다 더 많은 특징과 능력을 보유한다.
(신화속 인물이나 상상속 동물도 소프트웨어에서 살게할 수있다)
은유
현실 세계와 객체지향 세계 사이의 관계를 좀 더 정확히 설명할 수 있는단어
실제 객체의 이름을 소프트웨어 객체의 이름으로 사용하면 표현적 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있다.(이해쉽고 유지보수 용이)
현실 세계인 도메인에서 사용되는 이름을 객체에게 부여하라!
객체지향 설계자들 현실을 모방하는 것이아니라 이상한나라를 창조하라 !
회고
객체는 상태를 가지고 외부 요청(메시지)에 의해 행동함으로서 자신의 상태를 바꾼다. 자신의 상태를 바꾸는건 자기의 몫이다. 외부는 모른다. 이렇게 캡슐화를해야 자율성이 높아진다.
그러기 위해서 객체지향설계를 할때 상태말고 행동을 고려해야한다고 한다. 행동을 강조했다.
나도 자율성 높고 응집도 강한 객체를 만들고 싶다. 책 내용을 잘기억해 두어야겠다.
이상한나라 앨리스 얘기는 사실 처음 보지만 이야기를 통해 비유해줘서 이해하기 좋았다. 책 잘쓰셨다.
'책 리뷰' 카테고리의 다른 글
책 리뷰 - 객체지향의 사실과 오해6 (16) | 2024.10.09 |
---|---|
책 리뷰 - 객체지향의 사실과 오해5 (2) | 2024.10.09 |
책 리뷰 - 객체지향의 사실과 오해4 (1) | 2024.10.09 |
책 리뷰 - 객체지향의 사실과 오해1 (15) | 2024.10.09 |