[8] Java/Kotlin - Java 2차 개인과제 트러블 슈팅

2024. 9. 24. 12:46Java,Kotlin

728x90

 ※ 숫자 야구 게임 만들기

- Lv.1 정답 숫자 생성하고 게임진행

- Lv.2 입출력 개선 - 유효성 검사 

- Lv.3  게임 기록 통계 만들기

- Lv.4 난이도 조절 기능

 

 

1)  레벨1 스트라이크, 볼 아웃 로직

 

1-1) 개요

ㄴ 스트라이크, 볼, 아웃 로직에 대한 고민

 

1-2) 배경

ㄴ ArrayList를 활용해서 각 자리수 숫자를 추출하고 ArrayList에서 제공되는 메서드들을 사용할 생각.

 

1-3) 진행

ㄴ 막연하게 ArrayList로 활용하면 되겠다를 생각하고 구체적인 부분은 직접 코드를 하나씩 짜가면서 생각해나갔다.

 

1-4) 위기

ㄴ 큰 틀로 생각은 해뒀으나, 구체적으로 각각에 대해서 어떻게 진행할지에 대해선 생각을 못해둔 상태라 조금 버벅임이 있었다.

 

1-5) 결말

ㄴ 먼저 각 자리수를 구하고, 구한 자리수를 비교하는 형태로 스트라이크, 볼, 아웃 로직을 구성해 나갔다.

ㄴ get(), indexOf()등을 활용해서 생각한 부분을 잘 구현했지만, 코드가 많이 길어지고 조건문이 많이 생기게 되었다.

 

 

2) 정답, 입력값 각 자리수 추출 메서드

 

2-1) 개요

ㄴ 정답값과 입력값에 대한 각 자리수를 추출하는 과정에서 발생

 

2-2) 배경

ㄴ 스트라이크, 볼, 아웃로직에서 각 자리수마다 조건을 체크하는데 그 자리수를 추출시 while문을 사용하는데 정답과 입력값의 자리수가 3,6이런식으로 계속 올라갔다.

 

2-3) 진행

ㄴ ArrayList get메서드를 활용해서 정답 입력값의 값을 추출하는데 자리수가 3인데 6이렇게 올라가다보니 문제가 생겼다.

 

2-4) 위기

ㄴ 자리수가 6으로 늘어남에따라 IndexOutofBoundsException에러가 계속 발생했다.

ㄴ 배열 출력해놓은 부분을 보면 알 수 있듯이 정상적으로 배열이 출력되고 있어서 도대체 뭐가 문제인지 계속 못찾고 있었다.

 

2-5) 결말

ㄴ 배열이 정상적으로 출력되는것이 문제가 아니라면 자리수 자체가 문제라고 생각을 했다.

ㄴ 확인해보니 증감되고있었다.

 

 

ㄴ 정답과 입력값 자리수 추출하는 while문을 메서드로 분리하지않고 다이렉트로 진행할때는 자릿수 변수의 초기화를 정상적으로 하고있었는데 메서드로 분리했을때 변수초기화 실수를 했었다 해당부분이 문제였다.

ㄴ 해당 변수들이 메서드 안에서 while문 실행되기 바로 직전에 초기화 시키고 while문 실행하는 형태가 되었어야했는데 메서드 밖에 있어서 쓸모 없는 상황이었다.

 

ㄴ 졸지에 변수초기화가 아닌 필드선언이 되어있었고, 메서드 안에서 변수 초기화를 진행하여 정상적으로 에러없이 실행되었다.

 

3) 입력값 예외처리시 try,catch반복 문제

 

3-1) 개요

ㄴ 입력값에 문자 입력시에 예외처리하는 부분에서 발생

 

3-2) 배경

ㄴ 입력값에 문자 입력시 숫자입력하도록 예외처리는 잘 되었으나, 로직이 다시 위로 올라가서 [숫자만 입력해주세요] 문구가 나오도록 해야하는데 못하고 있음.

 

3-3) 진행

ㄴ 임의로 바로 게임을 종료해버리고 있는데 문자 입력했을때 게임이 종료되버리면 너무 불편해서 다시 방법을 찾아봤다.

 

3-4) 위기

ㄴ while문 안에서 try-catch가 진행되다보니 break와 continue를 사용하면 반복문이 탈출되고, 잘못된입력으로 무한로딩이 걸리고 있었다.

 

3-5) 결말

 

ㄴ 검색해보니 나와 같은 문제를 겪었던 사람들이 좀 있었다. 그 중에 해결방법이 있었는데 방법은 Scanner객체를 catch문안에서 직접 초기화 해주는 것이었다.

ㄴ 두번째 사진처럼 sc를 초기화 해주면서 해결이 되었다. 생각보다 간단한 문제였는데 새로 잘 알게되었다.

 

 

4) 클래스 및 메서드 분리

 

4-1) 개요

ㄴ 숫자야구 게임 전체 과제에 대한 클래스 및 메서드 분리 고민

 

4-2) 배경

ㄴ 레벨 1~4까지 모든 기능을 구현했지만, 뒤늦게 패키지부터 메서드까지 분리에 대한 고민에 빠졌다.

 

4-3) 진행

ㄴ 처음에 기능부터 구현해야한다는 생각으로 먼저 구현해두고 추후에 분리를 하자란 생각을 했는데 잘못된 생각이었다.

 

4-4) 위기

ㄴ 이미 구성된 기능들에 대해서 변경을 해야하다 보니, 더 머리가 아프고, 답이없다/지루하다 이런 생각이 계속 들었다. 

 

4-5) 결말

ㄴ 그래도 차근차근 생각해나간대로 조금씩 분리해서 잘 마무리는 되었다.

ㄴ 처음부터 기반설계를 잘 진행했더라면 이러한 문제가 없었을텐데란 생각을 가지게 되었다.

 

 

※ [ 회고 ] 

좋았던 점)

오랜만에 순수 흥미, 뿌듯함 등을 느낀 순간이었다.

전 회사에서 근무할때는 항상 바쁜 일정에 쫒겨서 개발에 대한 순수흥미를 느낄 시간도 없이 구현이 되면 다음꺼 넘어가고, 구현이 되면 다음꺼 넘어가고의 연속으로 이미 만든 기능과 로직에 대해서 추가적으로 생각할 시간도 없었는데 이번에 그런 경험이 되어서 좋았다. 정답숫자생성, 스트라이크&볼&아웃 로직을 힌트를 보지않고 혼자 생각한대로 구현을 해내어서 더 기분이 좋았다.

 

아쉬웠던 점)

하지만, 패키지,클래스,메서드등 설계와 분리해야할 상황을 생각하고 로직을 구성했어야 했는데 그 부분은 좀 간과하고 진행했던거 같다. 그 결과로 결국 기능 구현을 다해두고, 나중에 분리하는 시간이 오히려 더 많이 걸려서 해당 부분에서 지루함을 느끼게 되어버렸다.

 

나중에 프레임워크를 사용하게 되고, 좀 더 규모가 큰 프로젝트를 진행하게 되었을때 이러한 점은 좋지 않다고 생각했다.

로직을 생각해내고 구현해내는 것은 좋지만, "이 로직들이 분리할때 잘 활용될 수 있을까?"를 먼저 고민하고 진행해야 한다는 점을 느꼈다.

 

간단한 기능이라도 결국은 기반 설계가 잘 되어야 소요시간이 훨씬 더 줄어든다라는 점을 깨달은 시간이었다.

 

728x90