2018-3-19 TIL Java enum 활용
enum을 이용해서 lotto프로그램 리팩토링
## Money.java
public class Money {
static ArrayList<Integer> totalMoney = new ArrayList<>();
static HashMap<Rank, Integer> finalCount;
List<Integer> addMoney = Arrays.asList(5000, 50000, 1500000, 2000000000);
static {
finalCount = new HashMap<>();
finalCount.put(Rank.FOURTH, 0);
finalCount.put(Rank.THIRD, 0);
finalCount.put(Rank.SECOND, 0);
finalCount.put(Rank.FIRST, 0);
}
public ArrayList<Integer> countAdd(ArrayList<Integer> counts, int i) {
int num = counts.get(i);
if (num > 2) {
int value = finalCount.get(Rank.valueOf(num));
totalMoney.add(addMoney.get(num - 3));
finalCount.put(Rank.valueOf(num), ++value);
}
return totalMoney;
}
}
## Rank.java
public enum Rank {
FIRST(6, 2000000000),
SECOND(5, 1500000),
THIRD(4, 50000),
FOURTH(3, 5000);
private int countOfMatch;
private int winningMoney;
private Rank(int countOfMatch, int winningMoney) {
this.countOfMatch = countOfMatch;
this.winningMoney = winningMoney;
}
public int getCountOfMatch() {
return countOfMatch;
}
public int getWinningMoney() {
return winningMoney;
}
public static Rank valueOf(int countOfMatch) {
Rank[] ranks = values();
for (Rank rank : ranks) {
if (rank.countOfMatch == countOfMatch) {
return rank;
}
}
return null;
}
}
- 자바의 enum을 활용해서, 로또의 문제를 개선을 했다. 기존에는 자바의 해쉬맵을 이용해서 finalCount<Integer, Integer>의 형태로 숫자 3,4,5,6을 넣었는데, finalCount<Rank, Integer>로 바꿈으로서 3,4,5,6을 FIRST(6, 2000000000),
SECOND(5, 1500000) 처럼 구분을 할 수 있게되었다. 또한 ResultView에서 반복되는 코드들이 많았는데, 밑에 코드처럼 1줄로 출력이 가능하도록했다. rank.getCountOfMatch()에는 “FIRST”, “SECOND”, “THIRD”, “FOURTH”와 같이 등수가 들어있고, rank.getWinningMoney()에는 상금의 목록이 들어와있어서 코드가 훨씬 간결해졌다.
for (Rank rank : ranks) { System.out.println(rank.getCountOfMatch() + "개 일치 (" + rank.getWinningMoney() + "원)- " + finalCount.get(rank) + "개"); }
오늘의 느낀점
- enum에 대해서 막연했는데, 직접 로또에서 활용을 하다보니까 그전보다는 많이 익숙해졌다. 특히 HashMap<Integer, Integer>에서 HashMap<Rank, Integer>를 바꿨을때, 갯수가 출력이 안되서 당황했었는데, finalCount.get(rank)에서 key값을 통해서 value를 호출할 수 있다는 것을 알게되었다. js나 python을 하면서 {}를 이용해서 key value를 가지는 자료구조에 대해서는 알고있었지만, java에서는 어떻게 표현을 해야될지는 몰랐었다. 그러다가 오늘 직접구현을 하고 사용을 하다보니까. key값을 통해서 value를 불러오고, 역으로 value를 통해서 key값을 불러오는 방법에 대해서 알게되었다.
Written on March 19, 2018