우아한테크코스

우아한테크코스 - 프리코스 2주차 회고

aoaa 2022. 11. 9. 19:34

 프리코스 2주차의 미션은 숫자야구게임 입니다. 작성한 코드

 

GitHub - Voyager003/java-baseball: 숫자 야구 게임 미션을 진행하는 저장소

숫자 야구 게임 미션을 진행하는 저장소. Contribute to Voyager003/java-baseball development by creating an account on GitHub.

github.com

 


1. 프로그램 설계

 코드 작성 전에 구현 기능목록을 작성하고, commit의 단위를 이 기능 목록에 맞춰서 추가하라는 것을 요구 사항에서 확인할 수 있습니다. 코드를 작성하면서 느낀 것이지만 첫 설계의 중요성을 알 수 있었습니다. 처음부터 완벽하게 목록을 작성하는 것은 힘들겠지만, 그게 가능하다면 구현에만 집중할 수 있어 시간을 아낄 수 있다는 것을 몸소 체험했습니다. 다음 프리코스부터는 간단한 설계도를 만들어 프로그램의 흐름을 정리하고 프로그램의 플로우, 체크리스트로 세분화하여 정리한다면 더 수월하게 구현 가능할 것이라고 생각했습니다. 

 코드는 크게 사용자 입력, 난수 생성, 재시작 검증, 예외처리 로직을 처리하도록 만들고, BaseballGame 클래스에서 사용자 입력과 난수를 받아 볼, 스트라이크, 낫싱을 판별하도록 설계했습니다. 


2. 주요 로직

2.1 숫자 입력과 예외 처리

 구현 목록대로 순서대로 작업을 진행하여서 입력을 받는 로직부터 구현했습니다. 미션에서 제공하는 라이브러리를 사용해서 입력을 받도록 했습니다.

 Console.readLine()으로 입력받은 값은 String형이어서 이를 int형으로 변환하여 NumList에 먼저 넣어주었습니다. 이후 int를 담은 List가 요구사항을 충족하지않으면 IllegalArgumentException을 날리도록 했습니다.

 예외는 세 가지로 1) 입력에 같은 숫자, 2) 세자리수 입력, 3) 입력에 0이 포함되어있는지를 검증하게하고 boolean을 통해 하나라도 false가 나온다면 checkException에서 false를 반환하게하여 예외로 종료시키도록 설계했습니다. 

 

2.2 난수 생성

 난수 생성같은 경우에도 주어진 라이브러리를 사용해서 난수를 구하도록 하는 것이었습니다. 먼저 중복된 값을 허용하지 않도록 HashSet을 선언한 뒤, Randoms.pickNumberInRange() 라이브러리 메서드를 이용해 1부터 9까지 중복없는 난수를 생성하고 randomNum을 생성하도록 만들었습니다. 

 

2.3 본 게임 구현

 본 게임은 입력된 수를 담은 List와 난수를 담은 List를 비교하고, 점수 여부를 판별하도록 만들었습니다. 

 Application 클래스에서 BaseballGame.play()를 실행하도록 하여 게임을 실행하도록 설계했습니다. 먼저 처음 생성한 난수와 이어지는 입력값을 비교하는 것이기 때문에 난수 생성은 한 번만 하도록 하고 do while문을 이용해 사용자의 입력값과 strike, ball 카운트는 초기화 시키기로 했습니다. do문에서 점수를 측정하고, 메시지 힌트를 얻을 수 있도록하고 스트라이크가 3이 나올 때까지 진행하도록 while문에 선언했습니다.

 

 점수를 판별하는 cntScore()는 strike와 ball을 따로 구현하고 strike와 ball값을 반환하도록 했습니다. 입력값과 난수를 int형 list를 만든 이유가 바로 인덱스끼리 비교하기 위함이었습니다. 

 

2.4 재시작 검증

 요구 사항은 strike가 3이되면 게임을 종료시키고, 재시작이면 1을 종료하면 2를 입력하도록 요구했습니다. 먼저 "1"과 "2" 이외의 다른 입력을 하게되면 예외를 날리게되고 종료하도록하고, 1이 입력된다면 

main 메서드의 while문을 통해 게임을 재시작하도록하도록 설계했습니다.

 


3. 느낀 점 

 2주차 미션을 통해 우테코에서 추구하는 학습 목표를 느낄 수 있었습니다. 먼저 하나의 메서드가 하나의 역할을 하도록 분리하여 객체 지향적 프로그래밍을 구현하도록 설계된 미션이라고 생각했습니다. 각 클래스와 메서드에 과중한 책임을 부여하지 않도록하여, 수정해야할 코드가 있더라도 그 부분만 고쳐 수정하여 코드 전체를 건드릴 필요가 없도록 초점을 두었습니다. 난수를 생성하는 기능, 입력을 받는 기능, 예외 처리를 하는 기능, 난수와 입력을 비교하여 점수를 판정하는 기능을 최대한 나눠서 리팩토링하면서 소프트웨어 유지보수의 중요성을 알 수 있었습니다.

 위에서도 적었지만 설계의 중요성을 느낄 수 있었습니다. 기능 구현목록을 작성하고 그를 기반으로 코드를 짜나갔는데, 설계 과정에서 잘못된 부분이 있어 작업 도중 기능 목록을 수정하는 일이 있었습니다. 처음부터 완벽하게 설계는 할 수 없지만 요구사항에 맞춰 설계를 해놓는다면 그 설계에 맞춰 원활한 코드작성을 할 수 있다는 것을 느꼈습니다. 3주차부터는 숫자야구게임을 구현하면서 느낀 개선점을 통해 더 좋은 소프트웨어를 설계하도록 많은 시도를 해봐야겠습니다.