호댕의 iOS 개발

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

Book/개발

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

호르댕댕댕 2022. 4. 11. 09:52

보통 개발을 하면서 객체(Object)라는 말을 자주 듣게 된다. 실제 내가 사용하고 있는 Swift도 객체지향 프로그래밍 언어이기도 하고 말이다. 하지만 스스로 “그럼 객체가 정확히 뭔데?”라고 물었을 때 이를 명확히 정의하긴 어렵다고 생각했다.

물론 사전적으로 정확히 “객체는 ~다” 라고 정의하긴 어렵겠지만 스스로 객체가 뭔지 정의는 할 수 있어야 하기 때문에 다시 【객체지향의 사실과 오해】를 다시 읽게 되었다.

 

객체지향의 사실과 오해 - YES24

『객체지향의 사실과 오해』는 객체지향이란 무엇인가라는 원론적면서도 다소 위험한 질문에 답하기 위해 쓰여진 책이다. 안타깝게도 많은 사람들이 객체지향의 본질을 오해하고 있다. 가장

www.yes24.com

 

오늘부터 1장씩 읽으면서 객체, 추상화 등 어렴풋이 알고는 있지만 명확하게 정의하진 못했던 부분을 조금 더 명확하게 정의할 수 있도록 해보고자 한다.

 


🤔 객체는 실세계의 투영일까?

【객체지향의 사실과 오해】의 필자는 아래의 설명은 객체의 철학적 개념을 설명하는 데에는 적합하지만 실제로 사용할 때의 객체는 정확히 설명하지 못한다고 하고 있다.

객체지향 소프트웨어는 실세계의 투영이며, 객체란 현실 세계에 존재하는 사물에 대한 추상화라는 것이다.
- 【객체지향의 사실과 오해】 p20 -

실제로 개발을 할 때 객체들은 실세계의 것들과 1 : 1로 정확하게 대응되진 않는다. 이 책에서도 말하고 있지만 오히려 아예 새로운 세계를 창조하는 것과 유사하다.

 

하지만 그럼에도 객체는 현실 세계에 존재하는 사물의 추상화라고 하는 것은 현실 세계에 존재하는 것들이 메세지를 주고 받으며 공동의 목표 달성을 위해 협력을 하게 되는데 이런 과정이 객체 지향에서 중요한 개념이기 때문이다.

 

따라서 이번 글에선 객체를 명확히 설명할 수는 없지만 객체는 실세계의 투영이라 생각하고 객체의 협력, 역할, 책임에 대해 정리해보고자 한다.

 

✅ 협력, 역할, 책임

👨‍👨‍👧‍👦 협력

실제로 협력은 다음과 같은 사전적 의미를 가진다.

객체에서의 협력도 이와 거의 유사한 의미이다. 

 

물론 실세계의 투영이라는 것이 객체를 명확하게 설명해주진 않지만 여기서는 현실 세계를 예로 들어 정리해보고자 한다. 

현실세계 대부분에서 협력이 발생하는데 식당에서 음식을 주문했을 때를 가정해서 생각해보자.

위 협력과정을 보게 되면 협력은 요청과 응답으로 이뤄지는 것을 볼 수 있다. 

 

손님이 종업원에게, 종업원이 주방장에게 요청을 하게 되면 주방장이 종업원에게, 종업원이 손님에게 연쇄적으로 응답을 하게 된다. 이런 요청과 응답을 통해 손님의 주문을 협력하여 해결할 수 있게 되는 것이다. 

 

🧑🏻‍💻 역할과 책임

위의 협력 과정에서 각자 특정 역할을 맡게 된다. 

각각 손님, 종업원, 주방장에 맞는 역할을 가지고 있고 이에 대한 책임을 지게 된다. 

 

  • 여러 객체가 동일한 역할을 맡을 수 있다. (특정 역할만 수행 가능하면 어떤 객체가 이를 수행해도 무관하다)
  • 역할은 대체 가능성을 의미한다. 
  • 책임을 수행하는 방법은 객체가 자율적으로 결정할 수 있다. 
  • 한 사람이 동시에 여러 역할을 수행할 수도 있다. 

 

💡객체에서의 협력, 역할, 책임

각각의 사람을 객체, 요청을 처리하는 방법을 메서드, 요청 자체를 메세지로 생각을 하게 된다면 객체를 어느 정도 설명할 수 있게 된다.

 

애플리케이션을 구현할 때 각각의 기능은 책임으로 분할되고 이런 책임은 적절한 역할을 할 수 있는 객체가 맡게 된다. 따라서 시스템이 역할과 책임을 수행하는 객체로 구성이 되고 시스템의 기능은 객체 간 연쇄적인 요청과 응답으로 협력을 하며 구현이 되는 것이다. 

 

따라서 객체 지향 설계를 할 때 중요한 것은 객체에 적당한 역할을 부여하는 것이다. 

이를 보고 SOLID의 SRP, 즉 단일 책임 원칙 또한 이런 역할과 책임을 객체에 좀 더 명확히 부여하기 위한 원칙으로 판단이 됐다.

 

객체 지향을 객체 지향이라고 부르는 이유는 앞서 말했다시피 객체가 시스템의 구현에 핵심적인 역할을 하며 이들의 협력을 통해 동작하기 때문이다. 

 

다만 객체는 다음 내용을 준수해야 한다. 

1️⃣ 객체는 충분히 협력을 해야 한다. 

모든 것을 스스로 처리를 하게 된다면 엄청나게 복잡한 객체가 나오게 되고 이는 다른 프로그래머와 협업을 하거나 디버깅을 할 때 큰 걸림돌이 될 수 있다. 

 

2️⃣ 객체를 충분히 자율적으로 둬야 한다.

객체는 서로 협력해야 하긴 하지만 본인의 메서드를 통해 어떻게 역할을 수행할 지는 스스로 결정할 수 있도록 해야 한다. 

이런 객체의 자율성은 객체의 내부, 외부에 공개할 것들을 명확히 구분하는 데에서 시작한다. 외부에서 접근할 수 있는 메서드를 통해서만 객체간 의사소통이 이뤄져야 하며, 이런 메서드도 뭘 수행하는 지는 외부에서 알 수 있지만 어떻게 수행하는 지는 알 수 없도록 해야 한다. 

 

즉, 자율적인 객체를 위해선 은닉화가 필요한 것이다. 

 

❓ 그럼 객체는 뭘까?

객체에 관련해선 저자이신 조영호님이 핵심만 잘 정리해주셔서 이를 바탕으로 정리를 해보았다. 

객체지향이란 서로 협력을 하는 자율적인 객체들의 공동체이며, 이를 이용해 시스템을 분할하는 것이다. 

 

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

 

Comments