본문 바로가기

책/객체지향의 사실과 오해 (완)

02 이상한 나라의 객체

목차

키워드

  • 상태
  • 행동
  • 프로퍼티
  • 프로퍼티 값
  • 링크
  • 상태와 행동간의 관계
  • CQS
  • 의인화
  • 은유

특징

  • 객체는 상태를 가지며 상태는 변경 가능하다.
  • 객체의 상태를 변경시키는 것은 객체의 행동이다.
    • 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
    • 행동의 순서가 결과에 영향을 미친다.
  • 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.
  • 객체의 행동은 상태에 영향을 받는다.
  • 객체의 행동은 상태를 변경시킨다.
  • 상호작용이 현재의 상태에 어떤 방식으로 의존하는가
  • 상호작용이 어떻게 현재의 상태를 변경시키는가.
  • 객체는 상태를 가지며 상태는 변경 가능하다.
  • 객체의 상태를 변경시키는 것은 객체의 행동이다.
    • 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
    • 행동의 순서가 실행 결과에 영향을 미친다.

정리

앨리스의 상태를 결정하는 것은 행동이지만 결과를 결정하는 것은 상태이다.

책에서 피력하는 의견중 하나입니다. 즉 이를 풀어서 설명하자면 객체의 데이터를 결정하는 것은 메소드이지만 메소드의 결과를 결정하는 것은 객체의 데이터입니다. 책에서는 이를 앨리스라는 객체로 예시를 들며 설명합니다. 앨리스의 키, 즉 상태는 앨리스가 약과 케이크를 섭취에 따라 달라지지만 앨리스가 좁고 낮은 문을 통과할수 있고 없고는 앨리스의 키를 통해 설명합니다.

 

상태는 근본적으로 세상의 복잡성을 완화하고 인지 과부하를 줄일 수 있는 중요한 개념이다.
단순한 값들은 그 자체로 독립적인 의미를 가지기보다는 다른 객체의 특성을 표현하는 데 사용된다.

만약 우리가 앨리스가 섭취한 음식의 종류들을 모두 알고 있어야만 좁고 낮은 문을 통과 유무를 알 수 있다면 이는 너무나 비효율적일 것입니다.(문을 통과하기 위해 케익을 먹었는지 약을 먹었는지를 전부 알고 있어야 하기 때문입니다.) 그러나 만약 "키"라는 상태를 알고 있다면 과거의 행동을 추적할 필요가 없으므로 효율적으로 상태를 관리할수 있을것입니다.

 

객체의 프로퍼티는 단순한 값인 속성과 다른 객체를 가리키는 링크라는 두가지 종류의 조합으로 표현할 수 있다.

이를 예시 코드로 나타내면 다음과 같습니다.

public calss Item{

	class Link{
    	private int x;
    }

	// 속성(프로퍼티)
    private int hight;
    
    // 링크
    private Link link;
}

 

객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장함으로써 객체의 자율성을 유지한다.

이는 1장에서도 나왔던 말의 연장선으로 객체는 데이터와 이를 처리하는 프로세스가 같이 존재해야 합니다. 그리고 그렇게 함으로써 객체의 자율성 즉 A 클래스에서 B 클래스의 상태를 조작하는 상황이 발생하지 않도록 도와줍니다.

 

객체의 행동에 의해 객체의 상태가 변경된다는 것은 행동이 부수효과(side effect)를 초래한다는 것을 의미한다.

책에 나온 예시로 설명을 하자면 앨리스가 문을 열어 이동할 경우(행동) 앨리스의 위치가 변화합니다.(상태) 즉 행동의 결과로 부수효과를 동반할 수 있습니다.

 

메시지 송신자는 메시지 수신자의 상태 변경에 대해서는 전혀 알지 못한다.

객체 지향적으로 생각하였을 때 메시지를 송신하는 객체가 수신하는 객체의 상태까지 확인할 경우 송신하는 객체의 책임(역할)이 과도하다는 생각이 들며 수신하는 객체 역시 1장에서 언급한 데이터와 프로세스가 같이 있지 않아 객체지향적이지 못하다고 생각합니다. 그렇기에 서로가 서로에 대해 잘 알지 못한다면 이는 캡슐화가 잘되었다고 생각합니다.

 

상태를 이용해 두 값이 같은지 판단할 수 있는 성징을 동등성(equality)이라고 한다.

이는 자바에서 사용하는 equals를 생각하면 이해가 금방 될 것이라 생각합니다. 나아가 상태를 이용해 동등성을 판단할 수 있는 이유는 값의 상태가 변하지 않기 때문입니다. 그렇기에 1 == 1 이라는 코드는 참이 되고 같은 클래스로부터 객체를 생성해 비교를 하더라도 주소값을 기준으로 비교를 하기 때문에 비교를 할 경우 False가 나오게 됩니다.

 

식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질을 동일성(identical)이라고 한다.

 

 

일반적으로 객체의 상태를 조회하는 작업을 쿼리(query)라고 하고 객체의 상태르 변경하는 작업을 명령(command)이라고 한다.

나아가 CQS 패턴이라는 것이 있습니다. 간략하게 말씀드리면 command와 query를 서로 분리하라는 것 입니다. 이를 통해 조금더 객체 지향적인 코드에 다가갈수 있도록 도와줍니다. 번외로 CQS패턴에 대해 말씀드리면 명령과 조회를 분리하라는 말이고 더 풀어 설명하면 읽기와 쓰기를 서로 분리하라는 말이 됩니다.

ref

 

 

사용자는 객체가 제공하는 명령 버튼과 쿼리 버튼으로 구성된 인터페이스를 통해서만 객체에 접근 할 수 있다.

CQS의 연장선상이라고 생각합니다.

 

 

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

만약 상태를 먼저 정의할 경우 다음과 같은 단점들이 존재합니다.

  1. 상태를 먼저 결정할 경우 캡슐화가 저해된다.
  2. 객체를 협력자가 아닌 고립된 섬으로 만든다.
  3. 객체의 재사용성이 저하된다.

 


 

2장은 본격적으로 객체지향이 무엇인지에 알려주는 장이였다고 생각합니다. 1장에서도 느꼈지만 여전히 쉽게 읽히는 책은 아니지만 읽으면 읽을수록 생각할 거리를 던저주는 책이라고 생각합니다. 상태와 행동간의 관계, 상태보단 행동, CQS, 의인화, 은유 키워드가 핵심 키워드였다고 생각합니다.

' > 객체지향의 사실과 오해 (완)' 카테고리의 다른 글

06 객체지도  (0) 2024.03.15
05 책임과 메시지  (1) 2024.01.23
04 역할, 책임, 협력  (2) 2024.01.23
03 타입과 추상화  (0) 2024.01.10
01 협력하는 객체들의 공동체  (1) 2023.12.31