처누

[우아한테크코스 6기] 프리코스 1주차 회고록 본문

우테코

[우아한테크코스 6기] 프리코스 1주차 회고록

처누 2023. 10. 26. 17:14

 우아한테크코스 프리코스가 시작됐다. 앞으로 내가 무엇을 공부했고 어떤 지식을 얻었는지 어떤 부분이 어려웠는지 등을 기록하려고 한다. 글을 잘 쓰는 건 아니지만 열심히 써보도록 하겠다!

 

0. Intellij 한글 깨짐 현상

더보기
  • Setting -> Editor  - File Encodings 에서 Global Encoding와 Project Encoding, 아래에 Default Encoding for properties files 다 UTF-8로 변경
  • Help -> Edit Custom VM Options 에서 아래 내용 입력 후 저장
-Dfile.encoding=UTF-8
-Dconsole.encoding=UTF-8

 

1. Java 17 버전 변경

더보기

 이전에 스프링 강의에서 환경 설정 하는 부분을 보고 참고함. 하지만 java -version에서 계속 11이 나와서 11버전을 삭제하고 17을 다시 깔았음.

 환경 변수에서 시스템 변수-path를 변경했어야 했는데 그 위에 있는 user 변수-path를 계속 변경하면서 왜 안되나 계속 구글링했다.... 바보 같았다...

 

  • 변경하려는 자바 버전 다운(경로 기억하기)
    https://www.oracle.com/kr/java/technologies/downloads/
  • 윈도우+R 누른 후 sysdm.cpl 입력 후 확인
  • 고급 - 환경변수 - "시스템 변수"("user에 대한 사용자 변수" 아님!)
    변수에 JAVA_HOME이 이미 존재하면 JAVA_HOME 클릭 - 편집 - 변수 값에 자바 다운로드한 경로 입력 - 확인
  • 변수명에 Path 찾아 클릭 - 편집 - 새로 만들기 - %JAVA_HOME%\bin 입력 후 확인
    (※만약 Path 내에 ~%javapath 시작하는 경로가 있다면 삭제) 
  • 터미널에서 java -version 입력 후 자바 버전 확인

 

 0번과 1번 과정에서 카카오톡 오픈채팅방이나 디스코드에서 질문하고 답변해 주는 분들이 많았다. 하지만 우테코에서 보낸 1주 차 메일에는 다음과 같은 문장이 있었다.

 어쩌면 환경 세팅도 우테코 측에서 의도한 히든 미션 같은 게 아닐까 하고 생각해서 꼼꼼하게 찾아보면서 적용해 봤다.
 GitHub도 이번에 fork나 브랜치 생성, commit하는 방법 등등 처음 해본 것이 너무 많았다.

 

2. 라이브러리 사용

더보기

 1주 차 미션 프로그래밍 요구사항에 다음과 같은 요구사항이 있었다.

 코테만 준비해 봤기에 API를 활용하는 방법을 몰라서 어떻게 사용하는 건지 구글링 해봤다. 그냥 평소에 사용하던  java.util, java.lang 등의 라이브러리를 사용하는 방법과 똑같았다. 어떻게 사용하는지 찾지 못하던 중 바로 아래에 사용 예시에 다음과 같은 예시가 있었다.

이걸 보고 그대로 따라 치던 중

Randoms 클래스가 있었고 클릭하니 import camp.nextstep.edu.missionutils 가 추가된 것을 보고 Project 파일에 있는 External Libraries 안에 Console과 Randoms 클래스가 있는 것을 확인했고, 라이브러리는 이렇게 사용하면 되는구나를 알았음.

 

3. 커밋 컨벤션

https://cheonu.tistory.com/2

 

커밋 컨벤션(Commit Convention)

커밋 컨벤션은 우테코 프리코스 후기를 찾아보면서 가장 많이 봤던 글 중 하나이다. Git에서 하는 커밋은 알고 있는데 커밋 컨벤션? 처음 들어보는 용어라서 정리해보려고 한다. 우리가 Git 커밋

cheonu.tistory.com

 

4. 예외 처리

 처음 접해보는 예외처리였다. try/catch문을 사용하여 에러를 잡는다는 것은 알고 있었는데 에러를 발생시킨 후 애플리케이션을 종료하라는 문장에서 머리가 새하얘졌다. 

 Randoms API에서 validateNumber, validateRange, validateCount 메소드에서 throw new IllegalArgumentException()을 보고 이런식으로 에러를 발생시키는 거구나!하고 이해했다.

 

5. " camp.nextstep.edu.missionutils에서 제공하는 Randoms  Console API를 사용하여 구현해야 한다." 

 Randoms 및 Console API'만'을 사용하여 구현이 아닌, 활용하라는 의미로 판단했다. 무조건 Randoms와 Console API를 사용하라는 의미가 아니라는 것을 의미한다고 생각했고, 저번 기수에서도 그랬듯 다음과 같은 문구가 있었다.

 '스스로 판단하여 구현한다'라는 문구는 현업에서도 이러한 경우가 많기에 경험해보라는 의미 같았다.

 

6. "프로그램 종료 시 System.exit()를 호출하지 않는다." 

 프로그래밍 요구 사항에 다음과 같은 요구사항이 있었다.

 이 문구를 보고 든 생각은 System.exit()말고 프로그램을 종료하는 다른 기능이 있겠구나! 라고 생각했다.

 찾아보니 System.exit() 제외하고 함수를 빠져 나오는건 return밖에 없었다. 구현 다하고 테스트 돌려보니 성공했길래 무슨 의미일까 너무 궁금해졌다. 1주차 끝나고 다른 분들 코드 보면서 많이 배워가야겠다.

 

7. "Java 코드의 열 제한은 120자입니다."

 기능 구현 중 자바 코드 컨벤션에서 120자를 넘어가면 안된다는 것을 보고 예외 처리하는 메소드는 클래스로 따로 분리했다. 알고보니 내가 잘못 오해하고 수정한거였다. 라인 120줄을 넘기는게 아니라 글자 120줄을 넘지 말라는 의미!! 옆으로 너무 길어지면 스크롤바 길어지니까 그런거 같다고 생각했다.

 

 

 

8. GameStart 메소드에서 예외 발생 후 바로 프로그램이 종료가 되고 main 메소드 안에 try/catch문에거 Exception을 잡지 못하는 상황이 발생했다. 이는 GameStart 메소드 내에 catch에서 IllegalArgumentException을 잡아버려 main 메소드에서는 Exeception을 잡지 못해 발생하는 문제였고,  GameStart 메소드 내에 catch에서 IllegalArgumentException 를 한번 더 throw해주면 해결되는 문제였다.

 

9. 테스트 오류

구현을 끝낸 후 테스트를 돌렸는데 둘 다 에러 발생. 

첫번째 에러 메세지

 1볼 1스트라이크가 있는데 왜 에러라는거지? 라는 의문을 함.

 사용자 값을 입력받을 때 replaceAll()을 사용해서 띄워쓰기 공백을 모두 삭제시킨 것 때문인줄 알고 고쳤는데도 똑같은 에러가 발생함. PrintResult 메소드에서 ball + "볼" + strike + "스트라이크" '볼'뒤에 띄워쓰기를 안해서 발생한 에러였다..

 

두번째 에러메세지

 "java.lang.assertionerror: expecting code to raise a throwable."

 예외가 발생 안되서 생긴 에러같다고 생각했다. 테스트 코드에 "1234" 값이 있었고, 요구사항에 '사용자가 잘못된 값을 입력할 경우'라고 명시 되어있었기 때문에 컴퓨터가 고른수가 "1234" 일 때 발생하는 오류를 처리 안해서 에러가 발생하는 거라고는 생각하지 않았다. 사용자가 입력하는 값이 "1234"라는건데.. 분명 나는 사용자가 입력한 값의 크기가 3이 아니면 예외가 발생하도록 구현을 했었다. 그런데도 계속 예외가 발생이 안된다는 에러만 떴다.

 찾아보니 main() 안에서 try/catch을 사용해서 발생하는 IllegalArgumentException를 잡아서 처리하고 있었다. 그래서 계속 올바른 에러를 throw했음에도 테스트 에러가 발생했던것. try/catch문을 삭제하니까 테스트 바로 통과!

 

10. 그 외

 이전 기수분들의 프리코스를 찾아보면서 신경써야겠다고 생각했던건 클래스, 메소드, 변수명이었다. 후기 글들을 찾아보다가 정말 많은 도움이 됐던 URL이 있어서 첨부하려고 한다.

 

 

[Java] 명명 규칙

1. 반의어 반의어 설명 get / set 받다 / 받다 add / remove 추가 / 제거 create / destroy 창조 / 파괴 start / stop 시동 / 정지 insert / delete 삽입 / 삭제 increment / decrement 증가 / 감소 old / new 구 / 신 begin / end 시작

ozofweird.tistory.com

 

 

좋은 코드를 위한 자바 메서드 네이밍

tecoble.techcourse.co.kr

 

 

좋은 코드를 위한 자바 변수명 네이밍

JAVA…

tecoble.techcourse.co.kr

 

 

11. 우테코 pr_checklist

 구현을 다 끝내고 난 후 우테코 Git에서 이것저것 보다가 pr_checklist를 찾았다. 하나씩 적용해보려 노력했다.

 

한 메서드에 오직 한 단계의 들여쓰기(depth)만 허용했는가?
 - 인덴트를 줄이기 위해 메소드 하나에 최소한의 기능만 실행되도록 구현했다. 코드들에서 while이 들어간 메소드들의 인덴트를 줄일 방법이 없을까? 하고 계속 고민해봤다.

else 예약어를 쓰지 않았는가?
 
- 항상 if문을 사용할 때 다른 조건이 필요하면 else문을 사용하는 습관이 있었다. 구현을 끝내고 난 후 else가 쓰여진 메소드들이 많았고, return을 사용하여 else 예약어를 모두 삭제했다.

모든 원시값과 문자열을 포장했는가?
 - 찾아보니 여러 메소드에서 상황에 따라 변할 수 있는 변수를 변경해야하는 경우 모든 메소드에서 일일히 바꿔주기엔 비효율적이다. 더 효율적으로 관리하기 위해서 상황에 따라 변할 수 있는 변수를 객체로 포장하여 해당 객체에서만 값을 바꿔주면 해당 변수가 사용된 모든 메소드에서 값이 변할 수 있도록 해주면 효율적으로 관리가 가능하다. 
 - 내가 작성한 코드에서도 몇몇 그런 변수들이 보였다. strike나 ball, 아니면 컴퓨터가 선택하는 숫자의 범위, 게임 종료 후 입력하는 1이나 2값, 컴퓨터와 사용자가 선택하는 숫자의 개수 등등. 이 중 하나라도 변경을 해야하는 상황이 생기면 해당 변수가 사용된 메소드에서 변경을 해주어야한다.

콜렉션에 대해 일급 콜렉션을 적용했는가?
 - 이번 미션에서는 콜렉션을 사용하지 않았다. 하지만 이것도 공부 해봐야겠다.

3개 이상의 변수를 가진 인스턴스 클래스를 구현하지 않았는가?
 - 구현하고 보니 딱 3개의 변수를 가진 클래스를 구현했다. strike와 ball을 다른 방법으로 빼낼 수 있을거 같은데 공부해봐야겠다.

 프리코스 시작 전 프리코스 후기들을 보면서 여러가지 정보들을 얻을 수 있었다. 커밋 컨벤션, 클린코드, 네이밍, mvc, 기능 목록 등등. 구현을 하기 전 요구사항들을 보고 기능 목록을 정리하면서 이게 맞나?하면서 작성했다. 코딩테스트 문제만 풀어보면서 문제에서 주어진 요구사항을 순서대로 구현하기만 해봤지 어떤 객체가 어떤 기능이 필요로 한지 세세하게 목록으로 따로 만들어보진 않았다. 

 

 구현을 하고나서 클린코드, 명명 규칙 등을 찾아보면서 메소드나 변수명을 변경하는데 하나씩 다 변경해야하는 번거로움이 있었다. 이를 한번에 관리할 수 있을거 같다고 생각했다. 방법을 찾아보는 중이다.

 

 디스코드에서 주석을 꼭 달아야할까? 라는 글을 봤다. 대부분은 주석이 필요 없이도 이해가 되는 코드를 짜는게 베스트라고 한다. 주석 없이도 이해가 된다면 주석을 달지 않아도 되고 설명이 필요하다면 주석을 쓰는게 맞다. 내가 봐도 헷갈리는 코드는 남은 무조건 헷갈린다.