반응형
블랙잭 pt. 3
'Generic'을 사용해서 Deck 클래스와 BlackjackHand 클래스를 고쳐봅시다.
Deck 클래스
BlackjackCard를 Deck 또는 BlackjackHand에 넣고 꺼내 쓸 때는 캐스팅이 필요합니다. 왜냐하면 Deck 클래스의 cards 리스트가 Card의 인스턴스를 담기 때문이죠.
Generic 클래스로 바꾸기
유연성과 확장성을 위해 Deck을 generic 클래스로 바꿔주겠습니다. cards 리스트가 Card를 상속받는 클래스의 인스턴스를 담을 수 있도록 바꿔주세요.
강의에서 본 것처럼 'generic' 개념을 이용하면 캐스팅 없이 카드를 꺼낼 수 있겠죠?
BlackjackHand 클래스
Deck가 Generic 클래스로 변경되었기 때문에 자식 클래스인 BlackjackHand에서도 반영해주어야 합니다.
불편한 캐스팅도 없애주세요!
package Ex0208;
public class BlackjackHand extends Deck<BlackjackCard> {
public int getValue() {
int value = 0;
int aceCount = 0;
for (BlackjackCard card : getCards()) {
if (card.isAce()) {
aceCount++;
}
value += card.getValue();
}
while (aceCount > 0 && value > 21) {
value -= 10;
aceCount--;
}
return value;
}
public boolean isBusted() {
return getValue() > 21;
}
public boolean isBlackjack() {
return getValue() == 21 && getCards().size() == 2;
}
}
package Ex0208;
import java.util.ArrayList;
import java.util.Random;
public class Deck<T extends Card> {
private ArrayList<T> cards;
public Deck() {
cards = new ArrayList<T>();
}
public void addCard(T card) {
cards.add(card);
}
public ArrayList<T> getCards() {
return cards;
}
public void print() {
for (T card : cards) {
System.out.println(card.toString());
}
}
public void shuffle() {
Random random = new Random();
for (int i = 0; i < cards.size(); i++) {
int randIndex = random.nextInt(cards.size());
T temp = cards.get(i);
cards.set(i, cards.get(randIndex));
cards.set(randIndex, temp);
}
}
public Deck deal(int count) {
Deck hand = new Deck();
for (int i = 0; i < count; i++) {
hand.addCard(cards.remove(0));
}
return hand;
}
}
본 내용은 Codeit의 '자바 기초' 강의를
참고하여 작성한 내용입니다.
반응형
'Languages > Java' 카테고리의 다른 글
[자바 중급 개념] 03. 인터페이스와 추상 클래스 (0) | 2021.03.09 |
---|---|
[자바 중급 개념] 03. 인터페이스와 추상 클래스 (0) | 2021.03.09 |
[자바 중급 개념] 02. 캐스팅과 제네릭 (0) | 2021.03.08 |
[자바 중급 개념] 01. 상속 (0) | 2021.03.05 |
[자바 중급 개념] 01. 상속 (0) | 2021.03.05 |