Languages/Java

[자바 중급 개념] 02. 캐스팅과 제네릭

Dev다D 2021. 3. 9. 15:38
반응형

블랙잭 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의  '자바 기초' 강의를
참고하여 작성한 내용입니다.

 

반응형