Page History
...
OOP 개발의 첫걸부터 마지막까지 처음해야할것은 제일 처음 해야할것은 사물에대한 분석이고 이해이다.
다음과 같은 사고 방식으면 충분하다.
사물에대한 관찰이고 이해이며 공감할수 있어야하는것이다.
- 카드는 4가지 모양이 있다
- 카드는 고유 숫자와 그에 해당하는 Ace~King 각각의 고유 이름이 있다.
- 카드 셋팅은 카드의 숫자와 모양을 지정할수 있으며, King of Diamond라는 자연스러운 카드명을 사용할수 있다
- 한번 정해진 카드는 모양과 숫자를 바꿀수없다.
카드구현
이제 분석을 토대로 , 언어의 특성을 고려하여 OOP로 구현해보자
- 카드는 4가지 모양이 있다 → enum이라는 열거형을 사용
- 카드는 고유 숫자와 그에 해당하는 Ace~King 각각의 고유 이름이 있다. → 각 랭크를 배열에 맵핑
- 카드 셋팅은 카드의 숫자와 모양을 지정할수 있으며, King of Diamond라는 자연스러운 카드명을 사용할수 있다 → toString 재정의
- 한번 정해진 카드는 모양과 숫자를 바꿀수 없다 → 접근자(public/private) 의 올바른 사용
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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 실행
이 카드는 사용성이좋고,더많은 기능을 가질수 있는 객체로 개선될수 있으며,
이러한 활동은 새로운기능과 함께 기존가진 기능을 지속적 검증을 해야하는것을 포함한다.오브젝트를 구현하면, 항상 그에 대응하는 Test코드를 작성해라
그것이 OOP의 설계능력을 늘릴수 있는방법이다. 있는방법이며, JUnit은 그것을 도와준다.
다음은 우리주위에 존재하는 두가지 부류의 개발자이다.
- 유닛테스트를 작성해 본적이 없고 , OOP 설계능력을 자부하는 개발자
- 서비스 코드를 작성해본적이 없고 , 유닛테스트를 떠드는 개발자
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
@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"); } } |
...