📎PR 링크
4주차_다리 건너기
📝문제 풀이
문제 링크
- Application
- main: BridgeController 객체 생성 후 메서드 호출
- BridgeController
- start: 시작 메시지 출력
- enterBridgeSize: inputView 통해서 다리 길이 입력받고 예외 발생 하면 다시 입력하도록 함
- makeBridge: BridgeMaker로 다리 생성
- playGame: enterMoving, makeMap, showMap 호출
만약 다리 건너기 실패("X")하면 reGame으로 넘어감
- enterMoving: 위칸 or 아래칸 입력받고 예회 발생 시 다시 입력
- makeMap: map 생성
- showMap: map 출력
- isMismatch: 사용자의 moving이 틀렸을 경우 true를 리턴
- reGame: enterGameCommand 호출하고 재시도 시 시도 횟수+1 한 후에 map 초기화 후 playGame 메서드 실행
종료 시 결과를 "실패"로 변경 후 return한다
- enterGameCommand: 재시도 or 종료를 입력받고 예외 발생 시 다시 입력
- showResult: outputView로 최종 결과 출력 메서드 호출
- BridgeGame
- move: 다리와 사용자 입력이 같은지 판단하여 check("O" or "X")를 리턴
- retry: 사용자 명령이 "R"인지 "Q"인지 판별하여 0 또는 1을 리턴
- BridgeMaker
- makeBridge: 생성자에서 BridgeNumberGenerator를 BridgeRandeomNumberGenerator로 받아서 0이면 "D", 1이면 "U"을 저장
- BridgeSize
- BridgeSize: 다리 길이 검증 후 선언
- getBridgeSize: 다리 길이 반환
- GameCommand
- validateInput: 사용자 명령 검증 후 선언
- getGameCommand: 명령 반환
- Moving
- validateInput: 이동 검증 후 선언
- getMoving: 이동 반환
- Map
- makeMap: moving과 check를 인자로 받아서 "U"일 경우 makeUpMap을 호출, "D"일 경우 makeDownMap 호출
- makeUpMap: 첫번째 이동이면 upMap에 바로 check를 추가, 그 다음이면 " | "을 추가하고 check 추가
- makeDownMap: 첫번째 이동이면 downMap에 바로 check를 추가, 그 다음이면 " | "을 추가하고 check 추가
- getUpMap: upMap을 반환
- getDownMap: downMap을 반환
- resetMap: map을 초기화
- ErrorMessage: 에러 메시지 출력 enum 클래스
- GameMessage: 안내 메시지 출력 enum 클래스
- GameCommandResult: "R"이면 1을, "Q"이면 "실패"를 반환하는 enum 클래스
- MovingRandomNumber: 1이면 "U"를, 0이면 "D"를 반환하는 enum 클래스
- Converter
- convertToNumber: 문자열을 숫자로 변환
- Validator
- validateNumber: 문자열을 받아 숫자인지 검증
- validateRange: 숫자의 범위 검증
- validateLength: 문자열의 길이 검증
- validateMoving: moving 입력 검증
- validateGameCommand: gameCommand 입력 검증
- InputView
- readBridgeSize: 다리 길이 입력
- readMoving: 이동 칸 입력
- readGameCommand: 재시도 여부 입력
- OutputView
- printMap: 다리 상태 출력
- pringResult: 최종 결과 출력
- printSuccessOrFail: 성공 여부 출력
- printAttempt: 시도 횟수 출력
📓배운 것
1. 인터페이스
예전에 C++을 배울 때 배웠던 것 같은데 자바에서도 나온다. 개념이 좀 헷갈려서 처음에는 BridgeNumberGenerator와 BridgeRandomNumberGenerator 클래스를 이해하지 못하고 헤맸다. 그래서 인터페이스에 대해 찾아봤고 어떻게 코드에서 활용할지 감을 잡았다.
2. enum 클래스
저번 과제에서는 단순히 게임 내 메시지들을 정리하려는 용도였는데 피드백으로 받았던 Rank 클래스를 보고 저렇게 쓰는 거구나, 하고 깨달았다. 그래서 다리를 생성할 때 1은 "U", 0은 "D"로 변환되어야 하므로 둘을 묶어서 코드를 짜봤다.
📌고칠 것
1. 메서드 길이 줄이기
요구사항을 못 지켜서 너무 아쉽다...아무리 줄여보려 애를 썼지만..더이상 줄일 수 없었기에 나의 한계를 인정하고 걍 내버렸다. 다른 분들은 어떻게 했는지 봐야겠다.
2. 한 클래스(객체)에 너무 많은 역할 부여하지 않기
BridgeController 클래스에 너무 많은 메서드가 있는 것 같아 아쉽다. 이 역시도 다른 코드를 보면서 개선점을 찾아야겠다.
❗느낀 것
드디어 마지막 주였다. 개인 사정으로 짧은 기간 내에 완성해야 했어서 조급하기도 했지만 그래도 재밌었다. 힘듦에서 재미를 발견하는 나...어쩌면 대단할지도?😎 특히 구현은 다했는데 테스트 코드가 안 돌아가서 문제를 찾고 해결했을 때 너무 기뻤다.
코수타에서의 말씀처럼 이게 끝이 아니고 계속 해야 진정한 개발자로 거듭날 수 있다. (하지만 며칠만 쉬려고요..^^) 정말 자바 노베에서 시작했기 때문에 아직 갈길이 너~무 멀다. 어디서부터 시작해야 할지 몰라서 정말 간절하게 우테코 합격을 원하지만..안 될 걸 예상하고 스스로 공부 루틴을 짜야겠다. 시원섭섭한 끝이다.