2024. 12. 23. 15:18ㆍ개발성장기
이번에 우아한테크코스를 모집해서 지원을 해 보았다. 방학에 자바를 열심히 공부하기는 했지만 나는 아직 초보고 잘하는 사람들이 많이 와서 내가 경쟁력을 가지지 못할거라는 것은 알았지만 내가 제일 좋아하는 펠리컨 이라는 새의 사고로 일단 도전을 해보았다.(일단 입벌려)
일단 첫주차에는 문자열 덧셈 계산기를 구현하는 과제였다.
과제의 명세는 문자열이 하나 주어지는데, 구분자로 숫자를 구분하여 모두 더한 값을 출력하는 문제였다.
앞에 어떤 처리를 해주면 구분자를 추가하게끔도 해주어야했다. 처음에 이 문제를 보고 나는 '뭐야? 백준 실버 하위급 구현인데?'라는 생각을 하였다.
대충 알고리즘을 짜고 코드를 짜려고하니, 뭔가 메인함수에 코드를 다 때려박는게 객체지향적이지 않고 그런것을 우아한테크코스가 원하는게 아닐거라는 생각을 했다. 또한, 막상 구현을 하려고보니 과제의 명세가 모호한 부분들이 있어서 내 자의적으로 문제를 해석해 나가야했다.
그래서 먼저, 만들 기능을 정하고 방학에 들었던 김영한 강사님의 자바 기본편 강의를 떠올리며, interface를 만들고 그 구현체로 구현해 나갔다. 그리고 구현체가 구현체에 의존하지 않도록 하고 AppConfig라는 클래스를 따로만들어 의존성을 주입해주었다. 강의를 들으며 강사님의 코드를 따라 칠 때도 그렇게 쉽지는 않았는데, 막상 내가 혼자해보려고하니 시간이 굉장히 오래걸렸다.
기능을 생각하는 것 또한, 쉽지 않았다. 각 클래스의 역할을 분리하여 한 클래스에 한가지 책임만 주도록 노력을 하였으나, 그렇게 설계를 하는것이 자바로 코딩을 많이 해보지 않은 나에게는 쉽지 않은 일 이었다.
또한, 구현을 해나가면서 금쪽이들이 이상한 값을 넣어주는 것 또한 막는것이 자바프로그래머의 숙명이기 때문에, 그런 예외 코드를 처리해주는것도 쉽지 않았다. 간단한 프로그래밍이지만, 자바로 객체지향 설계를 하며 각각의 클래스의 책임을 고려하여 프로그래밍 하는것은 정말 어려웠던 것 같다. 1주일이라는 시간이 정말 부족했다. 심지어 이 때가, 학교 시험기간과 겹쳐 일주일동안 거의 잠을 자지 못하고 코딩과 시험공부를 병행했다..ㅜㅜ..(진짜 너무 힘들었음)
또한, 테스트 코드를 작성해본적이 없어서 테스트 코드를 작성하는것 또한 매우 어려웠다. (사실 제대로 짜지 못했다...ㅋㅎㅋㅎㅋㅎ.)
그리고 마지막으로, 깃허브로 코드컨벤션을 지키며 커밋을 해야했고, 과제를 마무리 했다면 pr을 날려야했는데, 깃과 깃허브에 아직 익숙하지 않아서인지 이것또한 쉽지 않았다. 컨벤션을 까먹고 안지켜서 수정한것이 한 두번이 아니었고 처음엔 수정하는것 조차 버벅거렸다.
그래도 우테코에서 제시하는 테스트 코드는 통과하고 기분좋게 제출하고 1주차는 끝이난다.
이게 첫주차에 내가 설계해놓은 그림이다 ㅋㅋㅋㅋㅋ...
나의코드는 https://github.com/ghwo336/java-calculator-7/tree/ghwo336 에서 볼 수 있다.
두번째 주차는 자동차 경주게임을 구현하는 과제였다.
기능 요구 사항
- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
- 자동차 이름은 쉼표(
,
)를 기준으로 구분하며 이름은 5자 이하만 가능하다.- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
- 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다.
- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
- 우승자가 여러 명일 경우 쉼표(
,
)를 이용하여 구분한다.- 사용자가 잘못된 값을 입력할 경우
IllegalArgumentException
을 발생시킨 후 애플리케이션은 종료되어야 한다.
라는 문제였는데 그래도 이건 자동차라는 객체 게임이라는 객체를 만들어서 설계하면 될거같았다.
전 주차에 사람들이 짜 놓은 코드를 보니 많은 사람들이 전부 model view controller 로 폴더를 나누어서 구현을 해놨었다. 그래서 나도 그 방법으로 한 번 코딩을 해보고 싶어졌다.
이러한 패턴을 mvc패턴이라고 한다고 한다. 이런 패턴으로 구현을 해본적이 없었고, 자바도 내가 할 줄 아는게 그렇게 많지 않다는것을 깨달았다.
우선 IllegalArgumentException
을 발생시킨 후 애플리케이션은 종료되어야 한다. 라는 말을 어떻게 처리해야할지 몰랐다 ㅋㅋㅋ... 예외처리를 아직 공부하지 않기 때문이다. 그런데 보니까 throw IllegalArgumentException을 그냥 던져서 catch 하지않고 어플리케이션을 종료하면 되었기 때문에 그렇게 어렵진 않았다.(이런 try-catch문도 3주차에 학습한거다 ㅋㅋㅋㅋ..)
이 미션을 하는동안은 시험을 보는 시험기간이었기 때문에, 또한 시간이 없었다 ㅋㅋㅋ.. 금요일날 시험이 끝나고 토요일에 ICPC라는 알고리즘 대회도 있었기때문에 코딩을 할 시간이 일요일 월요일 밖에 없었다. 그래서 일요일에 밤을 새고 월요일에 학교에 가지않고 계속 구현을 했다 (자체공강)
처음에 설계를 하는거 부터 어려웠는데 우선 각 model viewer controller service에 책임을 나누는 기준도 너무 애매했고,input과 output을 전부 viewer을 이용해서 했기 때문에, 굉장히 input과 output을 받는게 어색했다. 그리고 Controller에게 너무 많은 책임을 몰아주는것같다는 생각이 들었고, 문제를 느꼈으나 시간의 한계 때문에 리펙토링을 아쉽게도 해주지 못하였다.
그리고 여기서도 ㅎㅎ... testcode를 잘 짜지못한거같다.(끝까지 테스트 코드를 잘 적지는 못한다... 테스트 코드 적는 연습을 해야할 것 같다)
그래도 우테코에서 제시하는 테스트 코드는 통과하고 2주차도 끝이난다.
나의 코드는 https://github.com/ghwo336/java-racingcar-7/tree/ghwo336 에서 볼 수 있다.
3주차는 로또 시스템을 구현하는 과제였다.
기능 요구 사항
간단한 로또 발매기를 구현한다.
- 로또 번호의 숫자 범위는 1~45까지이다.
- 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.
- 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다.
- 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다.
- 1등: 6개 번호 일치 / 2,000,000,000원
- 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
- 3등: 5개 번호 일치 / 1,500,000원
- 4등: 4개 번호 일치 / 50,000원
- 5등: 3개 번호 일치 / 5,000원
- 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.
- 로또 1장의 가격은 1,000원이다.
- 당첨 번호와 보너스 번호를 입력받는다.
- 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다.
- 사용자가 잘못된 값을 입력할 경우
IllegalArgumentException
을 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.Exception
이 아닌IllegalArgumentException
,IllegalStateException
등과 같은 명확한 유형을 처리한다.
확실히 미션의 난이도가 조금 어려워졌다고 생각을 한다. 이것도 mvc 패턴을 짰는데 객체를 어떻게 놓고 어떻게 책임을 나눌지를 결정하는 설계가 가장 오래 걸린것같다. 또 이상한 값을 입력할 금쪽이들을 위해... 이상한 값을 입력했을때 오류를 내고 이번에야말로 try catch를 이용하여 올바른 값을 입력받을 때 까지 입력을 받아야하는데 처음에 error을 어떻게 잡는지 이해가 가지않아 김영한 강사님의 자바-중급편에 예외처리 부분을 듣고 시도했다.
이 미션의 추가 요구사항이 함수가 15줄이 넘지 않으며 depth를 2까지만 허용했다. 즉 while 안에 try를 쓰면 그다음엔 if나 for같은 블록이 오는것을 쓸 수 없었다. 이를위해 함수를 많이 쪼개서 설계를 했어야하는데, 함수이름을 정하는것이 제일 어려웠다 ㅋㅋㅋ... << 사실 좋은 함수이름으로 짜지는 못한것같다 ㅋㅋ...
# 4주차는 편의점을 구현하는 과제였다
이곳을 참고하면 과제 요구사항을 볼 수있다.
여기서 과제 난이도가 굉장히높았는데, 여러가지 자료구조를 이용하여 구현을 해야했고, 요구사항도 복잡했다. 함수를 10줄이 넘지 않아야하며 depth 또한 2까지만 허용했고 예외처리도 해줘야했다.
예외처리가 제일 복잡했던것 같다 ㅋㅋㅋ...
한 2일정도 밤을 새가며 구현을 했다. 구조가 예쁘지는 않았던것같다 ㅠㅜ...
주어진 테스트는 모두 통과했지만, 스스로 테스트 코드를 많이 작성하지는 못했다.
처음에 파일의 위치를 로컬에있는 파일 위치로 잘못설정해 로컬에서는 테스트가 모두 통과하는데, 사이트에서 테스트는 다 실패했었다. 경로를 절대경로로 잘못 설정해서 그랬다는것을 깨닫고 상대경로로 바꾼 후 모두 패스를 받았다.
결과적으로 우아한테크코스에는 불합격하였다.
하지만 과제를 구현하고 자바코드를 써보는것은 굉장한 즐거움이었다.
내년에 다시 도전해서 내년에는 합격하도록 노력해야겠다!
'개발성장기' 카테고리의 다른 글
오랜만에 쓰는 근황 (3) | 2024.09.29 |
---|