호댕의 iOS 개발

[독서 후기] 객체지향의 사실과 오해 2장 본문

Book/개발

[독서 후기] 객체지향의 사실과 오해 2장

호르댕댕댕 2022. 4. 13. 00:48

 

2장에서는 객체 지향 패러다임과 객체에 대해 조금 더 자세히 이야기를 한다. 

 

이 책의 표지에서도 토끼가 그려져 있고 책의 대부분의 예시에서도 이상한 나라의 앨리스를 예를 들고 있다. 이는 이상한 나라의 앨리스가 객체 지향 프로그래밍이 가지고 있는 오해를 가장 잘 해소시켜줄 수 있는 예시이기 때문이라고 생각한다. 

 

 

이전 1장에서도 언급되었지만 이 책에선 객체 지향이 단순히 현실을 모방한 것이 아니라고 하고 있다.

 

각각의 객체들은 상태를 가지고 있고 이런 상태를 변경할 수 있는 행동을 통해 각각의 상태를 자율적으로 관리하게 된다. 만약 음식을 먹는다고 했을 때 음식을 먹는 사람 객체가 있고 음식 객체가 있다고 생각해보자. 

 

실제 세계에선 음식을 먹는 사람이 있고 음식은 단순히 사람에 의해 먹히며 줄어들 뿐이지만 객체는 이와 다르다. 사람이 음식을 얼마나 먹었는지 전달하면 음식이 직접 행동(메서드)을 통해 본인의 상태를 줄이게 된다. 

즉, 음식이 의인화된 상태라고 볼 수 있다. 음식이 직접 본인의 양을 줄였으니 말이다. 

 

이상한 나라의 앨리스에서도 카드들이 직접 움직이고 말도 한다. 카드 또한 의인화가 된 것이다. 이런 유사점 때문에 이 책에선 이상한 나라의 앨리스를 대부분의 예시로 사용한 것 같다.

 

다만 현실과의 유사성은 존재하기 때문에 현실 세계와 객체 지향 세계는 은유 관계라고 설명을 하고 있다. 

 

 

🔍 객체 알아보기

그럼 객체에 대해 조금 더 자세히 살펴보자. 

1장에선 객체를 다음과 같이 설명했다. 

  • 이런 자율적인 객체들은 각각 상태와 행위를 가지고 있으며, 책임을 가지고 있다. 
  • 이런 책임들의 집합이 역할이며, 역할을 바탕으로 다른 객체와 협력이 이뤄진다. 
  • 협력을 하는 과정에서 객체 간 메세지를 주고 받으며 이는 객체에 정의된 메서드를 통해 처리를 한다. 

1장에서처럼 객체는 상태와 행위를 가진다. 

 

여기서 행위는 상태를 변경시키며, 행위의 결과는 상태에 의존적이게 된다. 

만약 음료수를 마시는 행위를 하게 된다면 음료수의 양이 줄어드는 것처럼 말이다. 

또한 이런 행위가 발생하기 위해선 음료수를 들어 입으로 가져오는 일련의 행위가 필요하다. (이는 행동 간 순서가 중요하다는 것을 의미한다)

 

책에서는 객체를 이렇게 설명하고 있다. 

인간의 인지 능력 안에서 개수를 셀 수 있고, 다른 사물과 구분할 수 있으며, 생성 시점을 알 수 있고, 독립적인 하나의 단위로 인식할 수 있는 모든 사물은 객체이다. 
객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태, 행동, 식별자를 지닌 실체로 보는 것이 가장 효과적이다. 
- 객체 지향의 사실과 오해 p/47-

그렇다면 상태, 행동, 식별자에 대해 조금 더 자세히 알아보자. 

 

🧐 상태, 행동, 식별자

🧍🏻 상태

모든 객체의 경우 어떤 행동의 결과는 이전 어떤 행동이 있었는지에 따라 달라진다. 

상태는 현재 발생한 행동의 과정과 결과를 단순하게 표현하기 위한 수단이다. 

 

코드에선 상태를 표시하기 위해 프로퍼티(Property)를 사용한다. 또한 프로퍼티들은 숫자, 문자열, Bool 타입 등의 프로퍼티 값을 가지게 된다.

 

이런 상태를 변경시키도록 하는 것이 바로 행동이다.

 

이때 객체는 다른 객체의 상태에 직접 접근하여 상태 값을 바꿀 수 없다. 따라서 상태(프로퍼티)의 경우 불가피한 경우가 아니면 private으로 은닉화를 해놓는 것이 좋을 것 같다. 

 

 

🏃🏻 행동

객체의 상태를 변경시키는 유일한 것인 객체의 자발적인 행동이다. 

행동이 발생하게 되면 객체의 상태가 변하는 Side Effect이 발생하게 된다. 

 

이런 행동은 외부의 요청 또는 수신된 메세지에 응답하여 동작하며, 행동의 결과로 자신의 상태를 변경하거나 다른 객체에게 상태를 변경해달라고 메세지를 전달할 수도 있다. 

 

행동은 객체 외부에서 접근할 수 있는 유일한 방법이다. 

 

따라서 이 책에선 객체를 설계할 때 행동을 중심으로 하는 책임-주도 설계(RDD, Responsibility-Driven-Design)을 권장하고 있다. 

상태에 초점을 맞출 경우 캡슐화를 제대로 하지 못하여 공용 인터페이스에 노출될 수 있으며, 행동을 통한 협력이 잘 안될 수 있기 때문이다. 이렇게 되면 객체의 재사용성도 떨어질 수 있기 때문에 행동 중심의 책임-주도 설계를 강조하고 있다. 

 

🔖 식별자

개인적으로 이 책을 읽을 때 식별자는 앞의 행동과 상태에 비해 중요한 요소는 아니지 않나 생각이 들었다. 

(책에서 말하는 식별자에 대해 명확히 인식하지 못해 이렇게 생각한 것일 수도 있다...)

 

식별자는 객체를 구별하기 위한 특정한 프로퍼티를 의미한다. 

만약 단순히 값의 상태가 같다면 두 개의 인스턴스가 동일한 것으로 볼 수 있다. (동등성)

let a = 10
let b = 10
a==b // true

일단 이해했을 때에는 값의 상태가 같은 경우는 위 코드와 같다고 생각했다. 

 

상태가 다르더라도 식별자가 같은 경우에는 객체를 같은 객체로 판단할 수 있는 경우는 동일성이라고 하고 있다. 

 

다만 동일성을 활용하는 경우는 어떤 경우가 있을까 의문이 들었다... 🤯

 

Comments