[내일배움캠프] 숫자 야구 게임 구현 - Level.04 요구사항 반영

2024. 9. 22. 18:05내일배움캠프

 Level03 요구사항까지는 요구사항 반영시 수정보다 추가되는 부분이 많았지만, Level04 요구사항의 경우 수정할 부분이 더 많아 이렇게 정리하게 되었다. 최종적으로 수정된 코드는 여기서 확인할 수 있다.

 

0. 요구사항 간단 정리

 시작 메뉴에 정답의 자릿수를 선택할 수 있는 기능을 추가해야 한다. 사용자가 해당 메뉴를 선택해 자릿수를 입력하면 즉시 게임이 시작되어야 한다. 물론 다른 메뉴들은 요구사항 반영 후에도 반영전과 같이 동일하게 기능이 수행되어야 한다. 비교적 자세한 요구사항은 여기에 정리해 두었다.

 

 

1. 정답 생성

 기존에는 고정적으로 '3자리' 의 정답을 생성하였지만 이제는 사용자가 입력한 '자릿수' 에 해당하는 정답을 생성할 필요가 있다. 일단 기존의 'CorrectAnswerGeneratorImpl(정답 생성 역할)' 클래스는 아래와 같다.

수정 전 CorrectAnswerGeneratorImpl 클래스

 

'makeCorrectAnswer()' 메서드를 통해 정답을 생성하고 'getCorrectAnswer()' 메서드로 생성된 정답을 반환한다. 여기서 수정이 필요한 것은 'makeCorrectAnswer()' 메서드인데 보다시피 호출시 항상 '3자리' 의 정답을 생성한다. 이를 사용자의 입력에 따라 길이가 다른 정답을 생성하도록 하기 위해서는 파라미터로 입력 값을 전달받을 필요가 있다. 그리고 그 입력 값만큼 클래스 필드의 'numbers' 에서 요소를 가져오면 된다 생각해 아래와 같이 메서드를 수정했다.

수정된 makeCorrectAnswer(int) 메서드

 

파라미터로 자릿수(int digits)를 받아 'CorrectAnswerGeneratorImpl' 클래스 필드 'numbers' 의 요소를 'digits' 만큼 꺼내 정답을 생성하게 되었다. 그리고 물론 해당 클래스가 구현한 'CorrectAnswerGenerator' 인터페이스의 추상 메서드 또한 수정하였다.

 

 

2. 입력 값 길이 허용

 여기서 말하는 '입력 값' 은 정답을 맞추기 위해 사용자가 입력하는 값을 말한다. Level04 요구사항 반영전에는 무조건 '3자리' 의 정답을 생성했기 때문에 '입력 값' 검증시에도 항상 사용자가 '3자리' 값을 입력했는지 검증했다.

 

하지만 이제 정답의 자릿수(길이)가 '자릿수 설정' 메뉴에 따라 변동될 수 있게 되었다. 그래서 사용자가 정답을 맞추기 위해 입력하는 값 또한 생성된 정답의 길이에 맞춰 변동될 수 있어야 한다. 즉, '입력 값' 검증시 현재 생성된 정답의 길이와 같은 길이의 '입력 값' 인지를 확인해야 한다.

 

'입력 값' 의 검증은 'ValidCriteria' 클래스(enum) 의 상수에 필드로 저장한 '정규식(Regular Expression)' 을 활용하였는데 '자릿수 설정' 메뉴에 따라 적절한 정규식을 사용하도록 아래와 같이 수정하였다. 그리고 난이도 설정 입력에 대한 유효성을 검증하는 메서드 또한 추가하였다.

수정된 InputValidatorImpl 클래스의 isValidInput(String, int), checkInputPattern(String, ValidCriteria) 메서드
InputValidatorImpl 클래스에 추가된 isValidDifficultyLevel(String) 메서드

 

물론 추가된 'isValidDifficultyLevel(String)' 메서드는 구현한 인터페이스에 추상 메서드를 추가하였고, 각 검증에서 사용되는 시스템 메시지 및 예외 메시지를 필드로 갖는 상수 또한 해당하는 enum 클래스에 추가 또는 수정하였다.

 

마지막으로 'NumberBaseballApp' 클래스의 'start(Scanner)' 메서드의 수행부를 수정해 요구사항대로 '자리수 설정' 메뉴가 추가된 시작 메뉴를 노출하고 '자리수 설정' 시 사용자로 부터 자리수를 입력 받고 유효성을 검증해 해당 자리수를 갖는 정답을 맞출 수 있도록 아래와 같이 수행 로직을 수정했다.

수정된 NumberBaseBall.start(Scanner) 메서드

 

 

3. 마무리

 이로써 해당 과제의 모든 요구사항 반영을 마쳤다. 하지만 반영되는 요구사항이 많아질 수록 로직이 복잡해져 이를 수정할 필요성을 느꼈기 때문에 과제 제출전 복잡해진 로직을 메서드로 분리하고 주석을 수정/추가하는 리팩토링을 진행할 것이다.