지역변수의 유효 범위를 최소로 줄이면, 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 그렇다면, 유효 범위를 줄이는 방법들에 대해 알아보자.
🔖 지역변수의 선언 위치
C 언어 : 지역변수를 코드 블럭의 첫 머리에 선언
JAVA : 문장을 선언할 수 있는 곳이면 어디서든 변수를 선언 가능
첫번째로, "가장 처음 쓰일때 선언"하는 방법이다. 하지만 해당 방법은 변수의 생명주기 밖에서 잘못 사용될 위험성이 있고, 가독성이 떨어진다.
따라서 거의 모든 지역변수는 선언과 동시에 초기화 해야 한다. 즉, 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 하는 것이다.
두번째 방법은, for
/ for-each
와 같은 반복문을 사용해 범위를 최소화 할 수 있다.
반복문에서는 반복 변수(loop variable)의 범위가 반복문의 몸체, 그리고 for 키워드와 몸체 사이의 괄호 안으로 제한되기 때문이다. 아래의 예시를 봐보자.
Iterator<Element> i = c.iterator();
while(i.hasNext()) {
doSomething(i.next());
Iterator<Element> i2 = c.iterator();
while(i.hasNext()) { // 순회하지 않고 곧장 끝나버리는 버그 발생
doSomething(i2.next());
지역변수 i
의 유효 범위가 아직 끝나지 않았으므로, 에러가 있는 코드임에도 컴파일도 잘 되고 실행시 예외도 던지지 않는 문제가 발생한다. 따라서 웬만하면 for
문을 사용하는 것이 좋다.
for (Element e : c){
...
}
for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {
Element e = i.next();
...
}
// 다음의 코드는 "i를 찾을 수 없다"는 컴파일 오류를 발생시킨다.
for (Iterator<Element> i2 = c.iterator(); i.hasNext(); ) {
Element e = i2.next();;
...
}
for
문을 사용한다면, 이러한 복사해 붙여넣기 오류 를 컴파일 타임에 잡아주게 된다. 그 이유는 다음과 같다.
따라서 반복 변수의 값을 반복문 종료 뒤에도 써야 하는 상황이 아니라면 while문 대신 for문을 쓰도록 하자.
마지막 방법은, 메서드를 작게 유지하고 한 가지 기능에 집중하는 것이다.
한 메서드에서 여러 가지 기능을 처리한다면 다른 기능을 수행하는 코드에서도 변수에 접근할 수 있게 되므로 단순히 메서드를 기능별로 쪼개도록 하자.