https://github.com/nbalance97/java-lotto/tree/step1

 

GitHub - nbalance97/java-lotto: 로또 미션 진행을 위한 저장소

로또 미션 진행을 위한 저장소. Contribute to nbalance97/java-lotto development by creating an account on GitHub.

github.com


페어 프로그래밍


1단계 미션은 페어 프로그래밍으로 진행되기 때문에 당연히 로또 미션 1단계도 페어프로그래밍으로 진행된다. 이번에 매칭된 페어는 에덴!!

 

첫날은 Intelij의 Code with me를 사용해서 어느정도만 구현을 해 두고, 다음 날에 잠실 스터디룸을 빌려 에덴의 맥북 프로로 페어 프로그래밍으로 미션을 진행했다. 꼭 구현하면서 의견 교환이 아니더라도 충분히 많이 배우게 된 점이 있었다. 인텔리제이의 단축키 사용이었다. 

 

사실 단축키를 익혀야 겠다라고 생각은 했지만 당장 필요하지는 않은거 같아 미루고 있던 찰나에 페어가 단축키를 사용하는 모습은 나로 하여금 신선한 충격을 받게 만들었다. 훨씬 편하게 코딩하는 모습을 보고 집에 돌아와서 부랴부랴 필즈와 포키가 정리해 주신 단축키 공부를 시작했다..ㅎㅎ 에덴 덕분에 스스로 무엇이 부족한지 알 수 있게 되어서 좋은 경험이었다.

 


피드백 및 리팩토링


이번에 매칭된 멘토인 루피는 잘 때리실 거 같은 닉네임과는 다르게 좋은 피드백을 많이 남겨주셨다. 그 중 기억에 남는 피드백 중 기억에 남는 피드백 하나를 정리해보고자 한다.

로또의 각 숫자의 객체화

이전에는 로또의 각 번호를 Integer로 가지고 있도록 구현하였으나 피드백에서 로또 번호에 대해서 많은 검증을 하고 있어서 로또 번호를 객체로 만들어 역할을 분리해보라는 피드백을 받았다. 처음에는 왜 굳이 그렇게까지 객체로 나누어서 해야 하지? 싶어서 마지막의 마지막까지 미루다가 피드백 주신 내용이니 한번 해보자는 마음으로 시도해 본 결과 개인적으로 훨씬 좋았다.

 

LottoNumber라는 클래스에서 로또 번호의 검증을 해주고, WinningLottos와 Lotto 클래스에서는 로또 번호의 검증이 필요 없이 그냥 LottoNumber을 사용해 주기만 하면 되어서 코딩할 때 개인적으로 훨씬 편리하게 느껴졌다.

이 점에 대해서 루피에게 말씀드리니 단일 책임 원칙을 참고하라는 피드백과 함께 기존 Lotto 객체는 숫자 하나의 범위를 변경, 여러 숫자의 중복 허용 여부 두 가지 이유로 인해 변경될 여지가 있다. 라고 하셔서 후에 객체를 설계할 때 조금 더 많이 고민을 해보아야 겠다는 생각이 들었다.

 

번외로 LottoNumber 클래스를 만들면서 1~45까지의 인스턴스를 미리 만들어 두고, 정적 팩터리 메소드로 입력받은 숫자에 해당하는 인스턴스를 바로 반환해 보는 경험도 해 보아서 좋았다😃

 

public class LottoNumber {

    private static final int LOTTO_NUMBER_MAXIMUM = 45;
    private static final int LOTTO_NUMBER_MINIMUM = 1;
    private static final Map<Integer, LottoNumber> lottoNumberCache = new HashMap<>();

    static {
        for (int lottoNumber = LOTTO_NUMBER_MINIMUM; lottoNumber <= LOTTO_NUMBER_MAXIMUM; lottoNumber++) {
            lottoNumberCache.put(lottoNumber, new LottoNumber(lottoNumber));
        }
    }

    private int number;

    private LottoNumber(int number) {
        this.number = number;
    }

    public static LottoNumber of(int number) {
        validateNumberRange(number);
        return lottoNumberCache.get(number);
    }

    public int getNumber() {
        return number;
    }

    private static void validateNumberRange(Integer lottoNumber) {
        if (lottoNumber > LOTTO_NUMBER_MAXIMUM || lottoNumber < LOTTO_NUMBER_MINIMUM) {
            throw new IllegalArgumentException();
        }
    }
}

 

또한 추가적으로 기억에 남는 피드백은 필드에 리스트가 있으면 생성자에서 생성해주는 방식을 루피가 제안해 주셨는데 확실히 코드가 더 깔끔해지는것 같아서 기억에 남았다.👀 ArrayList 생성을 항상 필드에서 해주는 습관이 있었는데 이번 기회에 좀 더 깔끔하게 작성하는걸 고민하게 된 것 같다..ㅇㅇ

 

아래 녀석은 ArrayList를 필드에서 초기화시켜 주고, 생성자에서 요소를 추가하는 기존 본인의 방식이다.

private final List<LottoNumber> lottoNumbers = new ArrayList<>();

public Lotto(List<LottoNumber> lottoNumbers) {
    validateDuplicatedNumber(lottoNumbers);
    this.lottoNumbers.addAll(lottoNumbers);
}

 

굳이 이렇게 할 필요 없이.. 그냥 ArrayList 생성자의 매개변수로 lottoNumbers를 넘겨주면 된다.

private final List<LottoNumber> lottoNumbers;

public Lotto(List<LottoNumber> lottoNumbers) {
    validateDuplicatedNumber(lottoNumbers);
    lottoNumbers = new ArrayList<>(lottoNumbers);
}

 

1단계에서는 LottoNumber로 분리하는 것 이외에는 크게 어려운 피드백은 없었던 것 같고 루피가 좋은 조언들을 많이 남겨주셔서 생각을 많이 해보게 되어 좋은 경험인 것 같다.👍

그나저나 갈길이 멀다.. 아직 모르는게 많은것 같고 다른 크루들의 코드를 조금씩 보면서 눈치껏 배우고 있는데 언젠간 성장할 거라 생각하며 이번 미션에 임하려고 한다.~

+ Recent posts