지역 변수에 final을 붙여야 하나

내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.

지역 변수에 final을 붙여야 하나

회사에서 작성하는 모든 소스 코드에 대해 Quality Practice(이하 QP)를 적용하고 있다. Java 코드에 대해서는 Findbugs, PMD, Checkstyle과 같은 도구를 사용해 소스 코드를 분석한다. 물론 각 도구를 적용할 때의 규칙(rule)은 QP 담당자였던 내 주관적 판단(또는 취향)에 따라 조정한다.

이런 도구를 사용하면 코딩 표준을 강제할 수 있을뿐 아니라 잠재적 문제가 있는 코드, 비효율적인 코드 등을 쉽게 발견할 수 있다. 그러나, 각 도구의 규칙이 서로 충돌하는 경우도 있고, 심지어 한 도구 내에서도 상반되는 규칙이 있다. 따라서 모든 규칙을 만족하도록 코드를 작성하려는 시도는 바보같은 짓이다. 각 규칙을 확인하고 자신의 개발 조직에 맞도록 규칙을 지속적으로 조정해가는 것이 좋다.

그런데 가끔 고민을 하게 만드는 규칙이 있다. PMD의 LocalVariableCouldBeFinal과 같은 규칙이 그렇다. 이 규칙의 의도는 이해할만 하다. 지역변수라도 변하지 않는 것은 final로 선언해 의도를 명확히 하자는 것이다. 그러나 final을 덕지덕지 붙이면 코드가 너저분해진다. 좋은 규칙을 따르고는 싶지만 코드가 너저분해지는 것은 싫다. 여기서 내 고민이 시작된다. 업계의 Best Practice가 final을 붙이는 것이라면 따지지 말고 그냥 붙이자는 심산으로 인터넷을 검색해보기도 했지만, 붙여어 된다, 필요없다 의견이 갈리는 것 같다.

공통된 업계 의견이 없다면 이 규칙을 적용하는 것이 어떤 도움이 될지를 생각해보는 것이 좋겠다. 이 규칙을 적용한 다음 개발자에게 이 규칙을 따르라고 압박하면 아마 개발자들은 기계적으로 지역변수 선언부에 final을 붙일 것이다. 이렇게 된다면 어떤 좋은 점이 있을까? PMD는 지역변수 중 한 번만 할당되는 것을 찾아 final을 붙일 수 있다고 알려줄 뿐이다.

나는 지역변수에 final을 붙이지 않아도 실수를 유발하지 않을 정도로 코드를 짧고 이해하기 쉽게 작성해야 한다고 생각한다. final을 붙이지 않아 잘못될 수 있을 만큼 복잡한 코드라면, 코드를 더 짧고 이해하기 쉽게 바꿔야 한다. 지역변수에 final을 붙인다고 코드가 더 좋아지는 것은 아니라고 생각한다.