트러블슈팅: BaseballGameMain 및 BaseballGameLogic 애플리케이션의 문제 해결
개요
이 문서는 Java로 개발된 숫자 야구 게임 애플리케이션에서 발생한 문제와 그 해결 과정을 다룹니다. BaseballGameMain
은 게임의 흐름을 관리하고, BaseballGameLogic
은 게임 로직을 처리하여 숫자 비교 및 피드백을 제공하는 역할을 합니다. 추가적으로 BaseballGameScoreManager
와 BaseballGameRandomNum
클래스로 각각 점수 관리와 난수 생성 기능을 분리하여 명확한 역할을 부여했습니다.
개발 과정에서 여러 입력 오류 및 게임 로직의 비정상적인 동작을 해결하여 애플리케이션의 안정성과 기능을 크게 개선할 수 있었습니다.
트러블슈팅 과정
배경
숫자 야구 게임은 사용자가 3자리 숫자를 입력하면 컴퓨터가 생성한 무작위 숫자와 비교하여 스트라이크와 볼의 개수를 알려주는 방식으로 진행됩니다. 사용자가 정답을 맞출 때까지 점수를 기록하고, 게임 종료 후 점수를 출력하는 기능이 포함되어 있습니다. 개발 과정에서 입력 오류와 비정상적인 동작이 발생하여 문제를 분석하고 해결 방안을 도입했습니다.
발단 및 문제 분석
1. BaseballGameMain
에서의 입력 검증 문제
- 오류 발생 상황: 사용자가 3자리 숫자를 입력하지 않거나 중복된 숫자를 입력했을 때, 애플리케이션이 비정상적으로 종료되거나 오류 메시지가 출력되지 않는 문제가 발생했습니다.
- 원인 분석: 입력값에 대한 검증이 미흡하여 잘못된 형식의 입력이
BaseballGameLogic
으로 전달되었고, 예외 처리가 미비해 게임이 중단되었습니다. - 해결 방법: 입력값 검증을 강화하여 중복된 숫자나 잘못된 형식의 입력이 들어올 경우 명확한 오류 메시지를 출력하도록 수정했습니다.
if (userInput.length() != 3 || hasDuplicateNumbers(userInput)) {
appendResult("유효하지 않은 입력입니다. 3자리의 중복되지 않은 숫자를 입력하세요.");
} else {
// 게임 로직 실행
}
- 중복 숫자 방지:
hasDuplicateNumbers(userInput)
는userInput.indexOf(String.valueOf(number)) == -1
와 같은 방식으로 중복된 숫자가 없는지 확인하여 입력값의 유효성을 보장합니다.
2. BaseballGameLogic
의 로직 처리 문제
- 오류 발생 상황: 사용자가 입력한 숫자와 컴퓨터의 숫자를 비교할 때, 스트라이크와 볼의 개수가 올바르게 계산되지 않는 오류가 발생했습니다.
- 원인 분석: 숫자 비교 로직에서 스트라이크와 볼을 구분하는 조건이 명확하지 않아 동일한 숫자를 다른 자리에서 볼로 처리하는 논리적 오류가 있었습니다.
- 해결 방법: 정확한 스트라이크와 볼 계산을 위해, 숫자의 위치와 값을 동시에 고려하는 로직을 개선했습니다.
int strikes = 0;
int balls = 0;
for (int i = 0; i < 3; i++) {
if (userInput[i] == computerNumber[i]) {
strikes++;
} else if (Arrays.stream(computerNumber).anyMatch(num -> num == userInput[i])) {
balls++;
}
}
3. 잘못된 입력 시 게임 중단 문제
- 오류 발생 상황: 사용자가 숫자가 아닌 문자열을 입력했을 때, 게임이 중단되거나 무한 루프에 빠지는 현상이 발생했습니다.
- 원인 분석: 숫자가 아닌 값이 입력되었을 때 예외 처리가 없어 발생한 문제로, 예상치 못한 입력이 게임 진행을 중단시켰습니다.
- 해결 방법: 숫자가 아닌 값이 입력되면 예외 처리를 통해 오류 메시지를 출력하고 게임이 정상적으로 진행되도록 수정했습니다.
try {
int[] userNumbers = userInput.toString().chars().map(Character::getNumericValue).toArray();
// 게임 로직 실행
} catch (NumberFormatException e) {
appendResult("잘못된 입력입니다. 숫자를 입력하세요.");
}
추가 문제 및 해결
1. 메모리 관리 문제
- 오류 발생 상황: 게임이 여러 번 진행된 후, 이전 결과들이 계속해서 메모리에 쌓여 메모리 누수 가능성이 제기되었습니다.
- 원인 분석: 점수 기록 리스트가 초기화되지 않아 발생한 문제로, 게임이 재시작될 때마다 결과가 쌓이면서 메모리를 차지했습니다.
- 해결 방법: 게임이 재시작될 때마다 점수 기록을 초기화하고, 필요에 따라 오래된 데이터를 삭제하는 로직을 추가했습니다.
scoreList.clear();
2. 점수 관리 및 출력 기능 개선
- 오류 발생 상황: 점수 리스트가 정리되지 않거나, 게임 종료 후 점수 출력이 제대로 이루어지지 않는 문제가 있었습니다.
- 원인 분석: 점수 리스트가 관리되지 않거나, 잘못된 방식으로 출력되는 문제가 있었습니다.
- 해결 방법:
BaseballGameScoreManager
클래스를 도입하여 점수 기록을 관리하고, 게임 종료 시 점수를 깔끔하게 출력할 수 있도록 로직을 개선했습니다.
ScoreManager scoreManager = new ScoreManager();
scoreManager.addScore(attemptCount);
scoreManager.displayScores();
개선 사항
1. 입력 검증 및 예외 처리 강화
입력값 검증을 강화하여 잘못된 입력으로 인한 게임 중단을 방지했습니다. 이로써 사용자가 잘못된 데이터를 입력했을 때도 명확한 피드백을 받을 수 있게 되었습니다.
2. 코드 구조 개선
코드를 더 모듈화하여 유지보수성을 높였습니다. BaseballGameScoreManager
, BaseballGameRandomNum
등의 클래스를 도입하여 각 기능을 분리하고, 게임 로직을 더욱 간결하게 만들었습니다.
3. GUI 레이아웃 개선
UI 레이아웃을 사용자의 편의에 맞게 재배치하여 가독성과 사용성을 개선했습니다.
결론
이번 트러블슈팅 과정을 통해 발생한 여러 문제를 해결하면서, 숫자 야구 게임 애플리케이션의 안정성과 성능을 크게 향상시킬 수 있었습니다. 객체지향적인 코드 구조로 개선함으로써 유지보수성과 확장성을 높였으며, 사용자 경험을 더욱 향상시킬 수 있었습니다.
'TIL > 스파르타 자바공부기간' 카테고리의 다른 글
[내일배움캠프] Spring 1차 숙제 (0) | 2024.09.30 |
---|---|
[내일배움캠프] 두번째 과제, ERD 다이어그램: BaseballGameCLI (0) | 2024.09.23 |
[내일배움캠프] 두번째 과제, ERD 다이어그램: BaseballGameGUI (0) | 2024.09.21 |
[내일배움캠프] 첫번째 과제, 트러블슈팅: Calculator GUI (0) | 2024.09.07 |
[내일배움캠프] 첫번째 과제, 트러블슈팅: Calculator Console (0) | 2024.09.06 |