티스토리 뷰

"클래스와 멤버의 접근 권한을 최소화하라"의 취지와 비슷하다.

지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다.

지역변수 범위를 줄이는 방법

지역변수의 범위를 줄이는 가장 강력한 기법은 '가장 처음 쓰일 때 선언하기' 이다.

미리 선언해두면 가독성이 떨어지고, 실제 사용하는 시점엔 타입과 초깃값이 기억나지 않을 수도 있다.

범위를 제대로 제한하지 않으면 사용된 뒤에도 할당해제가 되지 않고 계속 메모리에 유지되어 GC가 변수를 수거하지 못하게 된다.

 

거의 모든 지역변수는 선언과 동시에 초기화해야 한다.

초기화에 필요한 정보가 충분하지 않다면 충분해질 때 까지 선언을 미뤄야 한다.

try-catch문은 예외이다. 변수를 초기화하는 표현식에서 검사 예외를 던질 가능성이 있다면 try 블록 안에서 초기화 해야 한다.

 

반복변수의 값을 반복문이 종료된 뒤에도 써야 하는 상황이 아니라면 while 문보다는 for문을 쓰는편이 낫다.

Iterator<Element> i = c.iterator();
while (i.hasNext()) {
    doSomething(i.next());
}

// 긴 코드 ...

Iterator<Element> i2 = c2.iterator();
while (i.hasNext()) { // 버그 !! (i2를 사용해야 함)
    doSomething(i2.next());
}

이 코드는 컴파일도 잘 되고 실행 시 예외도 던지지 않기에 오류가 겉으로 들어나지 않아 발견하기 어려울 수 있다.

for-each, for 문 사용시 이런 복붙 오류를 컴파일 타입에 잡아준다.

for (Iterator<Element> i = c.iterator(); i.hasNext();) {
    Element e = i.next();
    ... // e, i를 사용한다.
}

...

for (Iterator<Element> i2 = c2.iterator(); i.hasNext();) {
    Element e2 = i2.next();
    ... // e2, i2를 사용한다
}

책에서는 for 문 사용하는걸 권장하는거 같다.

 

지역변수 범위를 최소화하는 마지막 방법은 '메서드를 작게 유지하고 한 가지 기능에 집중하는 것이다.'

한 메서드에서 여러 가지 기능을 처리하려면 그 중 한 기능과만 관련된 지역변수라도 다른 기능을 수행하는 코드에서 접근할 수 있을 것이다. 해결책은 단순히 메서드를 기능별로 쪼개면 된다.