공부 내용 및 활동 내용 |
|
1. 개인과제 코드 리팩터링
|
자바 공부하면 할수록 어려워지는 것 같다. 람다, 스트림, 스레드, 예외처리 등.. 정말 막막하다. 어찌해야 할지는 모르겠지만 천천히 이해될 때까지 책을 계속 보며 학습을 하고 있다.
1. 개인과제 새로 한 것과 비교
코드 리팩터링에 대해서 항상 고민을 해왔던 것 같다. 하지만 뭔가 잘못되었다는 느낌을 많이 받았다. 뭔가 구조화하면 할수록 더 복잡해지고 그만큼 코드 가독성이 떨어지는 것 같다.
그래서 튜터님에게 찾아가 코드 리뷰를 부탁드렸다. 음~~.. 역시나 내가 생각했던 것처럼 복잡하다고 하셨고, 읽기 힘들다고 하셨다. 천천히 듣던 도중 하나의 예시에 대해서 말씀해 주셨는데 아직까지 생생하게 기억이..
면 위에 고기를 얹고 야채를 얹고 그대로 분리하라고 하면 금방 해낼 수 있을 것이다. 하지만 그것을 지지고 볶고 이리저리 볶다 보면 그것을 분리하기 힘들 것이다. 코드도 마찬가지다. 코드에 대한 로직이 이리저리 있으면 결국 그것을 분리하기 힘들다는 것이다.
잘 짜여진 코드는 그대로만 있어도 읽기 쉽고 이해하기도 쉽다. 결론적으로 메서드를 정리하고 막 클래스를 나눠야 하는 것은 아니다. 그대로 이해하기 쉽고 읽기 쉬우면 낫 둬도 되는 것이다. 그러면 본질적으로 코드가 간결하고 불필요한 로직을 제거하고 쉽게 짜야한다는 것이다.
튜터님은 지금 당장의 코드를 고치는 것보다 새로 짜라고 말씀하셨다. 듣자마자 머리가 멍했다.. 물론 잘 짠 코드는 아니지만 구현하라는 것을 구현한다고 9~ 10시간을 써가며 만든 프로젝트이기 때문이다. 음 받아들여지지 않았지만 튜터님 말씀이라 귀담아듣고 어떻게 나누는지 대략적으로 설명을 들었다.
그 뒤, 집중이 잘 안되서 소파에서 멍하니 누워있다가 20분 정도 그냥 누워있으면서 생각을 정리했다. 천천히 생각이 정리되며 밥을 먹고 과제를 다시 시작했다.
처음에 접근한 것은 세부적인 조건 (정수 판별, 힌트 처리 등) 이런 것들을 생각하기보다는 큰 조건, 큰 단위부터 찾아보기 시작했다. 숫자야구게임에 대해서 정리해 보니
- 필수 기능 정리
- 정답 숫자 생성
- 정답 입력
- 스트라이크 볼 아웃 판별
- 이어하기 While
- 도전 기능 정리
- lv 3 게임 기록 확인
- lv 4 게임 난이도 조절
이렇게 정리를 할 수 있었다.
- 시작
바로 구현하면서 짜는 것보다는 크게 틀을 만들며 시작했다.
루프가 돌아갈 공간, 필수 기능들이 놓일 위치, 로직 처리 순서에 신경 쓰며 당장의 빨간 줄이 생기는 에러를 무시하고 메서드를 배치했다. 어느 정도 틀이 완성되었다. 이제 천천히 메서드들을 보며 구현하기 시작했다.
- 중간
뭔가 설계를 하고 구현을 하니 정말 쉽게 금방 할 수 있었다. 물론 이미 한 것이라 그럴 수도 있겠지만, 로직을 처리하는데도 큰 문제가 없었고, 메서드를 쉽게 나눌 수 있었다.
- 끝
완성을 시키고 전에 만들었던 프로젝트와 비교해 보니 정말 가독성이 많이 차이 났다. 뭔가 불필요한 것들을 전부 제거한 기분이었다.
대충 보기에도 메서드 수, 클래스 수가 확연하게 차이가 난다. 왼쪽이 기존에 만들었던 프로젝트, 오른쪽이 새로 만든 프로젝트이다.
인텔리제이에서 제공하는 클래스다이어그램 생성기능을 통해 살펴보면 더욱 확연한 차이가 난다.
음 대충 봐도 다르다... 물론 클래스 구조보다는 코드 가독성에 더 신경을 썼다.
메인 로직 구간
기존: 더 깔끔해 보일 수도 있으나 구조화되지 못하였다.
새것: Enum을 활용해 case에 대해 명확히 설명해주고 있다. 물론 새 옵션이 생기면 관리도 쉬울 것이다.
게임 로직 구간
기존: 코드가 더 간결해 보이지만, 실제로는 isAnswer에서 정답 판별, 스트라이크볼 계산, 스트라이크볼 결과 출력 역할을 다하고 있다. 해당 메서드이름에 비해 실제 많은 기능들을 하고 있다. 해당 메서드에서 무엇을 하는지 명확하게 알 수 없다.
새것: 힌트를 보여주는 로직을 추가했음에도 복잡하게 if 문으로 얽혀잇지 않으며 실제 play() 동안 여기서 무엇을 해주는지 명확하게 나타내고 있다. 값을 받고, 스트라이크볼 계산, 스트라이크볼 출력, 힌트출력, 정답 판별 이 이루어지고 있다는 것을 명확하게 알 수 있다.
난수 생성기 클래스
난수 생성기는 상태를 가질 필요가 없다. 해당 자릿수만 받으면 자릿수에 맞는 난수만 만들어서 반환해 주면 된다.
기존: 상태를 가지며 해당 클래스가 필요 없는 배열을 반환해 주는 메서드나, 실제 난수 생성에서 너무 많은 일을 한다.
새것: 자릿수를 받으면 해당 자릿수에 맞는 난수 리스트만 생성해 주고 역할은 끝난다. 메서드 이름에 맞고 간결하게 처리되고 있다.
기존 프로젝트 클래스 (Validator)
- Validator는 판별해 주는 클래스인데 안에 스트라이크와 볼을 출력해 주는 기능이 있다...
기존 프로젝트 Git Repo
https://github.com/kimuky/programming_basic_subject_2
새 프로젝트 Git Repo
https://github.com/kimuky/programming_basic_subject_2
2. 주석 처리에 대하여
- //TODO : 이것을 사용해 주석 처리하면 TODO를 모아 따로 볼 수 있다. 주석과는 다르게 노란색이어서 문제 있는 로직이나 수정하고 싶은 부분에 TODO를 넣어 식별이 편하다.
- /** **/ : 이것을 이용하면 복잡한 메서드에 대해서 설명을 자세하게 달아줄 수 있다. 파라미터, 리턴 등이 이 주석 안에 자동으로 생성되기 때문에 편안하다. 또한, 호출되는 쪽에서 마우스를 HOVER 한다면 설명을 바로 볼 수 있는 기능도 있다.
3. Git branch 활용
- 코드를 수정해 갈 때, git branch를 통해 branch를 생성해 원본은 남겨두고 복사본을 수정하고 원격 브랜치에 푸시를 한 뒤, 원격 메인에 PR를 해주었다.
장점
- 협업에 굉장히 용이한 것 같다.
- 따로 기능 개발할 때도, 따로 빼두어 작업하기에 여러 가지 테스트를 할 수 있다.
- 안전하게 작업이 가능한 것 같다.
물론 처음 해봐서 삽집을 많이 했다.. 한글 깨짐 현상이나 리드미 생성에 따른 착오가 있었다..
Git branch를 통해 작업하면 조금 번거로운 점이 있다.
1. 로컬 복사 브랜치 생성
2. 로컬 복사 브랜치 이동
3. 기능 개발
4. 원격 브랜치에 푸시
5. 원격 저장 브랜치에서 메인 저장 브랜치에 PR 및 머지
6. 로컬 메인 브랜치에 풀
7. 로컬 복사 브랜치에 풀
3 ~ 7 반복
물론 단점보다는 장점이 훨씬 많으므로 협업하기 전에 열심히 테스트해 보며 숙달해보아야 할 것이다.
1. 코드를 간단하고 깔끔하게 짜는 것은 어렵다. -> 쉽게 짜고 싶다.
2. 개발할 때, 적극적으로 Git을 통해 기록을 남기고 활용하자 -> 자산이라 생각하자.
3. 포기하지 말자. -> 아 어렵다
파이팅
'스파르타(부트캠프) > TIL (Today I Learned)' 카테고리의 다른 글
[내일배움캠프] 스파르타 18일차_24.10.22 (2) | 2024.10.22 |
---|---|
[내일배움캠프] 스파르타 17일차_24.10.21 (3) | 2024.10.21 |
[내일배움캠프] 스파르타 16일차_24.10.18 (3) | 2024.10.18 |
[내일배움캠프] 스파르타 14일차_24.10.16 (2) | 2024.10.16 |
[내일배움캠프] 스파르타 13일차_24.10.15 (0) | 2024.10.15 |