깨달은점

생성자 파라미터 타입

이전까지는 기능을 구현하면서 현재 상황에 맞는 타입 을 생성자 파라미터로 만들었었습니다. Input 으로 받아온 값들은 모두 String 으로 받았으며 Lotto 도 로또 번호들을 입력으로 받아왔기 때문에 List<String> 또는 List<Integer> 등으로 받아왔습니다. 그러나 객체가 가지는 인스턴스 변수의 타입과는 다른 타입의 파라미터를 받는다면 해당 타입과는 다른 검증 과정과 변환 과정이 필요합니다. 이후에 기능이 추가되면서 구현된 타입에 맞지 않은(String 파라미터를 갖는 생성자를 만들었는데 Integer 로 생성자를 호출하고 싶음) 값으로 생성자를 호출하고 싶다면 추가 변환 및 검증이 필요했고 더 확장될수록 대체 이 객체의 생성자 기준은 어떤 것인지가 파악하기 어려웠습니다.

소니 피드백을 받고 생각해본 결과 객체의 생성자 파라미터 기본값은 인스턴스 변수로 가지는 타입으로 두는 것이 적절하다고 느꼈습니다. 하나의 타입 기준을 정해두니 여러 곳에서 생성자를 호출해도 그때 상황에 맞게 변환 후 생성자를 호출할 수 있었으며 생성자 내 검증 범위가 단순화되었습니다. 또 기본 타입으로 생성자를 호출하는 것이 도메인 내부 로직에 대한 수정을 줄여 캡슐화에 더 가깝지 않을까 생각합니다.

1단계 피드백 답변

VO 사용 이유

소니가 언급해주기 전까지 VO를 몰랐어서 찾아봤습니다. 🤣  equals를 오버라이딩한 이유와 마찬가지로 로또 번호를 번호가 동일한 객체를 다른 객체로 분류하는 것이 의미가 없다고 생각했기 때문입니다. 동일한 로또 번호로 구성되어 있는 로또는 각각 다른 개체로써 당첨 번호와 비교가능한 유일한 객체지만 로또 번호는 로또를 생성하기 위해 사용되는 수단입니다. 로또 번호라는 특정한 번호의 공이 여러번 사용되어 로또라는 객체를 구성하는 역할일 뿐 1번과 또 다른 1번이 동일한 객체로써 사용되기 때문에 Ball 을 VO로 만들었습니다.

1단계 피드백 질문

Lotto 변수의 필요성

src/main/java/lotto/domain/Lotto.java

public class Lotto implements Comparable<Lotto> {
    private static final List<Integer> lottoTotalNumbers = new ArrayList<>();
    private static final int BALL_COUNT = 6;
    public static final int LOTTO_PRICE = 1000;
    private static final String ERROR_BALL_COUNT = BALL_COUNT + "개의 숫자를 입력해주세요";
    private static final String ERROR_DUPLICATED_NUMBER = "번호가 중복됩니다!";

    private final List<Ball> lotto = new ArrayList<>();

아래 두 필드 모두 필요한걸까요?

⇒ 소니의 피드백대로 로또 번호 들에 대한 캐싱이므로 Ball 로 이동하였습니다.

⇒ Lotto 라는 객체에 포함되어 있는 Ball 들의 묶음이기때문에 필요하다고 생각합니다...🥺 Lotto 객체 내에 자신의 정보를 담고 있음으로써 자동 로또 출력 시 정보를 반환할 수 있고 WinningLotto 객체 생성 시 당첨 번호와 보너스볼 중복 여부를 확인하는 기능을 제공할 수 있다고 생각합니다. 아닐까요?😔

코드 설명

Lotto 인스턴스 변수 lotto 의 타입 TreeSet 으로 변경

List 로 받고 List 로 저장해두어도 검증 과정을 거치기 때문에 그대로 두어도 상관 없으나 다른 개발자에게 이 로또 내 로또 번호가 중복되지 않는 다는 것을 표현하기 위해 TreeSet 으로 타입을 수정하였습니다. 사용자에게 적절한 오류 메시지를 남기기 위해서 Lotto 생성자 파라미터 타입은 List 로 받아와 검증 진행 후 TreeSet 으로 저장하였습니다.