2장. 이상한 나라의 객체

나는 사과·2023년 1월 23일
0

객체의 행동이 객체의 상태를 결정한다.

1장에서는 커피 가게를 예시로 들었다면 2장에서는 이상한 나라의 앨리스를 예시로 들고있다. 앨리스가 정원으로 통하는 문을 지나기 위해서 키를 조절하는 부분을 생각하면 된다.

앨리스는 키(상태)를 조절하기 위해서 음료를 마시거나 케이크를 먹거나 부채질하거나 등등의 행동을 한다. 그럼 키가 작아졌다가 커졌다가 하게 된다. 즉, 상태를 변경하기 위해서는 행동을 하게되고 행동의 결과로 상태 변하게 된다. => 행동의 결과는 상태에 의존적 또한 문을 통과하는 행동의 성공 여부는 몸을 줄이기 위해 어떤 행동을 했는가에도 영향을 받는다. => 어떤 행동의 결과는 어떤 행동에 영향을 받음 앨리스의 키(상태)가 너무 작아져서 문을 통과하거나, 너무 커져서 문을 통과하지 못하더라도 앨리스는 앨리스다. => 상태에 상관없이 유일한 앨리스로 식별 가능

앨리스는 그럼 뭘까? 바로 객체다. 그럼 위의 내용에서 앨리스 대신에 객체를 넣어서 보면

  • 상태를 갖고 상태는 변경 가능
  • 객체의 상태를 변경하는건 객체의 행동 행동의 결과는 상태에 의존적, 어떤 행동의 결과는 다른 행동의 영향을 줌
  • 객체의 상태는 어떤 상태인지 상관 없이 유일하게 식별 가능
    이런 식으로 객체를 조금 정리해볼 수 있다.

그럼 이어서 조금 더 객체의 다양한 특성을 알아보기 위해서 객체는 위의 세가지(상태, 행동, 식별자)를 갖고 있다고 생각해보고 이 세가지를 좀 더 깊게 들어가보려고 한다.

상태

앨리스의 키, 먹은 음료의 양, 케이크의 양은 상태이다. 또한 앨리스가 문을 지나 정원에 도착했는지 아직 지나지 못했는지 앨리스가 어디 있는지에 대한 위치, 성공여부도 상태다. 그럼 음료는? 케이크는? 할 수 있는데 위의 내용을 생각해보면 이것들은 상태가 아닌 객체라고 생각할 수 있고 남은 음료의 양, 남은 케이크의 양은 각자의 상태가 된다. 그럼 상태는 뭔가 단순한 값 => "객체를 표현하기 위해 사용되는 값" 이라고 생각할 수 있다. 단순한 값이라고 표현했지만.. 이것들은 객체를 표현하기 위한 중요한 수단이다. 이러한 상태를 표현하는 값들을 우리는 프로퍼티라고 부르고 있다. 앨리스라는 객체가 갖고있는 프로퍼티는 키, 위치, 성공여부, 먹은 음료의 양, 먹은 케이크의 양이 될 수 있다. 근데 일반적으로 프로퍼티는 정적이고 프로퍼티 값은 동적이다. 앨리스의 상태 값들은 변하기 때문에 프로퍼티 값이라고 할 수 있다. 또한 이런 객체를 구성하는 단순한 값들은 속성이라고 한다.

앨리스가 음료를 마시면 음료의 상태는 변하게 된다. 객체들 사이에 연결이 되어있으면 서로에게 영향을 줄 수 있다는 말이다. 정리하자면, 연결이라는 링크를 통해서 앨리스(객체)는 음료(객체)에게 "마신다."라는 메세지를 전달해서 마시는 행동을 하게된다. 근데 음료수가 주변에 많다면 직접 손에 들어서(링크) 마시는 음료(객체)의 양(상태)에만 영향을 줄 수 있지 들지 않은 다른 음료(객체)의 양(상태)에는 영향을 주지 못한다. 링크는 단순하게 한 객체가 다른 객체의 식별자를 알고 있으면 된다.

상태를 정리하자면

  • 상태 = 객체가 갖는 정보의 집합
  • 객체의 상태 = 정적 프로퍼티 + 동적 프로퍼티로 구성
  • 객체의 프로퍼티 = 단순한 값인 속성 / 다른 객체를 참조하는 링크로 구분 가능

행동

상태와 행동 사이에는 다음과 같은 관계가 있다.

객체의 행동은 상태에 영향을 받음
객체의 행동은 상태를 변경시킴
이것은 상태라는 개념을 갖고 객체의 행동을 두 가지 관점에서 서술할 수 있다.

상호작용이 현재의 상태에 어떤 방식으로 의존하는가?
상호작용이 어떻게 현재의 상태를 변경시키는가?
객체는 다른 객체와 상호작용하며 협력하기 위해서는 다른 객체에게 요청을 보내는 법이 있다. 그럼 요청을 받은 다른 객체는 해당 요청을 처리하기 위해 적당한 방법에 따라 행동하게 된다. 그 행동을 통해서 협력을 하고 그 결과로써 자신의 상태를 변경할 수 있다.

행동의 결과로써 자신의 상태를 변경하거나 다른 객체에게 메세지를 전달하면서 협력할 수 있다. -> 행동은 협력해야 하므로 외부에 가시적이어야 한다.

앨리스를 예를 들면, 앨리스는 음료를 들어 마시게 된다. 객체는 스스로의 상태를 변경할 수 있는 자율적 존재니깐 앨리스(객체)는 음료를 마셔서 자신의 키(상태)를 변경할 수 있고 음료(객체)는 자신의 양(상태)를 변경할 수 있어야 한다. 행동과 연관지어 생각해보면 앨리스(객체)는 음료(객체)를 마신다(행동)는 메세지를 전달하고 메세지를 전달받은 음료는 스스로의 행동을 통해서 양을 줄이게 된다.

여기서 앨리스는 남은 음료의 양을 모르는 상태로 단지 음료를 마신다라는 메세지를 전달하게 된다. 메신저 송신자는 수신자의 상태를 알지 못하는 상태를 알지 못한다는 것이다. 이것이 바로 캡슐화가 의미하는 것이다. 단지 외부에 노출시키는 건 행동뿐이고, 외부에서 접근하는 방법도 행동뿐이다.

메세지를 전달받고 적절한 행동을 하는건 객체 스스로의 판단이고 송신자는 수신자의 행동에 대해 간섭할 수도 없다. 즉, 캡슐화를 하게 되면 객체 스스로의 자율성을 높이게 되고 협력을 단순화하며 유연하게 만들게 된다. 이것이 바로 상태를 캡슐화해야하는 이유다.

식별자

객체를 식별 가능하다 -> 구분할 수 있는 특정 프로퍼티가 객체 안에 존재함 -> 특정 프로퍼티를 식별자라고 함 객체가 아닌 단순한 값은 식별자를 갖지 않는다. 이것이 객체와 값의 가장 큰 차이점이고 시스템을 설계할 때 이런 값과 객체의 차이점을 명확하게 구분하고 명시적으로 표현하는 것이 중요하다.

값이 같은지 여부는 상태가 같은지를 이용해 판단한다. 값이 같다 = 두 인스턴스는 동일 -> 상태를 이용해 두 값이 같은지 판단 가능한 성질을 동등성이라 한다.

상태를 이용해 동등성을 판단 가능한 이유는 값의 상태는 변하지 않기 때문이다.

사람도 어린이일때와 성인일때와 달라진건 키, 나이같은 상태들이지 사람이라는건 변하지 않았다. 객체도 비슷하게 상태는 변할 수 있어도 본질은 변하지 않아서 그것을 판단할 수 있는 식별자를 갖는다. 식별자를 가지고 객체가 같은지 판단할 수 있는 성질을 동일성이라 한다.

객체지향 프로그래밍 언어에서는 값과 객체 개념 모두 클래스를 이용해 구현되기 때문에 혼동을 많이 한다. 숫자도 Integer 클래스로부터 구현된 객체고 사람도 Person 클래스로부터 구현된 객체기 때문이다. 이러한 혼동을 줄이기 위해서 다음과 같이 가리키기도 한다.

객체 => 참조 객체, 엔티티 값 => 값 객체

식별자라는 개념을 조금 간과하기 쉽지만 표현력을 높이는 데 중요한 역할을 하기 때문에 중요하다.

상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 객체지향 설계에 나쁜 영향을 미친다.

  1. 캡슐화 저해
  2. 협력자가 아닌 고립된 섬으로 만듬
  3. 재사용성 저하

객체는 다른 객체와의 협력하기 위해 존재하기 때문에 행동에 초점을 맞춰야 한다. 객체의 적합성을 결정하는 건 객체의 행동이다.

객체지향 설계는 다음과 같은 순서로 수행된다. 애플리케이션에 필요한 협력들을 생각 -> 협력에 참여하는 데 필요한 행동 생각 -> 행동을 수행할 객체를 선택

행동이 결정된 후에 행동에 필요한 정보가 무엇인지 생각을 하고 이때 상태가 결정되게 된다.

결론

상태, 활동, 식별자는 객체의 중요한 특성이다.

  • 상태 = 객체가 갖는 정보의 집합, 객체의 구조적 특징을 표현
  • 행동 = 다른 객체의 요청이나 메세지에 응답하기 위해 동작하는 활동
  • 식별자 = 객체를 다른 객체와 구분하는데 사용되는 프로퍼티
    객체지향 설계에서 행동이 상태를 결정한다를 생각하고 행동에 초점을 맞춰 설계해야 한다.

0개의 댓글