class SutdaDeck {
final int CARD_NUM = 20;
SutdaCard[] cards = new SutdaCard[CARD_NUM];
// (1) 배열 SutdaCard를 적절히 초기화하시오.
SutdaDeck() {
for (int i=0; i<cards.length; i++) {
int num = i%10+1;
boolean isKwang = (i < 10) && (num==1 || num==3 || num==8);
cards[i] = new SutdaCard(num,isKwang);
}
// 답안 풀이 보기 전의 내 풀이
// for (int i=1; i<=10; i++) {
// boolean isKwang = i==1 || i==3 || i==8;
// cards[i-1] = new SutdaCard(i,isKwang);
// }
// for (int i=11; i<=20; i++) {
// cards[i-1] = new SutdaCard(i-10, false);
// }
}
// (2) 연습문제7-1의 SutdaDeck 클래스에 다음에 정의된 새로운 메서드를 추가하고 테스트하시오.
// 1. shuffle() 배열cards에 담긴 카드의 위치를 뒤섞는다. Math.random() 사용
// 2. pick(index) 배열 cards에서 지정된 위치의 SutdaCard를 반환
// 3. pick() 배열 cards에서 임의의 위치의 SutdaCard를 반환 Math.random() 사용
void shuffle() {
// 카드의 인덱스 값은 0~19의 랜덤한 값이다. 임의의 위치의 카드와 서로 맞바꾸는 작업을 for문으로 돌린다.
for (int i=0; i<cards.length; i++) {
int index = (int)((Math.random())*cards.length);
// cards[i]에 담겨있던 카드객체를 shuffleCard 변수에 담아두고, cards[i]에 cards[index]의 카드객체를 담는다.
// 그리고 cards[index]에 shuffleCard에 담아둔 기존의 cards[i]의 카드객체를 담는다.
SutdaCard shuffleCard = cards[i];
cards[i] = cards[index];
cards[index] = shuffleCard;
}
}
SutdaCard pick(int index) {
if (index < 0 || index >= cards.length) {
return null;
}
return cards[index];
}
SutdaCard pick() {
int index = (int)((Math.random())*cards.length);
return cards[index];
}
}
class SutdaCard {
int num;
boolean isKwang;
public SutdaCard() {
this(1,true);
}
public SutdaCard(int num, boolean isKwang) {
this.num = num;
this.isKwang = isKwang;
}
@Override
public String toString() {
return num + (isKwang ? "K" : "");
}
}
class Exercise7 {
public static void main(String[] args) {
SutdaDeck deck = new SutdaDeck();
SutdaCard[] cards = deck.cards;
for (SutdaCard card : cards) {
System.out.print(card + ",");
}
// 출력 내용 : 1K,2,3K,4,5,6,7,8K,9,10,1,2,3,4,5,6,7,8,9,10,
System.out.println();
System.out.println(deck.pick(0));
// 출력 내용: 1K
System.out.println(deck.pick());
// 출력 내용: 임의의 순서에 위치한 카드의 숫자
deck.shuffle();
for (SutdaCard card : deck.cards) {
System.out.print(card + ",");
}
// 출력 내용: 위치가 뒤섞인 cards에 담긴 카드 20장의 숫자들
System.out.println();
System.out.println(deck.pick(0));
// 출력 내용: 위치가 뒤섞인 cards의 0번째 카드 숫자
System.out.println(deck.pick());
// 출력 내용: 위치가 뒤섞인 cards의 임의의 순서에 위치한 카드의 숫자
}
}
shuffle() 메소드 구현하기
void shuffle() {
for (int i=0; i<cards.length; i++) {
int index = (int)((Math.random())*cards.length);
SutdaCard shuffleCard = cards[i];
cards[i] = cards[index];
cards[index] = shuffleCard;
}
}
배열과 변수에 객체를 담는 원리가 갑자기 헷갈렸다.
다시 살펴보자면 임의로 카드를 뒤섞기 위하여, 각 카드를 임의의 순서에 있는 카드와 서로 뒤바꾸는 것을 반복하는 것인데
더 정확하게 표현하자면 아래 와 같다.
SutdaCard shuffleCard = cards[i];
cards[i] = cards[index];
cards[index] = shuffleCard;
한 마디로 말하면 두 변수의 값을 바꾸는 것.