본문 바로가기

개발 관련 지식

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

객체란

객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.
  • 물리적인 것이든 개념적인 것이든, 하나의 개별적인 단위로 다룰 수 있어야 객체로 볼 수 있다.
  • 생성 시점을 알 수 있고, 다른 객체와 구별 가능하며, 수량을 셀 수 있다.

상태

특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
  • 단순한 이나 다른 객체들의 조합으로 표현되며, 흔히 **속성(property)**이라고 부른다.
  • 상태는 미래의 행동 결과를 예측하게 돕는다.

예시) 자판기에 500원을 넣으면, 1700원 음료수를 뽑을 수 있는가?

  • [행동 이력 기반]
    자판기에 100원 3개 → 500원 1개 → 100원 4개 → 앞으로 500원 넣을 예정
    → 가능 여부 판단이 복잡해짐
  • [상태 기반]
    자판기 현재 보유 금액 1200원
    → 500원 추가 시, 1700원 음료 구입 가능 여부를 단번에 판단할 수 있음

→ 상태를 기반으로 판단하는 것이 더 간결하고 효과적이다.


  • Attribute
    객체를 구성하는 단순한 값
    ex) 화폐 객체의 금액
  • Link
    객체 간 연결. 메시지를 주고받기 위해 서로를 참조할 수 있어야 함
    ex) 자판기 객체 [ ↔ / →] 화폐 객체

행동

외부의 요청 또는 수신된 메세지에 응답하기 위해 동작하고 반응하는 활동이다.
  • 객체는 외부의 요청이나 수신된 메시지에 따라 반응(행동)한다.
  • 이 과정에서 객체는 자신의 상태를 바꾸거나, 연결된 다른 객체의 상태에 영향을 줄 수 있다.
  • 하지만 행동은 상태에 의존적이다.

예시)
자판기가 음료를 내보내기 위해서는 화폐 객체의 총합이 충분해야 하며, [ 의존적 ]
이를 계산하고 음료 + 거스름돈을 제공하는 과정을 거친다. [ 상태 변경 ]


상태 캡슐화

  • 객체는 자신의 상태를 외부에 직접 노출하지 않는다.
  • 외부에서 객체의 상태를 변경하려면 행동을 통해서만 가능하며,
    그 행동이 상태를 바꿀지 말지는 객체 스스로 판단한다.

예시)

  1. 사람 객체가 돈을 넣는다
  2. 사람 객체는 자신의 돈을 줄인다
  3. 자판기 객체에 메시지를 보낸다
  4. 자판기는 메시지를 수신한 뒤, 자체 규칙에 따라 돈을 받을지 말지를 결정한다
    → 외부 객체는 자판기의 상태 변화 여부를 알 수 없음

✔️ 왜 캡슐화가 중요한가?

  • 상태가 외부에서 조작이 가능하다면, 시스템 전체가 상태 의존적으로 되어 유연성을 잃는다.
  • 자율적인 객체는 유지보수성과 안정성 면에서 훨씬 강하다.

식별자

어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티다.
  • 객체를 서로 구분하기 위한 기준.
  • 두 객체가 같은 타입, 같은 상태를 가지고 있어도 식별자가 다르면 서로 다른 객체다.
  • 반대로, 상태가 달라도 식별자가 같으면 같은 객체로 본다.

→ 객체는 시간이 지나며 상태가 변하므로, 상태가 아닌 식별자로 구별해야 한다.

  • 식별자가 없고 상태만으로 비교된다면, 그건 객체가 아니라 이다.

행동 & 협력 중심 객체지향

설계 단계

  1. 어플리케이션에 필요한 협력을 생각한다.
  2. 협력에 참여하는 데 필요한 행동을 도출한다.
  3. 그 행동을 수행할 객체를 만든다.
  4. 객체가 행동을 수행하기 위한 상태를 결정한다.

장점

1. 캡슐화가 잘 지켜진다

→ 상태가 먼저가 아니라 행동에 필요한 정보로서 후순위로 고려되기 때문에
상태는 객체 내부에 **은폐(캡슐화)**되고, 외부 노출 위험이 줄어듦

2. 재사용성과 확장성이 높아진다

 객체는 자신의 책임 안에서 독립적으로 동작하도록 설계되기 때문에
다른 문맥에서도 쉽게 재사용하거나, 새로운 협력에 맞게 확장하기 쉬움


현실 세계와 객체지향 세계의 관계

객체지향은 현실 세계의 모방이 아니다.

현실 속 계좌는 스스로 금액을 이체할 수 없지만, 소프트웨어 속 계좌 객체는 자율성을 가지지 않는가?

→ 현실 세계의 메타포(은유)를 사용하는 건 이해를 돕기 위한 도구일 뿐이다.
→ 오히려 지나친 현실 모방은 객체지향적 사고를 방해할 수 있다.

따라서,

객체의 특성을 쉽게 이해시킬 수 있다면, 현실 속의 객체의 이름을 이용해 객체를 설계할 수 있다.

이해하기 쉽고 유지보수가 용이한 소프트웨어를 만들 수 있을 것이다.

그렇지 않다면, 깔끔하게 현실 속의 객체와의 연관성은 두고, 나만의 객체를 만들어라.

 

※ 본 글은 『객체지향의 사실과 오해』(조영호 저) 2장을 기반으로 학습 목적으로 요약한 글입니다.

※ 이 글은 책의 내용을 요약한 것으로, 원문 없이 읽을 경우 오해의 여지가 있을 수 있습니다. 정확한 이해를 위해 원서의 정독을 권장합니다.