You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

OOP는 실 사물을 프로그래밍의 오브젝트로 반영해서 조금더 리얼 세상과 비슷한 방식으로 프로그래밍을 하게해준다.


카드분석

OOP 개발의 첫걸음부터 마지막까지 먼저 해야할것은 사물에대한 관찰이고 이해이며 공감할수 있어야하는것이다.

경험을 통해 훈련해야하는것이다.

그럼 카드에대해 아는만큼 분석해보자

  • 카드는 4가지 모양이 있다 
  • 카드는 고유 숫자와 그에 해당하는 Ace~King 각각의 고유 이름이 있다.
  • 카드 셋팅은 카드의 숫자와 모양을 있으며,  King of Diamond라는 자연스러운 카드명을 사용할수 있다
  • 한번 정해진 카드는 모양과 숫자를 바꿀수없다.

카드구현

이제 분석을 토대로 , 언어의 특성을 고려하여 OOP로 구현해보자

  • 카드는 4가지 모양이 있다 → enum이라는 열거형을 사용
  • 카드는 고유 숫자와 그에 해당하는 Ace~King 각각의 고유 이름이 있다.  → 각 랭크를 배열에 맵핑
  • 카드 셋팅은 카드의 숫자와 모양을 지정할수 있으며,  King of Diamond라는 자연스러운 카드명을 사용할수 있다 →  toString 재정의
  • 한번 정해진 카드는 모양과 숫자를 바꿀수 없다 → 접근자(public/private) 의 올바른 사용 
Card 작성
package game.poker;

public class Card
{

    public enum Suit
    {
        CLUBS, DIAMONDS, HEARTS, SPADES
    };

    private final Suit suit;

    private final int rank;

    private final String[] NAMES = {"Dummy", // element 0 not used
            "Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine",
            "Ten", "Jack", "Queen", "King"};

    public Card(int givenRank, Suit givenSuit)
    {
        rank = givenRank;
        suit = givenSuit;
    }

    public int getRank()
    {
        return rank;
    }

    public Suit getSuit()
    {
        return suit;
    }

    public String toString()
    {
        return NAMES[rank] + " of " + suit;
    }

    public static String toString(Card[] arr)
    {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < arr.length; ++i)
        {
            if (i > 0)
            {
                // every element after first one has comma before it
                sb.append(", ");
            }
            sb.append(arr[i]);
        }
        sb.append("]");
        return sb.toString();
    }
}


카드 Test 실행

이 카드는 사용성이좋고,더많은 기능을 가질수 있는 객체로 개선될수 있으며,

이러한 활동은 새로운기능과 함께 기존가진 기능을 지속적 검증을 해야하는것을 포함한다.

그것이 OOP의 설계능력을 늘릴수 있는방법이며, JUnit은 그것을 도와준다. 


다음은 우리주위에 존재하는 두가지 부류의 개발자이다.

  • 유닛테스트를 작성해 본적이 없고 , OOP 설계능력을 자부하는 개발자
  • 서비스 코드를 작성해본적이 없고 , 유닛테스트를 떠드는 개발자


Card테스트
@Test
public void cardTest(){
    for(int i=1;i<14;i++){
        Card card1 = new Card(i, Card.Suit.DIAMONDS);
        System.out.println(card1);
        //check
        if(i==13) assertThat(card1.toString()).as("cardTest").isEqualTo("King of DIAMONDS");
    }
}





  • No labels