본문 바로가기
스파르타(부트캠프)/TIL (Today I Learned)

[내일배움캠프] 스파르타 14일차_24.10.16

by Kimuky 2024. 10. 16.

공부 내용 및 활동 내용

1. Java  기초 학습 (Java의 정석 :  chapter 1. 자바 ~  chapter 5. Array)
2. 개인과제 lv.2 코드 리팩터링
3. 개인과제 lv.2 Troubleshooting

 


1. Java 기초 학습 

기본적으로 알고 있던 내용이라 중요하다고 생각했던 내용에 대해서 살펴보았고, 5개의 chapter 였지만 금방 읽을 수 있었다. 각 챕터에 대해서 추가로 알게된 내용들 키워드를 통해 이야기 하겠다.

- chapter 1. 자바 : 자바의 특징, JVM?

- chapter 2. 변수: 변수 명명법

- chapter 3. 연산자: 비트 연산

- chapter 4. 반복문 이름을 지정해서 원하는 루프를 break

- chapter 5. system.arraycopy


2. 개인과제 lv.2 코드 리팩터링

처음 기능만을 구현하기 위해 App, Caculator 두 가지 클래스 만을 지정해 구현을 하였다.

 

문제점

1. 코드 가독성이 떨어진다.

2. 코드 자체에 의존성이 강하다.

3. 중복 코드가 많다.

4. 함수 네이밍에 따른 기능만 하지않고 추가적인 기능도 같이 실행된다.

 

코드를 분석해보니 이러한 문제점들이 분석이 되었고, 이것들을 다시 리팩터링 하기로 결심했다.

코드 리팩터링은 한번도 해보진 않았지만 공부 삼아 해보는 게 나쁘지 않다고 판단했다.

 

일단은 코드 리팩터링에 대해서 자세히 모르기에 튜터님들에게 찾아가보면서

- 리팩터링을 왜 해야하는지

- 리팩터링은 어떻게 진행해야하는지

에 대해서 여쭤보았고, 대략 2시간이 걸렸던 것 같다. 성의껏 답변해주신 튜터님들에게 존경을 표합니다.

 

아무튼 코드 리팩터링에 대해서 개념이 정립되고 나 스스로 코드 리팩터링을 시작했다.

1. 함수는 한 가지 기능을 수행

2, 코드 중복을 최대한 피할 것

3. 클래스를 적극 활용할 것

 

일단은 저 3 가지 기준으로 시작하였다.

1차) 처음 만들었던 당시 클래스들 : App, Caculator

2차) 3가지 기준으로 추가한 클래스들: App, Caculator, InputRequester, Validator, PrintError

 

InputRequester는 Scanner를 통해 사용자에게 질문을 하고, 값을 리턴해주는 클래스이다.

Validator는 정수, 연산자가 문제가 없는지 확인해주는 클래스이다.

PrintError는 사용자가 잘못 입력하면 print 해주는 클래스이다.

 

2차로 리팩터링 한 것에 대해서 개인적으로는 만족을 했지만 아직도 코드의 중복이 많이 보였다. 하지만 이것을 어떻게 고칠지 도저히 모르겠어서 튜터님에게 다시 찾아갔다.

 

나는 내 코드를 튜터님에게 설명해주었고, 튜터님은 다 들어주시면서 코드를 읽어주셨다.

튜터님이 여기에 대해서 문제를 또 지적해주셨는데

1. 코드의 중복이 존재

2. 로직 처리의 느슨함 (예외 처리를 제대로 처리하지 않음)

3. 불필요한 코드

4. 판별의 중복

 

코드 하나하나 보시면서 설명해주셨다. 그 뒤, 다시 3차로 리팩터링을 튜터님과 함께 진행을 하고 로직 자체에 문제가 생겨 그 부분을 스스로 고치며 다시 찾아간다고 말씀 드렸다.

 

1차) 처음 만들었던 당시 클래스들 : App, Caculator

2차) 3가지 기준으로 추가한 클래스들: App, Caculator, InputRequester, Validator, PrintError

3차) 튜터님 조언을 통해 재구성: App, Caculator, InputRequester, Validator, PrintError

 

그 뒤, 다시 코드를 보며 자체적으로 코드 리뷰를 하는데 아직도 코드의 중복이 남아있었다. 이것을 해결하기 위해서는 연산을 하는 연산자를 식별해야하는데 연산자를 식별하는 과정에서 문제가 발생했다.

정수는 정수 그대로 int형에 넣어주면 되지만 연산자는 문자열 "+"  형태로 받기에 switch, if를 통해 어떤 연산자를 받는지 식별하고 그에 따른 식을 세워서 result에 넣어줘야 한다.

 

그렇기에 각 연산에 따른 Operation 클래스들을 추가하기로 결정하였다. 각 클래스들은 공통적으로 int 형 2개를 받아 int 한개를 return 해주기에 AbstractOperation을 만들어서 AddOperation, SubstratcOperation, DivideOperation, MultiplyOperation 각각의 연산 오퍼레이션 클래스가 추상 클래스인 AbstractOperation을 상속받게 구현했다.

 

4차) 연산자 클래스 추가: App, Caculator, InputRequester, Validator, PrintError, AbstractOperation, AddOperation, SubstractOperation, MultiplyOperation, DivideOperation

 

이렇게 코드 리팩터링 작업을 해보면서 클래스 인스턴스에 대해서 더 이해할 수 있었던 계기가 된 것 같다. 물론 코드 리팩터링이 잘 된건지는 모르겠고, 어떻게 보면 좀 과한 것 같다. 하지만 이런 작업을 통해 클래스 설계에 대해 감이 온 것 같아 기쁘다.

클래스 다이어그램


3. 개인과제 lv.2 코드 Troubleshooting

문제점

1. Scanner에 대한 문제점

2. 사용자 입력이 문제없을 때까지 입력을 요구하는 방법

3. 메인 메소드에서 static 없이 함수프로그램을 돌리는 방법

4. 개발자가 의도하지 않은 값들을 사용자가 입력했을 때, 예외처리

관련 링크

https://github.com/kimuky/programming_basic_suject

 

GitHub - kimuky/programming_basic_suject

Contribute to kimuky/programming_basic_suject development by creating an account on GitHub.

github.com


이렇게 개인과제 lv.2까지 코드 리팩터링이 끝났다. lv.3을 하지 못한게 아쉽긴 하지만 제대로 이해하지도 못하는 것을 도전하는 것 보다는 전에 학습했던 내용을 복습하는게 낫다고 판단했기 때문이다. 

오늘 대부분의 시간을 코드 리팩터링에 할애했지만 정말 많은 것을 배웠던 것 같고, 이런 작업이 좀 재밌었던 것 같다. 앞으로 깔끔한 코드를 짜기위해 노력을 해야할 것이다.