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

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

황설탕님의 프로필 이미지
황설탕

작성한 질문수

오브젝트 - 기초편

5-1-예제. 객체 구현하기

generic 패키지 money 클래스 관련 질문

해결된 질문

작성

·

26

1

최근 전체적인 강의를 한번 돌려본 후 간단한 프로젝트 과제를 구현하는 과정에서 배운 내용을 최대한 적용해보려 노력하며 복습을 하고 있습니다.

복습 중 행동을 정의한 후 객체를 선택하라 를 적용하는 과정에서 궁금증이 생겼습니다.
해당 강의와 소스코드에서는 generic 패키지에 Money 클래스를 제공해주고 있습니다.

  1. Money 클래스가 있는 generic 패키지는 보통 어떤 특성을 가지는 클래스들을 모아놓는지 궁금합니다.

     

  2. Money 클래스와 같은 역할을 하는 객체들 또한 행동을 정의한 후 객체를 선택하라 의 원칙에 의해 행동을 정의 한 후 필드를 결정하는 것인지 궁금합니다.

  3. Money 같은 성격의 클래스는 어떤 서비스를 설계하기 전 전 미리 작성한 후 서비스 설계를 해야하나요?

  4. Money 는 새 불변 객체를 만들어 리턴해주는 방식으로 사용하던데 Screening 등의 클래스에서는 불변 객체를 사용하지 않는 이유가 있는지, 있다면 특정 클래스를 불변 객체로 설계하는 기준이 있는지 궁급합니다.

답변 2

1

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

황설탕님 안녕하세요.

좋은 질문해 주셔서 감사합니다.

말씀하신 것처럼 강의 내용을 확실하게 이해하는 가장 좋은 방법은 실제로 코드를 작성하는데 적용해 보는 것 같아요. :)

  1. Money 클래스가 있는 generic 패키지는 보통 어떤 특성을 가지는 클래스들을 모아놓는지 궁금합니다.


    개인적으로 특정한 도메인이나 애플리케이션에 종속되지 않고 여러 애플리케이션에서 재사용할 수 있는 클래스들을 모아 놓습니다.


    Money 클래스는 금액이 필요한 어떤 애플리케이션에서도 재사용가능하기 때문에 generic 패키지에 위치시켰습니다.

     

  2. Money 클래스와 같은 역할을 하는 객체들 또한 행동을 정의한 후 객체를 선택하라의 원칙에 의해 행동을 정의 한 후 필드를 결정하는 것인지 궁금합니다.


    Money와 같은 유형의 객체는 일반적으로 클래스의 코드를 리팩터링하는 과정에서 함께 사용되는 필드들과 관련된 로직을 명시적인 개념으로 묶기 위해 사용됩니다.


    따라서 행동을 정의한 후 객체를 선택하는 방식과는 조금 다른 관점에서 설계가 진행됩니다.


    필드가 아니라 로직을 담는 클래스를 추가한다는 점에서 행동에 집중한다는 점은 동일하지만 협력을 설계하는 과정에서 행동을 먼저 결정하고 객체를 나중에 결정한다기 보자는 이미 구현된 로직을 옮겨 담을 객체를 추가한다는 개념으로 접근하는게 일반적입니다.

     

  3. Money 같은 성격의 클래스는 어떤 서비스를 설계하기 전 전 미리 작성한 후 서비스 설계를 해야하나요?


    2번 질문에서 답변드린 것처럼 일반적으로 기존 코드를 리팩터링하는 과정에서 Money와 같은 유형의 객체가 추가됩니다.


    물론 Money처럼 여러 도메인에 걸쳐 사용될 수 있는 클래스라면 이미 구현되어 있는 클래스를 재사용하기도 하겠지만 도메인에 특화된 객체나 존재하지 않는 경우에는 구현을 하면서 식별되는 것이 일반적입니다.

     

  4. Money 는 새 불변 객체를 만들어 리턴해주는 방식으로 사용하던데 Screening 등의 클래스에서는 불변 객체를 사용하지 않는 이유가 있는지, 있다면 특정 클래스를 불변 객체로 설계하는 기준이 있는지 궁급합니다.


    Money는 값 객체(Value Object)에 속하고 Screening은 참조 객체(Reference Object)에 속합니다.


    값 객체는 참조 객체의 속성을 표현하기 위해 사용되며 불변으로 만드는 것이 일반적입니다.


    값 객체와 참조 객체의 개념과 용도에 대해서는 제 블로그에 있는 시리즈 글을 참고하시면 쉽게 이해하실 수 있으실 거에요. :)


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

답변이 되었는지 모르겠네요. 🙂
감사합니다.

 

0

안녕하세요, 인프런 AI 인턴입니다. 황설탕님, 질문 주셔서 감사합니다.

객체지향 설계에서는 행동을 정의한 후 객체를 선택하라는 원칙이 아주 중요합니다. 이 원칙에 따라 코드를 설계할 때, 행동을 성공적으로 구현할 수 있는 가장 적합한 객체를 선택하게 되므로 코드의 유연성과 확장성을 높일 수 있습니다.

이제 질문하신 각각의 부분에 대해 답변드리겠습니다.

1. generic 패키지의 특성

generic 패키지는 보통 여러 도메인에서 공통으로 사용될 수 있는 일반적인 기능이나 도구를 모아놓는 경우가 많습니다. 예를 들어, 돈, 날짜, 시간, 문자열 유틸리티 등이 해당될 수 있습니다. 이런 클래스들은 명확히 재사용 가능한 특성을 가집니다.

2. Money 클래스와 원칙 적용

Money와 같은 클래스는 특정 비즈니스 문맥에서 다양한 상황에 대응할 수 있는 행동을 정의한 뒤 필요한 필드를 갖도록 설계합니다. Money 클래스의 경우, 예시로 덧셈, 뺄셈, 등의 다양한 화폐 연산을 수행할 수 있도록 필요한 필드를 두고 행동을 준비합니다.

3. 작성 시점

Money와 같은 기본적인 비즈니스 객체는 프로젝트의 초기 단게에서 설계되어 정의되는 것이 일반적입니다. 이는 다른 클래스가 이러한 객체에 의존하여 그 위에 기능을 쌓아가기 때문에, 신중한 초기 설계가 중요합니다.

4. 불변 객체 사용 기준

불변 객체는 객체의 상태가 생성된 이후에는 바뀌지 않는 특성을 갖습니다. 이는 동시성과 관련된 결함을 방지하고, 코드의 신뢰성을 높일 수 있습니다. Money와 같은 클래스는 부정확한 값 변경을 방지하기 위해 불변 객체로 만들어 관리하는 반면, Screening과 같은 경우는 상태 변화가 자연스럽게 요구되는 도메인이라면 가변 객체로 설계하는 것이 더 적합할 수 있습니다.

불변 객체로 설계할 기준은:
- 값 객체(Value Object): 시간, 날짜, 암호와 같은 객체들은 주로 불변으로 설계됩니다.
- 스레드 안전성(Thread Safety): 다수의 스레드가 동시에 접근할 때의 안전을 보장하고자 할 때 사용됩니다.
- 불변성 자체의 의미: 도메인의 핵심 개념이 변하지 않아야 하는 경우(예: ID).

해당 주제와 연관해서 유사한 질문과 답변을 참고할 수 있는 게시글도 확인하시면 좋겠습니다:

위의 내용이 황설탕님께 도움이 되길 바라며, 추가적으로 궁금한 점이 있으시면 주저하지 마시고 질문해 주세요. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 곧 지식공유자님께서도 추가적인 해설을 해주실 것입니다. 감사합니다.

황설탕님의 프로필 이미지
황설탕

작성한 질문수

질문하기