지역변수의 범위를 최소화해야 하는 이유는 무엇일까요?
바로 코드의 가독성
과 유지 보수성
때문입니다.
지역변수의 범위를 사용하는 지점으로 한정한다면 불필요한 오류의 발생 가능성을 감소시켜주는 것이죠. 그렇다면 어떻게 지역변수의 범위를 최소화할 수 있을까요?
정말 당연한 이야기죠?
로버트 마틴의 유명 저서인 클린코드에서도 아래와 같이 이야기합니다.
변수는 사용하는 위치에서 최대한 가까이 선언한다. 우리가 만든 함수는 매우 짧으므로 지역 변수는 각 함수 맨 처음에 선언한다.
지역변수의 범위를 선언된 지점부터 해당 블록이 끝날 때까지로 한정 짓는다면 사용하지 않아야 할 지점에 사용하게 되는 이슈는 없을 것입니다.
또한 특정 상황(try-catch)를 제외하고는 선언과 동시에 초기화 해야합니다.
// try 구문의 변수가 try블록 외부에서 사용될 수 있기 때문에 이 부분은 예외적임
Class<? extends Set<String>> cl = null;
try {
cl = (Class<? extends Set<String>>) Class.forName(args[0]);
} catch(ClassNotFoundException e) {
//...
}
cl = ~~~;
왜 for문을 사용해야 할까요?
for문은 변수의 범위를 해당 블럭 내부로 한정지어 줍니다. 즉, 반복에서 사용되는 변수를 반복문 외부에서 사용하지 않는 한 for문을 사용하여 범위를 제한하는 것이 좋습니다.
이펙티브 자바에서는 Iterator 메서드 를 써야하는 순간을 제외하고는 향상된 for문을 사용하라고 추천하고 있습니다.
또한 아래와 같은 이유때문에 while
보다는 for
문을 추천하기도 합니다.
Iterator<Element> i = c.iterator();
while(i.hasNext()) {
doSomething(i.next);
}
Iterator<Element> i2 = c2.iterator();
// 무지성 복붙하다가 아래처럼 작성하기도 한다. (알고리즘 많이 푼사람 공감 가능)
while(i.hasNext()) {
doSomething(i2.next);
}
만약 한 메서드에서 여러가지 일을 수행한다면, 메서드의 길이도 늘어지고 여러 지역변수가 사용될 가능성이 높아집니다. 이렇게 되면 명확한 변수 이름을 짓지 않는 한 문제가 발생할 수 있죠.
간단하게 메서드를 기능별로 쪼개는 것으로 이 문제를 해결할 수 있습니다.
이번 아이템은 클린코드와 관련한 아이템이라 크게 소개할 내용은 없지만 while
보다 for
문을 사용해야 하는 이유, 메서드를 작게 유지해야 하는 이유 등의 주장에 힘을 실어줄 수 있는 아이템이라고 생각하면 유익할 것 같습니다.