객체란
객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.
- 물리적인 것이든 개념적인 것이든, 하나의 개별적인 단위로 다룰 수 있어야 객체로 볼 수 있다.
- 생성 시점을 알 수 있고, 다른 객체와 구별 가능하며, 수량을 셀 수 있다.
상태
특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
- 단순한 값이나 다른 객체들의 조합으로 표현되며, 흔히 **속성(property)**이라고 부른다.
- 상태는 미래의 행동 결과를 예측하게 돕는다.
예시) 자판기에 500원을 넣으면, 1700원 음료수를 뽑을 수 있는가?
- [행동 이력 기반]
자판기에 100원 3개 → 500원 1개 → 100원 4개 → 앞으로 500원 넣을 예정
→ 가능 여부 판단이 복잡해짐 - [상태 기반]
자판기 현재 보유 금액 1200원
→ 500원 추가 시, 1700원 음료 구입 가능 여부를 단번에 판단할 수 있음
→ 상태를 기반으로 판단하는 것이 더 간결하고 효과적이다.
- Attribute
객체를 구성하는 단순한 값
ex) 화폐 객체의 금액 - Link
객체 간 연결. 메시지를 주고받기 위해 서로를 참조할 수 있어야 함
ex) 자판기 객체 [ ↔ / →] 화폐 객체
행동
외부의 요청 또는 수신된 메세지에 응답하기 위해 동작하고 반응하는 활동이다.
- 객체는 외부의 요청이나 수신된 메시지에 따라 반응(행동)한다.
- 이 과정에서 객체는 자신의 상태를 바꾸거나, 연결된 다른 객체의 상태에 영향을 줄 수 있다.
- 하지만 행동은 상태에 의존적이다.
예시)
자판기가 음료를 내보내기 위해서는 화폐 객체의 총합이 충분해야 하며, [ 의존적 ]
이를 계산하고 음료 + 거스름돈을 제공하는 과정을 거친다. [ 상태 변경 ]
상태 캡슐화
- 객체는 자신의 상태를 외부에 직접 노출하지 않는다.
- 외부에서 객체의 상태를 변경하려면 행동을 통해서만 가능하며,
그 행동이 상태를 바꿀지 말지는 객체 스스로 판단한다.
예시)
- 사람 객체가 돈을 넣는다
- 사람 객체는 자신의 돈을 줄인다
- 자판기 객체에 메시지를 보낸다
- 자판기는 메시지를 수신한 뒤, 자체 규칙에 따라 돈을 받을지 말지를 결정한다
→ 외부 객체는 자판기의 상태 변화 여부를 알 수 없음
✔️ 왜 캡슐화가 중요한가?
- 상태가 외부에서 조작이 가능하다면, 시스템 전체가 상태 의존적으로 되어 유연성을 잃는다.
- 자율적인 객체는 유지보수성과 안정성 면에서 훨씬 강하다.
식별자
어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티다.
- 객체를 서로 구분하기 위한 기준.
- 두 객체가 같은 타입, 같은 상태를 가지고 있어도 식별자가 다르면 서로 다른 객체다.
- 반대로, 상태가 달라도 식별자가 같으면 같은 객체로 본다.
→ 객체는 시간이 지나며 상태가 변하므로, 상태가 아닌 식별자로 구별해야 한다.
- 식별자가 없고 상태만으로 비교된다면, 그건 객체가 아니라 값이다.
행동 & 협력 중심 객체지향
설계 단계
- 어플리케이션에 필요한 협력을 생각한다.
- 협력에 참여하는 데 필요한 행동을 도출한다.
- 그 행동을 수행할 객체를 만든다.
- 객체가 행동을 수행하기 위한 상태를 결정한다.
장점
1. 캡슐화가 잘 지켜진다
→ 상태가 먼저가 아니라 행동에 필요한 정보로서 후순위로 고려되기 때문에
상태는 객체 내부에 **은폐(캡슐화)**되고, 외부 노출 위험이 줄어듦
2. 재사용성과 확장성이 높아진다
→ 객체는 자신의 책임 안에서 독립적으로 동작하도록 설계되기 때문에
다른 문맥에서도 쉽게 재사용하거나, 새로운 협력에 맞게 확장하기 쉬움
현실 세계와 객체지향 세계의 관계
객체지향은 현실 세계의 모방이 아니다.
현실 속 계좌는 스스로 금액을 이체할 수 없지만, 소프트웨어 속 계좌 객체는 자율성을 가지지 않는가?
→ 현실 세계의 메타포(은유)를 사용하는 건 이해를 돕기 위한 도구일 뿐이다.
→ 오히려 지나친 현실 모방은 객체지향적 사고를 방해할 수 있다.
따라서,
객체의 특성을 쉽게 이해시킬 수 있다면, 현실 속의 객체의 이름을 이용해 객체를 설계할 수 있다.
이해하기 쉽고 유지보수가 용이한 소프트웨어를 만들 수 있을 것이다.
그렇지 않다면, 깔끔하게 현실 속의 객체와의 연관성은 두고, 나만의 객체를 만들어라.
※ 본 글은 『객체지향의 사실과 오해』(조영호 저) 2장을 기반으로 학습 목적으로 요약한 글입니다.
※ 이 글은 책의 내용을 요약한 것으로, 원문 없이 읽을 경우 오해의 여지가 있을 수 있습니다. 정확한 이해를 위해 원서의 정독을 권장합니다.
'개발 관련 지식' 카테고리의 다른 글
객체지향의 사실과 오해 정리 - 4장. 역할, 책임, 협력 (0) | 2025.04.23 |
---|---|
객체지향의 사실과 오해 정리 - 3장. 타입과 추상화 (0) | 2025.04.21 |
객체지향의 사실과 오해 정리 - 1장. 협력하는 객체들의 공동체 (0) | 2025.04.18 |
TDD는 정말 최고의 설계 도구일까? – Bob Martin vs Jim Coplien의 토론 정리 (0) | 2025.04.12 |
Mock이란 (0) | 2025.04.07 |