Poker게임에 사용되는 카드 덱을 OOP로 구현해보자 |
포커1덱은 모양(4) * 랭크(13) = 52 장의 카드로 구성되어져 있다.


카드를 썩은후 맨위부터 한장씩 꺼낸다고 해보자

이것은 자료구조중 Stack과 닮아 있다. 한장씩 사용할때마다 POP-POP 하면된다.
물론 모습이 닯은것이고, 큐를 사용하던 리스트를 사용하던 꺼집어 내는것만 있기때문에
FIFO(First in First Out) , LIFO( Last in First Out ) 작동방식과는 아무런 상관이 없다.
이게 무슨말인고하니..
접시쌓기를 생각하면된다. 설겆이가 끝난 여러개의 접시를 차례로 쌓았서 정리했다고 해보자
처리가 먼저 끝난 접시는, 제일 밑에 쌓여있기때문에 뽑기가 어렵다. ( 물론 전체 접시를 든후 빼내면된다 )
마지막에 처리된 접시를 가장 먼저 사용이 가능하며 이것을 스택이라고 하고 LIFO 작동방식이라고 보면된다.
카드도 맨아래에 카드를 빼는것보다 일반적으로 맨위에 카드를 사용하는것이 일반적이기 때문에
모습만 닯았다고 표현을하였다.
![]()
내가 빙다리 핫바지로 보이냐? : 타짜중 밑장빼기를 저지하는 아귀 - 스택의 규칙을 어기면 큰일난다~
Stack을 이용하는데 밑장을 빼면 성능상 느려지기도 하지만 ( 자료구조상 성능이 늦어진다.)
룰에도 어긋난다. 그래서 자료구조를 이해하는것은 성능과도 연관이 있다.
그럼 이것을 자바코드로 실제 구현을 해보자
package game.poker;
import java.util.Collections;
import java.util.Random;
import java.util.Stack;
import game.poker.Card.Suit;
public class Deck
{
private Stack<Card> cards;
private Random rand;
public Deck()
{
rand = new Random();
init();
}
public Deck(Random givenGenerator)
{
rand = givenGenerator;
init();
}
public Card pop()
{
return cards.pop();
}
/**
* Initializes a new deck of 52 cards.
*/
private void init()
{
cards = new Stack<>();
int index = 0;
for (int rank = 1; rank <= 13; ++rank)
{
cards.push(new Card(rank, Suit.CLUBS));
cards.push(new Card(rank, Suit.DIAMONDS));
cards.push(new Card(rank, Suit.HEARTS));
cards.push(new Card(rank, Suit.SPADES));
}
// Todo : Improve Shuffle Rule...
Collections.shuffle(cards);
}
} |
init : 덱을 초기화후 자동으로 썩어준다. /
@Test
public void deckTest(){
Deck deck = new Deck();
System.out.println(deck.pop());
System.out.println(deck.pop());
System.out.println(deck.pop());
} |
Nine of HEARTS |
위 테스트 코드는 무작위의 카드중 맨윗부터 3장을 꺼내기때문에
덱에 포함된 무작위 카드 3장을 뽑는것과 동일하다