본문 바로가기
📝 회고/✅ 22년 회고

[일일 회고] 22.02.23 - 여전히 Java 연습중

by kukim 2022. 2. 24.

📍오늘 한 일

✅ 생각과 코드 리뷰 

✅ enum 사용

로또 당첨 순위(Rank) 표현하기 위해 enum을 사용했다. 이유는 다음과 같다.

1. Rank(순위) 관련 데이터를 한 번에 묶기 위해서 

하나의 데이터, 순위만 가지고 있는 것이 아닌 당첨 금액도 함께 가지고 있고 싶었다.

 

2. 순위 결정 로직이 enum 안에

Rank.of(당첨 개수, 보너스 당첨 번호 여부)로 넘겨주면 enum 스스로 계산하여 해당하는 Rank를 리턴할 수 있었다. 상태와 행동을 한 번에 묶을 수 있었다. 

 

3. toString 오버라이딩

오버 라이딩을 통해 해당 enum의 정보를 외부에 쉽게 표현할 수 있었다.

public enum Rank {
    FIRST(6, 2_000_000_000L),
    SECOND(5, 30_000_000L),
    THIRD(5, 1_500_000L),
    FOURTH(4, 50_000L),
    FIFTH(3, 5_000L),
    FAILED(-1, 0L);
    
    public static Rank of(int matchCount, boolean matchBonus) {
        switch (matchCount) {
            case 6:
                return FIRST;
            case 5:
                return matchBonus ? SECOND : THIRD;
        }
    }
    
    @Override
    public String toString() {
        if (this == SECOND) {
            return String.format("%d개 일치, 보너스 볼 일치(%d원)", countOfMatch, reward);
        }
        return String.format("%d개 일치, (%d원)", countOfMatch, reward);
    }
}

 

위 코드의 문제가 있다면 FAILED에 아무 생각 없이 당첨 개수가 -1로 작성했다. 0으로 바꿔야겠다.

 

for vs stream 가독성 싸움

생각 : 성능이 중요하다면 for문을 사용, 가독성은 stream vs for 중 더 좋은 걸로 선택

 

처음 stream으로 작성했지만 entry.getKey().getReward() * entry.getValue()에 가독성이 좋지 못한 거 같아 for문으로 변경해보았다.

막상 바꾸니 stream이 더 좋아 보이는.. 

public class LottoGameResults {
    private long getTotalReward() {
        return rankCounts.entrySet().stream()
                .mapToLong(entry -> entry.getKey().getReward() * entry.getValue())
                .sum();
    }

    private long getTotalRewards() {
        long totalRewards = 0;
        for (Map.Entry<Rank, Integer> entry : rankCounts.entrySet()) {
            long reward = entry.getKey().getReward();
            int count = entry.getValue();
            long totalReward = reward * count;
            totalRewards += totalReward;
        }
        return totalRewards;
    }
}

호눅스에게도 질문을 드려보니 이전의 stream이 좋다는 의견을 받았다.

 

댓글