인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

Jinyoung Choi님의 프로필 이미지
Jinyoung Choi

작성한 질문수

오브젝트 - 기초편

가격 필드가 Long fee가 아닌 Money fee가 된 계기가 궁금합니다.

해결된 질문

작성

·

39

1

안녕하세요. 강사님! 너무나 알찬 강의 감사드립니다. 한가지 궁금한 점이 있습니다.

만약 제가 영화 예매 설계를 해야하는 상황이었다면, '가격' 필드를 Long 타입으로 할 생각밖에 못했을 것 같은데, Money 라는 클래스로 가격을 표현하게 된 계기를 여쭤보고 싶습니다.

답변 2

1

조영호님의 프로필 이미지
조영호
지식공유자

Jinyoung Choi님 안녕하세요.

강의가 도움이 되셨다니 다행이네요.

좋은 질문 남겨 주셔서 감사합니다. 🙂

Money 클래스를 사용할 때 얻을 수 있는 이점은 아래 인프런 AI 인턴의 답변을 참고해 주시면 좋을것 같아요.

일반적으로 Money와 같은 클래스를 도입하는 이유는 Long과 같은 원시형 타입으로는 표현하려는 개념을 명확하게 드러낼 수 없을 때 사용합니다.

예를 들어서 다음과 같은 클래스가 있다고 생각해 보겠습니다.

class AnyClass {
  private Long amount;
  private Long distance;

  public void increase(Long amount, Long distance) {      
    this.amount += amount;
    this.distance += distance;
  }
}

위 클래스에서 amount와 distance는 타입은 Long으로 동일하지만 의미는 완전히 다릅니다.

하나는 금액을 의미하고 다른 하나는 거리를 의미합니다.

따라서 다음과 같이 클래스를 추가해서 의미를 명확하게 코드 안에 표현하는 것이 더 좋은 방법입니다.

class AnyClass {
  private Money amount;
  private Distance distance;

  public void increase(Money amount, Distance distance) {
    this.amount = amount.plus(amount);
    this.distance += distance.add(distance);
  }
}

원래의 클래스는 둘 다 Long 타입이기 때문에 파라미터를 잘못 넘기더라도 컴파일 타임에 체크를 하기 어렵습니다.

예를 들어서 AnyClass 인스턴스에 1000원을 더하고 거리에 10km를 더하고 싶다면 아래와 같이 메서드를 호출할 것입니다.

anyClass.increase(1000, 10);

프로그래머가 아래와 같이 두 값을 바꿔서 보내더라도 컴파일러는 오류를 체크할 수 없습니다.

anyClass.increase(10, 1000);

하지만 수정 후에 아래와 같이 메서드를 호출하면 타입이 다르기 때문에 컴파일 에러가 발생하게 됩니다.

따라서 더 안정적으로 코드를 작성하고 유지보수할 수 있게 됩니다.

anyClass.increase(Distance.of(10), Money.wons(1000));

일단 Money나 Distance와 같은 클래스가 있다면 금액이나 거리를 계산하는 코드가 중복될 경우 이 클래스드로 이동시켜 중복 코드를 제거할 수 있기 때문에 재사용성도 높아집니다.

 

개념을 명확하게 표현하고 싶을때마다 이러 작은 클래스를 만드시면 됩니다.

이런 작은 클래스들을 값 객체라고 부릅니다.

 

값 객체에 대한 더 자세한 내용은 아래 블로그를 참고해 주시면 감사하겠습니다.

https://eternity-object.tistory.com/2

 

보시면서 궁금한 내용이 있으면 언제라도 질문 주세요. 🙂

감사합니다.

Jinyoung Choi님의 프로필 이미지
Jinyoung Choi
질문자

주말 아침부터 시간 내주셔서 감사합니다!
말씀해주신 내용 이해됐어요! 값 객체에 대해서도 더 공부해보겠습니다.

친절한 답변 감사드립니다!

0

안녕하세요, 인프런 AI 인턴입니다. Jinyoung Choi님, 강의에서 중요한 개념을 잘 짚어주셨네요. 가격 필드를 나타낼 때 일반적으로 Long이나 double 자료형을 사용한다고 생각할 수 있지만, 강의에서는 Money 클래스를 사용했습니다. 이유를 간단히 설명드리겠습니다.

Money 클래스를 사용하는 이유

  1. 타입 안정성:

    • Long이나 double 변수를 사용하면 가격을 다루는 코드에서 실수가 발생할 가능성이 있습니다. 특히, 소수점을 다뤄야 하거나, 다른 금액 단위와의 연산을 할 때 혼란이 있을 수 있습니다. Money 클래스를 사용하면 금액 처리 시 타입 안정성을 높일 수 있습니다.
  2. 의미 명확성:

    • Money 클래스는 단순히 숫자의 결과로 끝나지 않고, 금액과 관련된 의미를 더 명확히 전달합니다. 이는 코드의 가독성을 높이고 유지보수 시 혼란을 줄여줍니다.
  3. 부가 기능:

    • Money 클래스에는 단순 변수 이상의 기능이 포함될 수 있습니다. 예를 들어, 통화 단위를 관리하거나 금액의 덧셈, 뺄셈 같은 연산 기능을 포함할 수 있습니다. 이를 통해 코드 내 비즈니스 로직이 더 명확해집니다.
  4. 불변 객체로 활용:

    • 금액을 표현할 때는 불변성을 유지하는 것이 중요할 수 있습니다. Money 클래스는 불변 객체로서, 한번 설정된 값을 변경하지 않으므로 부작용을 방지할 수 있습니다.

이 외에도, 강의 중에 이러한 구현을 채택하는 이유에 대해 더 심도 있는 설명이 있을 수 있습니다. 객체지향 프로그래밍에서 이러한 특수한 클래스를 사용하는 이유는 개념의 명확화와 유지보수성을 높이기 위한 노력이라고 볼 수 있습니다.

해당 주제와 관련하여 더 깊이 있는 설명이나 강의 내 다른 부분을 참고하는 것도 추천드립니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Jinyoung Choi님의 프로필 이미지
Jinyoung Choi

작성한 질문수

질문하기