본문으로 바로가기
dobidugi
목록으로
강의

참조 객체와 값 객체 - 작은 클래스 만들기

6분
목차

클래스를 작게 유지하는 두 기법 중 “값 객체 분리”로 넘어가기 위한 전 단계로, 그 대비 개념인 참조 객체(Reference Object) 와 별칭(alias) 문제를 게임 매출 예제로 설명한다.

클래스도 작게 만들어야 한다

💡 TIP 작은 클래스를 만드는 두 가지 방법

  1. 클래스의 일부 로직을 값 객체로 분리한다.
  2. 단일 책임 원칙(SRP) 을 적용해 클래스의 책임을 작게 유지한다.

(단일 책임 원칙은 이후 강의에서 다루고, 이번에는 값 객체를 향한 기초로 참조 객체부터 본다.)

예제: 게임 매출 관리 애플리케이션

요구사항

계산 흐름 예시

판매개당 판매가이번 판매액누적 수량누적 금액영업이익(20%)
3개 판매9,000원27,000원3개27,000원5,400원
+2개 판매9,000원18,000원5개45,000원9,000원

코드 구현

Game 클래스

Sales 클래스

// 개념 스케치
class Game {
    String title;
    int price;         // 정가
    double discountRate; // 할인율

    int calculateSalePrice() {
        return (int)(price * (1 - discountRate)); // 10000 * 0.9 = 9000
    }
}

class Sales {
    Game game;
    int totalQuantity;
    int totalPrice;

    void addSale(int quantity) {
        totalQuantity += quantity;
        totalPrice += game.calculateSalePrice() * quantity;
    }

    int profit() {
        return (int)Math.ceil(totalPrice * 0.2); // 누적 금액의 20% 올림
    }
}

문제 발견: 여러 Sales 객체로 나누면?

📌 IMPORTANT 두 개의 Sales 객체가 각각 전체 판매의 일부만 관리하게 되어, 어느 쪽으로 profit()을 호출해도 영업이익의 일부만 나온다. 둘 다 정답이 아니다.

참조 객체(Reference Object)

📝 NOTE 정의 여러 클라이언트가 동일한 객체를 공유해서 오퍼레이션을 실행해야 하는 객체를 참조 객체(Reference Object) 라고 부른다.

별칭(Alias)

📝 NOTE 정의 두 개의 변수가 동일한 객체를 가리킬 때, 그 두 변수를 별칭(alias) 이라고 부른다. 하나의 객체를 여러 이름으로 부르는 것.

📌 IMPORTANT 별칭은 장점이자 단점

  • 장점 : 여러 클라이언트가 상태를 공유해야 할 때(예: 하나의 Sales가 모든 판매 내역 관리) 쉽게 해결된다.
  • 단점 : 잘못 쓰면 원하지 않는 상황에서도 변경이 전파된다. 예상치 못한 상태 변경은 심각한 버그로 이어질 수 있다.

해결의 방향: 값 객체

💡 TIP 별칭 문제의 좋은 해결책은, 상태가 바뀌는 참조 객체 대신 상태가 바뀌지 않는 불변(immutable) 객체를 쓰는 것이다. 이렇게 값이 바뀌지 않는 작은 객체를 값 객체(Value Object) 라고 부른다.

→ 다음 시간: 값 객체를 이용해 참조 객체의 복잡성을 낮추는 방법.

핵심 요약



이전 글
조합 메소드로 run 메소드 리팩토링하기
다음 글
값 객체(Value Object)