우아한테크코스 2기 2주차 블랙잭 미션입니다.
우아한 테크코스 3주차 및 최종 테스트는 우테코 운영진이 제공해주는 클래스를 사용하여 구현하도록 되어있습니다.
이를 빨리 이해하고, 잘 적용하는게 중요하다고 생각합니다.
최종 코딩 테스트를 준비하던중 블랙잭에서 좋은 enum의 사용 예제가 있어 기록을 해놓게 되었습니다.
블랙잭 카드 종류 (Type), 종류에 따른 블랙잭 점수 (Symbol)을 각각 enum으로 구현을 해놓고, 이를 이용하여 전체 카드(CardFactory)를 생성하고 있습니다.
package practice;
public enum Symbol {
ACE(1),
TWO(2),
THREE(3),
FOUR(4),
FIVE(5),
SIX(6),
SEVEN(7),
EIGHT(8),
NINE(9),
TEN(10),
JACK(10),
QUEEN(10),
KING(10);
private final Integer score;
Symbol(Integer score) {
this.score = score;
}
public Integer getScore() {
return score;
}
}
package practice;
public enum Type {
SPADE("스페이드"),
DIAMOND("다이아몬드"),
HEART("하트"),
CLUB("클로버");
private final String name;
Type(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
values() 메서드를 이용하여 enum에 존재하는 모든 열거형 상수들을 뽑아내면서 카드를 만들고 있습니다.
package practice;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CardFactory {
private static List<Card> cards = new ArrayList<>();
public static List<Card> create() {
for (Symbol symbol : Symbol.values()) {
for (Type type : Type.values()) {
cards.add(new Card(symbol, type));
}
}
return Collections.unmodifiableList(cards);
}
}
package practice;
public class Card {
private final Symbol symbol;
private final Type type;
public Card(Symbol symbol, Type type) {
this.symbol = symbol;
this.type = type;
}
@Override
public String toString() {
return symbol.getScore() + type.getName();
}
}
CardFactory에서 만든 cards는 unmodifiableList 이기 때문에 변경이 불가능합니다.
새로운 변수에 옮겨 담아 사용을 하는 모습을 볼 수 있습니다.
깊은 복사 얕은 복사의 개념을 같이 알아두면 좋을 것 같습니다.
package practice;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Card> tempCards = CardFactory.create();
List<Card> cards = new ArrayList<>();
for (Card card : tempCards) {
cards.add(card);
}
Collections.shuffle(cards);
Card card = cards.get(0);
System.out.println(card.toString());
}
}