주노 님의 블로그

객체지향의 사실과 오해 1장 협력하는 객체들의 공동체 본문

카테고리 없음

객체지향의 사실과 오해 1장 협력하는 객체들의 공동체

juno0432 2025. 1. 26. 12:30

아래 내용은 객체지향의 사실과 오해 (조영호 저) 에서 나온 내용을 정리하고, 제 지능에 맞게 다듬어진 글입니다.

 

서론

객체지향이란 무엇인가요? 라는 질문을 받을 때, 나는 항상 버릇처럼

"객체지향이란 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임입니다"라고 답하곤 했다.

 

이 답변이 틀린 것은 아니지만, 실제로 내가 객체지향의 본질을 제대로 이해하고 있었는지 의문이 들 때가 많았다.

 

개발을 진행하다 보면 실제 세계와 객체가 1:1로 매핑되는 경우를 찾기가 쉽지 않다.

 

그러나 객체지향을 설명할 때 실세계의 예시를 드는 이유는 이 패러다임의 다양한 측면을 이해하고 학습하는 데 매우 효과적이기 때문이라고 설명하고 있다.

 

객체를 현실에 비유하는것은 캡슐화와 자율성을 설명하는데 효과적이며,

메세지를 주고받으며 공동의 목표를 달성하기위해 협력하는 객체들의 관계를 설명하는데 적합하다고 한다.

 

아래 예시를 보자.

 


커피숍을 예로 들어보자

[그림1] 

 

[그림 1]은 고객, 캐셔, 바리스타 간의 상호작용을 통해 커피 주문이 이루어지는 과정을 보여준다.

 

이 과정에서는 각각의 객체(사람)들이 특정 역할을 수행하며, 협력을 통해 결과를 만들어 낸다.

 

역할, 책임, 협력

커피숍에서 이루어지는 역할과 책임은 다음과 같다:

 

고객: 커피를 주문하는 역할을 한다. 자신의 요구사항을 전달하는 책임이 있다.

캐셔: 고객의 주문을 받고, 이를 바리스타에게 전달하는 역할을 한다. 또한, 주문 상태를 고객에게 알려주는 책임을 가진다.

바리스타: 커피를 제조하는 역할을 한다. 커피 제조라는 책임이 있다.

 

이와 같이 각자의 역할이 명확히 나누어져 있고, 서로의 책임을 수행하며 협력함으로써 하나의 커피가 완성된다.

 

위 내용을 수행하는데 중요한 개념을 제시한다.

 

  1. 여러 사람이 동일한 역할을 수행할 수 있다.
    캐셔가 일을 그만두더라도 다른 캐셔를 고용하면 동일한 역할을 수행할 수 있다.
  2. 역할은 대체 가능성을 의미한다.
    캐셔가 여러 명이라면, 누구든지 동일한 역할을 수행할 수 있다.
  3. 책임을 수행하는 방법은 자율적으로 선택할 수 있다.
    요청을 받은 사람은 요청을 처리하는 방법을 자유롭게 선택할 수 있다.
  4. 한 사람이 동시에 여러 역할을 수행할 수 있다.
    캐셔가 바리스타 역할까지 가능하다.

위의 카페의 상황을 객체지향의 관점으로 본다면?

 

사람은 객체로 변환해본다. (고객, 캐셔, 바리스타)

요청은 메시지로 변환해본다. (커피 주문 요청, 커피 제조 요청)

요청을 처리하는 방법은 메서드로 변환해본다. (커피 주문, 커피 제조)

 

 

이처럼 각자의 역할과 책임을 가지고 협력하여 기능을 구현하는 것이 바로 객체라는 뜻이다.

 

 

애플리케이션의 기능은 더 작은 책임으로 분할되고, 이 책임은 적절한 역할을 수행할 수 있는 객체가 맡아 처리한다.
객체는 자신의 책임을 수행하면서도, 필요하면 다른 객체에게 도움을 요청한다.

 

즉, 시스템은 역할과 책임을 수행하는 객체로 분할되며, 시스템의 기능은 객체 간 연쇄적인 요청과 응답의 흐름으로 이루어진 협력으로 구현된다.

 

 

위 중요한 개념을 객체의 개념으로 옮겨보자.

 

  1. 여러 객체가 동일한 역할을 수행할 수 있다.
    → 특정 역할을 수행할 수 있는 객체가 여러 개 존재할 경우, 시스템은 특정 객체에 종속되지 않고 유연하게  작동한다는 뜻,
    예를 들어 커피숍에서 캐셔가 2명 있다고 가정하자. 캐셔1과 캐셔2는 둘 다 고객의 주문을 받고 바리스타 에게 전달하는 동일한 역할을 수행할 수 있다.
    Cashier1.takeOrder()
    Cashier2.takeOrder()
    어떤 캐셔가 일을 하더라도 동일한 역할을 수행 할 수 있다.
  2. 역할은 대체 가능성을 의미한다.
     특정 역할을 수행하는 객체가 교체 가능하다는 뜻이다.
    역할이 잘 정의되어 있다면, 어떤 객체가 그 역할을 수행하더라도 시스템이 문제없이 동작한다.
    Cashier1이 결근 → Cashier2가 대신 동일한 역할 수행.
    커피숍에서 한 캐셔가 갑자기 결근했다면, 다른 캐셔를 고용하여 동일한 역할을 수행할 수 있다. 이는 시스템이 특정 캐셔에 의존하지 않도록 설계되었기 때문이다.
  3. 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
     객체는 자신이 받은 요청(메시지)을 처리하는 방법을 자유롭게 결정할 수 있다.
    요청의 처리 방식은 객체 내부의 구현에 따라 달라질 수 있다,
    다만 외부에서는 어떤 방식으로 작동하는지는 알 필요가 없고, 결과만 확인하면 된다.
    Barista.makeCoffee("Americano"); 
    Barista.makeCoffee("Latte");
  4. 하나의 객체가 동시에 여러 역할을 수행할 수 있다.
     하나의 객체가 여러 역할을 수행할 수 있다는 뜻이다.
    상황에 따라 객체가 유연하게 다양한 역할을 맡을  수 있다.
    Employee.makeCoffee() → 바리스타 역할 수행.
    Employee.processOrder() → 캐셔 역할 수행.

 


객체는 다른 객체와 협력하여 시스템의 기능을 구현한다.

 

이러한 협력을 위해 객체에게는 다음과 같은 조건이 요구된다.

 

  1. 객체는 충분히 협력적이어야 한다.
    - 객체는 다른 객체의 요청에 협력하고, 필요한 경우 다른 객체에게 도움을 요청할 수 있어야 한다.
    - 모든 것을 스스로 처리하는 객체 (god object) 는 내부적인 복잡도에 의해 자멸하고 만다.
    (내부적인 복잡성으로 인해 유지보수가 어려워지고, 시스템의 유연성을 저하시킬 수 있다.)
  2. 객체가 충분히 자율적이어야 한다.
    - 객체는 자신의 원칙에 따라 독립적으로 행동하며, 스스로를 통제하고 관리할 수 있어야 한다.
    (외부의 간섭 없이 자신의 내부 상태를 관리하고, 요청에 대해 스스로 행동할 수 있어야한다.)

객체는 상태와 행동을 지닌 실체이다.
바리스타가 커피 제조 방법을 모르는 것이 말이 안 되는 것처럼, 객체는 자신만의 행동과 상태를 함께 지니고 있어야 한다.

 


캡슐화

객체의 사적인 부분은(상태와 내부 구현) 은 객체 스스로가 관리해야 하며, 외부에서는 이를 직접적으로 간섭하지 못하도록 해야 한다.
외부는 객체가 허락한 수단(메서드)을 통해서만 객체와 상호작용할 수 있다. 이는 객체의 자율성을 보장하는 핵심 매커니즘이다.

 

객체는 다른 객체와 협력하기 위해 메시지를 전송한다. 메시지를 수신한 객체는 그에 대응하는 적절한 메서드를 실행한다.

 

바리스타로 전달된 커피 제조 요청이 메세지이고, 커피를 제조하는 구체적인 방법이 메서드이다.

이 과정에서 요청한 캐셔는 커피가 제조된다는 사실만 알 뿐, 어떻게 제조되는지에 대해서는 관여하지 않는다.


이는 외부의 요청(메시지)과 이를 처리하는 내부적인 방법(메서드)을 분리하는 원리이며, 객체의 자율성을 높이는 캡슐화의 개념과 연결된다.

 


객체지향의 본질

객체지향은 다음과 같은 특징을 가지고 있다.

 

1. 시스템을 자율적인 객체들의 공동체로 바라본다.

시스템은 상호작용하는 객체들로 구성되며, 객체를 이용해 시스템을 분할한다.

 

2. 자율적인 객체란 상태와 행위를 함께 지니며, 스스로 책임을 지는 객체이다 (캡슐화)

객체는 자신의 상태와 행동을 독립적으로 관리한다.

 

3. 객체는 협력을 통해 시스템의 행위를 구현한다.

객체는 정해진 역할을 수행하며, 역할은 관련된 책임의 집합이다.

 

4. 객체는 메시지를 통해 협력한다 .

객체는 메시지를 전송하고, 메시지를 수신한 객체는 이를 처리하기 위한 적절한 메서드를 자율적으로 선택한다.


객체지향의 패러다임

객체지향은 단순히 클래스의 구조와 메서드를 설계하는 것이 아니라, 객체 간의 역할, 책임, 협력에 초점을 맞춘다.

중요한 것은 어떤 클래스인지가 아니라, 어떤 객체들이 어떤 메시지를 주고받으며 협력하는지이다.