[객체지향] 객체란 무엇인가?

ejkim·2025년 4월 8일

객체지향

목록 보기
1/2

객체지향 패러다임

객체지향 패러다임의 핵심은 자율적인(Automonous) 객체들의 협력

📍 Automonous : 자율적인, 독립적인; autos : 자신(self); nomos : 법칙, 질서

즉 "자율적인 객체들이 서로 협력하여 문제를 해결하는 구조"를 말한다.

  • 자율적인 객체들 → 객체가 책임을 가지고 스스로 행동함, 객체는 혼자 존재하지 않음
  • 서로 협력 → 객체 간 역할 분담과 메시지 전달
  • 문제 해결 → 도메인을 어떻게 모델링할 것인가

객체는 자신의 상태를 관리하며 공동의 목표를 달성하기 위해 메세지를 주고받으며 다른 객체와 협력한다.

💡객체지향의 주요 특징 (OOP 4대 특성)

특성설명키워드
캡슐화중요한 것만 표현하고, 나머지는 감춤본질만 단순화
추상화상태(데이터)를 감추고, 행동(메서드)으로 접근정보 은닉
상속기존 타입의 특징을 물려받음코드 재사용
다형성같은 메세지를 다른 방식으로 처리확장 유연성

객체(Object)의 종류

  1. 엔티티(Entity) / 참조 객체(Reference Object): 식별자가 중요 (예: 주문 ID, 사용자 ID)
  2. 값 객체(Value Object): 값이 중요, 식별자 없음 (예: Money, Address)

객체지향에서의 객체

상태(state)·행동(behavior)·식별자(identity)를 캡슐화한 것, 즉 엔티티(Entity) 혹은 참조 객체(Reference Object)를 말한다.

왜 객체지향에서 ‘객체’는 참조 객체(엔티티)일까?

  • 객체지향은 “누가 무엇을 한다”가 중요
  • 그 “누구”가 바로 ID로 구별되는 주체인 참조 객체(엔티티)

동등성 : 객체가 같다

객체지향에서 “객체가 같다는 게 무엇을 의미하느냐”가 매우 중요하다.
객체는 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다.

이를 "객체는 가변상태(mutable state)를 가진다."라고 말한다.

그럼 “두 객체가 같은가?”를 어떻게 판단할까?

자바에서의 동등성 구현 예

엔티티(참조 객체) vs 값 객체 구분에서 → 비교 기준이 다르기 때문에 동등성 개념이 중요!

  • User (엔티티): 시스템 내에서 누구를 식별하기 위한 고유 ID 보유
/** 엔티티: 식별자(id)가 객체 정체성을 나타낸다 */
class User {
    private final String id;      // 식별자
    private String name;

    // equals / hashCode — ID만 사용
    @Override
    public boolean equals(Object o) {
        return o instanceof User u && id.equals(u.id);
    }

    @Override
    public int hashCode() {
        return id.hashCode();
    }
}    
  • Money (값 객체): 금액·통화 조합으로 무엇인지 표현, 주로 불변(immutable)
/** 값 객체: 불변(immutable)하고 값 비교 */
class Money {
    private final int amount;
    private final String currency;

    // equals / hashCode — 값 비교
    @Override
    public boolean equals(Object o) {
        return o instanceof Money m && amount == m.amount && currency.equals(m.currency);
    }

    @Override
    public int hashCode() {
        return Objects.hash(amount, currency);
    }
}

📍 포인트 : 같은 객체를 판단하는 비교 기준

  • 엔티티는 누구냐가 중요 → ID 기반 비교
  • 값 객체는 무엇이냐가 중요 → 상태 전체 기반 비교

💡 자바에서 동등성(Equality)

Equality란?

  • 참조 동일성(==) : 메모리 주소가 같음 → 같은 인스턴스

  • 의미적 동등성(equals) : 객체가 의미적으로 같음 → 개발자가 정의

  • equals()와 hashCode() 계약

    • equals가 true이면 hashCode도 같아야 함
    • 컬렉션(Set, Map)에서 필수

상태(State)와 프로퍼티(Property)

상태를 알면 과거에 어떤 행동을 했었는지 모르더라도 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.

객체는 상태를 외부로 노출시키지 않고, 행동을 노출시키고, 행동의 결과로 스스로의 상태를 변경한다. 이것은 객체의 자율성을 높이고, 객체간의 협력을 유연하고 간결하게 한다.

프로퍼티(Property)

객체의 상태를 구성하는 모든 특징의 집합. 정적 메타정보이며 두 가지로 나뉜다.

  1. 속성(Attribute) : 단순 값으로 표현되는 특징 (예: 이름, 금액)

  2. 링크(Link) : 다른 객체를 참조하는 포인터 → 연관관계의 인스턴스 (예: 주문 → 고객)

프로퍼티의 값(Value)

  • 실행 중 동적으로 변할 수 있는 데이터. 시간에 따라 달라질 수 있다.

📌 참고
📖 : 객체지향의 사실과 오해 - 역할, 책임, 협력 관점에서 본 객체지향

profile
어떤 것이든 그것이 지닌 특별한 속성이나 가치를 간과해서는 안 된다.

0개의 댓글