IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
한국 developerWorks   >  Special Issue  > developerworks

초보 개발자 코드 트레이닝, Part 4. TDD 수련



김승권김승권 teacher.seal@gmail.com

아이티와이즈컨설팅에서 주로 금융권 차세대시스템을 기획하는 컨설턴트로 근무하고 있으며, 오픈 소스 소프트웨어를 기업에서 활용하는 것에 대해 꾸준히 관심을 기울이고 있다. 비즈니스 기획부터 구현에 이르는 전 과정에서 기술 아키텍트란 이름으로 부끄러움 없이 참여할 수 있도록 수련중이다.




2008년 6월 24일


퀴즈. 야구 게임을 TDD로 완성해 보자

이번에 함께 풀어 볼 퀴즈는 매우 단순합니다. 어린 시절 친구들과 함께 하던 야구 게임을 TDD(test-driven development)로 완성해 보는 겁니다.


야구 게임 규칙 다시 보기

야구 게임을 해 본 적이 없거나, 기억나지 않는 독자들을 위해 간단히 규칙을 정리해 보겠습니다.

  • 컴퓨터는 미리 3개의 1~9 사이의 숫자를 가지고 있다(예. 1 3 5).
  • 사용자는 컴퓨터가 가지고 있는 숫자를 정확히 맞춰야 한다.
  • 사용자는 미리 지정된 만큼의 횟수 동안 시도할 수 있다. 지정된 횟수까지 시도해도 맞추지 못하면 "out"이다.
  • 사용자는 매번 3개의 숫자를 넣고 컴퓨터는 미리 가지고 있는 3개의 숫자와 비교해 다음 응답을 해야 한다.


1) 3개의 숫자가 맞고 위치도 맞으면 "hit" 
2) 1)이 아닐 경우 입력한 숫자가 컴퓨터가 가지고 있는 숫자 중 하나이고 그 위치도 맞으면 strike가 1씩 올라간다. 
예를 들어 컴퓨터의 숫자가 1 3 5인데 사용자가 입력한 숫자가 2 3 4이면 "1 strike"이고 2 3 5를 입력했다면 "2 strikes"이다.
3) 숫자는 맞으나 위치가 다르면 ball이 1씩 올라간다. "1 ball", "2 balls", "3 balls"

예) 컴퓨터의 숫자 1 3 5
1 2 3 => "1 strike 1 ball"
5 1 3 => "0 strike 3 balls"
1 5 3 => "1 strike 2 balls"
6 7 8 => "0 strike 0 ball"
1 3 6 => "2 strikes 0 ball"
1 3 5 => "hit"



야구 게임의 요구 사항

야구 게임을 개발하기 위한 구체적인 요구 사항은 다음과 같습니다.

  • BaseballGame 클래스를 메인 클래스로 작성한다.
  • 완성된 코드는 여러 개의 클래스로 구성해도 상관없다.
  • 게임은 여러 번 진행할 수 있다.
  • 게임을 시작하려면 컴퓨터가 가진 숫자와 최대 시도 횟수가 등록되어 있어야 한다.
  • 게임이 시작되면 이번이 몇 번째 게임인지 정보를 돌려준다.
  • 두 번째 게임부터 컴퓨터의 숫자는 이전 게임에서 사용한 것과 똑 같은 것을 쓸 수 없다. 단 최대 시도 횟수는 같아도 상관없다.
  • 게임이 종료되는 것은 "hit" 또는 "out"이 되었을 때다.
  • 게임이 종료된 후 다시 게임을 시작하기 전에는 게임을 시도할 수 없다.
  • 게임 중에는 게임의 현재 상태를 요청할 수 있다. 게임 상태는 최대 시도 가능 횟수, 현재 시도한 횟수, 그리고 현재까지의 최고 기록 정보를 돌려준다. 최고 기록은 strike는 3점, ball은 1점으로 계산해 그 중 최고 점수를 가진 시도의 정보(몇 번째 시도와 시도한 숫자)를 돌려준다. 최고 기록이 같은 경우가 두 번 이상 있으면 모두 돌려준다.
  • 게임의 최고 기록을 요청하면 지금까지 진행된 게임 중 가장 적은 시도로 맞춘 결과(시도 횟수)를 보여준다. 게임의 최고 기록을 요청하는 것은 게임이 종료된 이후에만 가능하며 한 번도 게임을 시도하지 않았으면 결과를 요청할 수 없다.
  • 모든 단서조항(...한다, ...할 수 없다, ...일 경우는)에 위배되는 경우는 적절한 Exception을 던져야 한다.
  • 각 결과는 적절한 형태로(String 또는 임의의 Object) 리턴되면 된다(화면에 출력될 필요는 없다. 엔진이니까. UI는 이번 엔진을 이용해 나중에 따로 개발할 것이다).

솔직히 말씀 드리면, 이 퀴즈는 함께 일하던 Toby님의 아이디어로 팀 전체가 매주 진행하던 TDD 수련의 첫 번째 퀴즈였습니다. 그 뒤로도 계속해서 이런 수련을 매주 반복해 진행했죠. 경험상 이 퀴즈를 좀 더 재미있게 풀어나가기 위해 추천하는 방법은 다음과 같습니다.

1. 함께 할 짝을 찾아 짝 프로그래밍 형태로 풀어보세요.
2. 본인에게 가장 적합한 스텝(step)을 찾을 때까지, 눈에 보이는 가장 단순한 것부터 하나씩 해결해 나가세요.
3. 테스트 코드 없이는 단 한 줄의 코드도 추가되지 않도록 하세요.
4. 한 개의 테스트를 생각하고, 테스트가 실패하는 것을 확인하고, 코드를 추가하고, 테스트를 통과하는지 확인하고, 리팩토링을 통해 나쁜 냄새를 제거하는 한 번의 사이클이 완료될 때마다 커밋(commit)해 히스토리를 남기세요.
5. 문제를 다 풀고 나면, 히스토리를 검색해 가며 전체 과정을 짧게 리뷰해 보세요.
6. 리뷰가 끝나면 같은 문제를 한 번 더 풀어보고, 결과가 다를 경우 그 원인을 생각해보세요.

이번 퀴즈를 푼 결과를 자신의 블로그에 코드를 정리한 후, 제 블로그에 댓글이나 트랙백 (http://seal.tistory.com/trackback/153)을 남겨주시거나 이메일(dwkorea@kr.ibm.com)로 보내주세요.


코드 리뷰

이번 회에는 그 동안 진행되었던 코드 트레이닝에 대해 짧은 리뷰해 보겠습니다.

너무 많은 시간을 투자해야 하기 때문인지, 세 번째 코드 트레이닝은 참여한 독자가 안타깝게도 없었습니다. 그래서 두 번째 코드 트레이닝 참여자를 대상으로 코드를 소개해 드리겠습니다(공개된 코드는 블로그 트랙백을 통해 확인할 수 있습니다).

Zhoto님은 PHP를 이용해 퀴즈를 풀어 주셨는데요, PHP가 지원하는 풍부한 Array 지원 함수를 이용해 간단한 해결책을 선보이고, O(N^2)의 문제를 O(N) 문제로 바꾸는 풀이를 보여줬습니다. 어떤 문제를 풀고 나서, 선택한 문제 해결 방법이 최선의 답인지를 여러 각도에서 해석하고, 발전 방향을 모색하고자 하는 퀴즈의 의도에 가장 부합하는 설명을 담고 있습니다.

1회에 이어 2회 코드 트레이닝에도 참가해 주신 소내기님은 결과 테스트를 JUnit을 이용해 자동화한 점이 눈에 띄었습니다. Nakada 님은 파이썬(Python)으로 TDD를 시도했는데요, 테스트와 코드가 서로 점진적으로 발전해 나가는 모습을 보지 못해 아쉬웠습니다. Kenu님 덕분인지, 알고리즘과 성능에 대한 고민을 다루는 주제의 퀴즈가 테스트 쪽으로 관심을 돌린 해법이 많이 보였습니다. Nakada님과 Blueiur님은 두 분 모두 파이썬으로 퀴즈를 풀어 같은 문제에 대한 다른 스타일의 해결책을 비교해 가며 보는 즐거움도 있었습니다.

Cherrykyun님은 가장 성실히 모든 문제에 대한 답변을 달아주셨고, 코드 트레이닝을 닌텐도처럼 두뇌 회전용으로 활용하신 Rubiaru님도 있었습니다.

예고대로 참가자 중 한 분에게 선물을 드립니다. 선물을 받으실 주인공은 Blueiur님입니다. 다른 독자 분들도 한번 도전해 보시를 바랍니다.

가벼운 마음으로 즐기면서 참여하신 코드 트레이닝에서 참가자들이 내공을 모두 드러내지 않고 작성한 코드에 대해 코멘트를 다는 것이 다소 무례하다는 생각이 들어, 코드 각각에 대한 덧글은 생략했습니다. 비공개로 메일을 보내주신 분들을 포함해서, 참여해 주신 모든 개발자들에게 감사 드립니다.




위로


이 문서 북마킹 하기

mar.gar.in mar.gar.in naver naver eolin eolin del.icio.us del.icio.us


[지난 Special Issue 보기]

사이트 여행

dW 커뮤니티
포럼 | 블로그 | Spaces
dW Student Community

로컬 컨텐츠

행사 및 세미나

기획 기사

개발자 입문

튜토리얼 및 교육

TOP 10 인기자료

SW 다운로드

RSS 피드

뉴스레터
 
  
자바스크립트가 작동이 중지되었습니다. 이 기능을 수행하시려면 브라우저에서 자바스크립스트를 작동시켜 주시거나 이곳을 클릭해주세요.

Special offers
Screencast
IBM SOA Sandbox 시험판
dW Student Community
로보코드
코드 트레이닝


    IBM 소개 개인정보 보호정책 문의