티스토리 뷰

Lotto 프로그램을 개발하는 과정에서 수정된 내용을 간단하게 정리해보려고 한다.

피드백1) Lotto 번호에 대한 유효성 검증을 Lotto를 생성하는 Factory 클래스가 아닌, Lotto 생성자에서 진행하도록 수정하자!


[LottoFactory.java]

public static Lotto createLotto(String lottoString) {
        if(!isValidFormat(lottoString)) {
            try {
                throw new LottoException("유효하지않는 형식의 당첨번호를 입력하셨습니다.");
            } catch (LottoException lottoException) {
                return InputView.getWinningNum();
            }
        }
        return new Lotto(createWinningLottoNumbers(lottoString));
}

[Lotto.java]

public Lotto(List lottos) {
        this.lottos = lottos;
}


Factory 클래스는 변경하지 않고, Lotto 클래스에 예외처리를 추가 하였다. Factory 클래스에서 유효성 검증을 하고 있지만, Lotto 클래스에서도 검증을 하는

이유는 Lotto 생성자를 통해서 Lotto 객체를 생성할 수 있는 가능성이 있기 때문이다. 최대한 Factory 클래스를 통해 객체를 생성할 수 있도록 접근제한자를 

public 으로 하지 않았다.


[Lotto.java]

Lotto(List lottos) {
        if(isDuplicationLottoNumber(lottos)) {
            throw new IllegalArgumentException("중복된 번호를 입력하셨습니다.");
        }
        this.lottos = lottos;
    }

/* 당첨번호에 중복된 번호가 있는지 확인하는 메소드 */
 private static boolean isDuplicationLottoNumber(List lottoNums) {
        if(new HashSet(lottoNums).size() < Lotto.LOTTO_NUMBER_COUNT) {
            return true;
        }
        return false;
 }


피드백2) 불필요한 인스턴스 변수가 존재한다.

아래 코드를 보면, pay라는 정수형 인스턴스 변수가 존재한다. pay는 수익률을 계산하기 위한 인스턴스 변수이기 때문에 반드시 필요하다!

하지만, 인스턴스 변수로 생성하지 않아도, 간단한 연산을 통해 얼마든지 pay의 값을 구할 수 있다.

List 타입인 lottos는 Lotto 를 가지고 있는 객체이기 때문에, lottos.size()는 Lotto의 갯수이다! 

그렇기 때문에 pay = lottos.size() * LOTTO_PRICE 로 연산이 가능하다!


피드백3) 불필요한 디폴트 생성자가 존재한다.

디폴트 생성자는 테스트 코드에서 countGameNum 메소드 테스트 하기 위한목적으로 생성했다. 하지만 해당 메소드를 테스트하기 위해서 생성자는 불필요!

이유는 pay라는 인스턴스 변수는 위에 피드백을 생략이 가능하고, 인스턴스 변수를 메소드에서 사용하지 않는다면, 굳이 인스턴스 메소드로 구현이 필요없다!

static 키워드를 가진 클래스 메소드가 적합하다! 결국은, 인스턴스 변수를 사용하는 메소드는 인스턴스 메소드, 그렇지 않으면 클래스 메소드로 구현하자.

마지막으로, 로또의 갯수를 구하는 메소드는 단순히 리스트의 크기를 반환하면 될거같다! 


[LottoGame.java]

public class LottoGame {
    public static final int LOTTO_PRICE = 1000;
    private List lottos;
    private int pay;

    public LottoGame() {
        lottos = new ArrayList<>();
    }

    public LottoGame(int pay) {
        this();
        this.pay = pay;
        buyLottos();
    }

    // 가격에 맞게 구매할 수 있는 로또 갯수 구하는 메소드 */
    public int countGameNum(int pay) {
        return pay / LOTTO_PRICE;
    }

    // 가격에 맞게 로또를 구매하는 메소드
    public void buyLottos() {
        for(int i = 0; i < countGameNum(pay); i++) {
            lottos.add(LottoFactory.createLotto());
        }
    }

    // 로또와 결과값을 비교하는 메소드
    public void setLottoReward(Reward reward) {
        for(Lotto lotto : lottos) {
            reward.addRewardResult(lotto);
        }
    }

    // 결과값을 가지고 있는 LottoDto 생성 
    public LottoDto createLottoDto() {
        return new LottoDto(lottos);
    }

    // 결과값을 가지고 있는 RewardDto 생성
    public RewardDto createRewardDto(Reward reward) {
        return reward.createRewardDto(pay);
    }
}


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함