본문 바로가기
독서

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

by tempus 2022. 3. 26.
반응형

아래 내용은 조영호 님의 "객체지향의 사실과 오해"를 읽고 공부한 내용을 개인적으로 정리하였습니다.

 

2장. 이상한 나라의 객체

📕 Section 1 - 인간의 인지 능력

인간은 본능적으로 세상을 독립적이고 식별 가능한 객체의 집합으로 바라본다. ⇒ 많은 이들이 객체지향을 직관적이고 이해하기 쉬운 패러다임이라고 말하는 이유

👉 어떻게 보면 인간은 무언가를 구별 짓는 거에 특화되어 있다는 생각이 들었다. 의미가 없거나 추상적이더라도 구별해야 할 필요성이 느낀다면 어떻게 든 구별할 수 있는 무언가 장치를 마련한다는 느낌?

 

📕 Section 2 - 소프트웨어 세계에서 객체

하지만 소프트웨어 세계에서의 객체는 일반적으로 현실에서의 객체와는 다르다. ⇒ 현실 세계를 기반으로 새로운 세계를 창조해야 한다.

(예시)

  • 현실 세계의 전등은 사람의 손길 없이는 스스로 불을 밝힐 수 없지만 소프트웨어에서는 가능하다.
  • 현실은 사람이 직접 주문 금액을 계산하지만 소프트웨어 세계에서는 주문 객체가 자신의 금액을 계산한다.

👉 소프트웨어 진화에 따라 우리의 삶의 방식도 달라지고 있기 때문에 어쩌면 우리는 새롭게 창조된 세계를 이제는 하나의 현실이 된 것처럼 느끼고 있을지도 모른다.

 

📕 Section 3 - 엘리스(객체)

앨리스는 다음과 같은 특징을 가지고 있다.

  • 앨리스는 상태를 가지며 상태는 변경 가능하다. (키가 크다, 키가 작다 등)
  • 앨래스의 상태를 변경 시키는 것은 앨리스의 행동이다.
    • 행동의 순서가 결과에 영향을 미친다.
    • 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
  • 앨리스는 어떤 상태에 있더라도 유일하게 식별가능하다.

 

소프트웨어 안에 창조되는 객체는 상태,행동, 식별자를 지닌다. 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.

 

✅ 상태

상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현

상태가 왜 필요해? ⇒ 상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동방식을 이해할 수 있다. (예 - 배가 부른 상태라면 이 객체는 뭘 많이 먹은 행동을 했구나)

 

 

프로퍼티(Property)

객체의 상태를 구성하는 모든 특징

  • 속성 - 단순한 값 (숫자, 문자열, 참/거짓 등)
  • 연관관계 - 정적인 관계를 의미, 연관관계의 인스턴스가 링크다.

일반적으로 프로퍼티는 변하지 않고 고정적이기 때문에 정적이지만 프로퍼티 값은 시간의 흐름에 따라 변경되기 때문에 동적이다.

  • 객체와 객체 사이에 의미 있는 연결을 링크라고 한다. 링크가 존재해야만 메세지를 주고 받을 수 있다.
  • 객체의 상태는 정적인 프로퍼티동적인 프로퍼티 값으로 구성된다. 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수있다.

 

👉 여기서 강조하는 것은 객체는 상태를 스스로의 행동으로만 변경할 수 있다는 것이다. 이로써 앞서 1장에서 말한 객체의 자율성이 유지가 된다. 이는 현실 세계와의 객체와 많은 차이가 난다.

 

✅ 행동

외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동

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

 

행동을 다음의 두 가지 관점에서 서술

  • 상호작용이 현재의 상태에 어떤 방식으로 의존하는가? - 객체의 행동은 상태에 영향을 받는다.
    • 앨리스의 키가 40센치 이하라면 문을 통과할 수 있다.
  • 상호작용이 어떻게 현재의 상태를 변경시키는가? - 객체의 행동은 상태를 변경시킨다.
    • 문을 통과한 후에 엘리스의 위치는 아름다운 정원으로 바뀌어야 한다.

객체의 행동은 객체가 협력에 참여할 수 있는 유일한 방법!! ⇒ 행동의 결과로 1) 자기 자신의 상태를 변경하거나 2) 다른 객체에게 메세지를 전달할 수 있다.

 

상태 캡슐화 - 객체의 자율성을 보장하기 위해

엘리스는 음료의 양이 줄어든지 모른다. 단지 음료에게 키가 줄었으니 이 만큼 양을 줄여달라고 요청할 뿐이다. 즉 객체의 행동을 유발하는 것은 외부로부터 전달돼 메시지지만 객체의 상태를 변경할지 여부는 객체 스스로 결정한다.

⇒ 결론적으로 상태를 잘 정의된 행동 집합 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다.

 

👉 객체는 다른 객체에게 행동을 메세지로 전달할 수 있지만 그 행동을 그 객체가 했는지는 알 수가 없다. 그 메시지만 전달하고 모든 행위의 결과는 해당 객체에게 자율적으로 맡기게 된다. 위의 예시에 알 수 있듯이 보통 현실에서는 음료를 마시는 순간 음료도 동시에 줄어들지만 소프트웨어 세계에서는 현실 세계와는 다른 순서로 진행이 된다. 그래서 내가 명심해야 할 것은 객체의 상태는 스스로만 바꿀수 있다는 점을 꼭 명심해야겠다.

 

✅ 식별자

객체가 식별 가능하다는 것은 객체를 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재하다는 것을 의미, 그 프로퍼티를 식별자라고 한다.

모든 객체는 식별자를 가지며 식별자를 이용해 객체를 구별할 수 있다.

 

값(value)객체(object)의 가장 큰 차이점은 값은 식별자가 없지만 객체는 식별자를 가지고 있다.

값과 객체 모두 클래슬부터 생선 된 객체이기 때문에 다음과 같이 별도의 용어를 사용하기도 한다.

 

값 : 값 객체(value Object) - Integer class

객체 : 참조 객체(reference Object), 엔티티(Entity) - Person class

 

동등성(equality) : 상태를 이용해 두 값이 같은지 판단할 수 있는 성질

동일성(identical) : 식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질

 

📕 Section 4 - 기계로서의 객체

객체의 상태를 조회하는 작업을 쿼리(Query)라고 하고 객체의 상태를 변경하는 작업을 명령(Command)이라한다. ⇒

객체가 외부에 제공하는 행동의 대부분은 쿼리와 명령으로 구성하고 있다.

👉 기계 은유를 통해 좀 더 객체가 쉽게 이해가 된 것 같다. 우리는 기계(객체) 내부를 볼 수가 없고 단지 허용된 수단(메시지)을 통해서만 기계에게 행동하게 할 수 있다. (버튼 - 쿼리, 명령)

 

📕 Section 5 - 행동이 상태를 결정한다

객체의 상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 미친다. 그 이유는 다음과 같다.

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

⇒ 행위를 통해 협력을 하기 때문에 더욱이 그런 것 같다. 객체는 다른 객체와 협력하기 위해 존재하기에 행동에 초점을 맞추어야한다.

 

협력 안에서 객체의 행동은 결국 객체가 협력에 참여하면서 완수해야 하는 책임을 의미한다. 따라서 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야 한다.

⇒ 이를 책임-주도 설계(Responsibility-Driven Design) 라고한다. (앞으로 배울 내용)

 

👉 과거에 나도 개발을 하면서 무언가 흐름이 매끄럽지 않고 설계가 잘못되었다는 느낌을 많이 받았었는데 이 장을 읽고 비로소 내가 무엇을 잘못하고 있었는지 알 수 있었다. 항상 객체가 어떤 상태를 먼저 가져야 하는지 정하고 그에 맞추어 행동을 정하다 보니 불필요한 객체도 많이 늘어나고 예상치 못한 곳에서 문제가 발생했었다. 다음부터는 상태가 아닌 행동에 맞추어 설계를 해야겠다.

 

📕 정리

  • 현실 세계에서의 객체와 소프트웨어 세계에서의 객체는 엄연히 다르다.
  • 객체는 상태,행동, 식별자를 지닌다.
    • 객체는 상태를 가지며 상태는 변경가능하다.
    • 객체의 상태를 변화시키는 것은 행동이다.
      • 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
      • 행동의 순서가 실행 결과에 영향을 미친다.
    • 객체는 어떤 상태에 있더라도 식별 가능하다.
  • 객체가 외부에 제공하는 행동의 대부분은 객체를 조회하는 쿼리와 상태를 변경하는 명령으로 구성되어 있다.
  • 설계 시, 우리는 객체의 상태가 아닌 행동에 초점을 두고 설계를 해야한다.

 

👉 저자는 이 장에서 가장 중요한 것은 "행동이 상태를 결정한다"라고 강조하고 있다. 앞으로 객체 지향 설계를 할 때 객체의 상태가 아닌 객체의 역할(행동)을 중점으로 설계를 해야 한다는 것만큼은 까먹지 말아야겠다.

반응형

댓글


loading