[시리즈] 읽기 좋은 코드 작성하기
· 읽기 좋은 코드 작성하기 (1/2)


저번 글에서는 왜 코드를 읽기 좋게 작성해야 하는가 알아봤음.

그러면 어떻게 하면 깔끔하게 코드를 작성할 수 있는지 실제 예제를 통해 알아보도록 하자.


그 전에 알아야 할 사실은 어떤 사람도 깔끔한 코드를 한 번에 작성할 수 없다는 거임.

(1) 일단 작성하고, (2) 그 코드를 깔끔하게 만드는 2단계 과정이 필요함.


"아니 옆집 철수는 아름다운 코드를 바로바로 작성하던데요"

그건 (1) (2) 단계를 계속 하다보니까 숙달되서, 머릿속에서 지저분한 코드를 깔끔하게 만든 뒤에 작성하는거임.

그리고 신의 경지에 올라서 깔끔한 코드를 뽑아낼 수 있는 사람도, 기능 추가/변경을 여러번 겪게 되면 코드가 더러워 질 수 밖에 없음.

따라서 코드를 작성하는 걸 너무 두려워 하지 말라는 거임. 일단 작성하고 깨끗하게 만들어!


오늘 풀어볼 문제는 누가 물어본 https://www.acmicpc.net/problem/1439">1439 뒤집기 문제임.

무슨 문제인지 모르는 사람은 읽고 오셈: https://www.acmicpc.net/problem/1439


일단 유동이 올린 코드를 보도록 하자.



점심나가서먹을거같애

이 코드는 딱 봐도 읽기 좋지 않아보임. 왜 그럴까? 그 이유를 정리해보자면 아래와 같음.


1. 들여쓰기, 포맷팅이 제대로 되어있지 않아 읽기가 불편함

2. 로직이 난잡함

- 중간에 버그를 찾아서 수정했기 때문임

3. 무엇을 하는지 이해하기 어려움

- 변수 이름이 제대로 적혀있지 않거나, 주석이 없어서 그럼

4. 쓸모없는 import가 있음 등등


우리는 이 코드를 변경하고 주석도 달고해서 최대한 읽기 좋은 코드를 만들것임.


여기서 잠깐! 코드에 주석을 달아야 한다고 하니까 이런 주석을 다는 사람들이 있음.


이런 주석은 나쁜 주석임. 주석이라는 건 코드를 읽는 것만으로는 파악하기 어려운 정보를 적어두는 곳임.

저 코드는 Java를 할 줄 아는 사람이면 무슨 일을 하는지 이해할 수 있는 코드임. 이런 쓸모 없는 주석은 달지 않는 게 좋음.

그러면 좋은 주석이라는 건 뭘까? 그건 아래에 나올거임.


일단 위의 코드를 정리하면 다음과 같음.


1. 0뭉탱이와 1뭉탱이의 개수를 센다.

2. 답 = min(0뭉탱이, 1뭉탱이)


문제는 이 풀이 자체가 로직을 복잡하게 만든다는 거임. 왜?

뭉탱이를 세는 과정은 i와 i+1 (또는 i-1)를 비교하게 되는데, 이러면 가장 앞이나 뒤의 글자 하나는 따로 처리를 해 주어야 함.

이 따로 처리하는 과정이 로직을 복잡하게 만들고, 이 과정에서 실수도 생기게 되는거임.


그렇다면 어떻게 해야할까? 나 같은 경우는 뒤집힌 수를 셌음. (0->1이 되거나 1->0이 되는 횟수) 이렇게 하면 (뒤집힌 횟수 + 1) / 2가 답임을 알 수 있음. 또한 맨 앞이나 맨 뒤의 예외 케이스를 따로 해결할 필요가 없음.


그러면 다음과 같이 코드를 작성할 수 있음.


여기서 봐야할 점은 2가지임.


1. countFilp

아마 PS를 하는 사람이면 count나 cnt가 익숙하지 않을까 싶음. 그런데 왜 countFlip을 썼을까?

그 이유는 count만 쓰면 어떤 것을 세는지를 추가적으로 적어줄 필요가 있기 때문임.



(주석이 필요 없는 코드) > (주석이 있는 코드)임

주석이 필요하지 않는 코드를 작성할 수 있다면 그게 더 나음.


그렇다고 변수명을 무조건 길게 하라는 것도 아님. numberOfFlipInInput 이렇게 하면 뜻은 동일한데 읽기만 불편해짐.

주어진 정보를 잘 나타내면서 길지 않은 이름을 짓는 연습이 필요함.

남이 봤을 때 바로 알아볼 수 있는 이름이면 충분함.


2. 밑의 주석

밑에 있는 주석의 경우 적는게 좋다고 생각함. 갑자기 뒤집힌 수에 1을 더하고 2로 나누는데 코드만 보고는 뭘 하는지 알 수가 없잖아.


"푸는 부분을 함수로는 따로 안 빼시나요?"

물론 함수로 저 부분을 만들어도 됨.

그런데 함수로 너무 잘게 나누어도 보기가 어렵더라. 개인적인 생각으로는 어떤 코드가 3번 이상 반복되면 그 때 함수로 빼도 늦지 않다고 생각함. 이 문제의 경우, 딱 한 번 푸는거니까 그냥 엔터를 통해 구역만 잘 나누어 놓아도 큰 문제 없음.


그리고 이 예제를 보면 알겠지만 로직 자체가 단순하면 좋음. 예외 조건이 있으면 코드도 복잡해지고 실수도 할 확률이 높아진다.


---


이렇게 간단한 예제로나마 깔끔하게 작성하기를 해봤고 자세한 내용은 책을 보면 나와있으니 한 번 사서 읽어보는 걸 추천함.