[Effective Java] 아이템 57 - 지역변수의 범위를 최소화하라
이번 아이템은 "클래스와 멤버의 접근 권한을 최소화하라" 의 취지로 접근하자.
지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다.
처음 사용
지역변수의 범위를 줄이는 가장 강력한 기법은 역시 '가장 처음 쓰일 때 선언하기'이다.
지역변수를 사용시점 훨씬 이전에 사용하게 되면 막상 사용할 시점에 타입과 변수명이 기억나지 않을 수도 있기 때문이다.
거의 모든 지역변수는 선언과 동시에 초기화해야 한다.
초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다.
try-catch문은 제외! - 변수를 초기화하는 과정에서 예외를 던질 가능성이 있다면 try 블럭안에서 사용. 단 변수 값을 try 블럭 외부에서도 사용해야 하는 경우라면 try 블럭 앞에 선언하자.
반복문
반복문은 독특한 방식으로 변수 범위를 최소화해준다.
for, for-each, while 등과 같은 반복문 내에서 선언된 변수(반복 변수;loop variable)는 반복문의 몸체, 그리고 for 키워드와 몸체 사이의 괄호 안으로 제한된다.
for(Element e: c){
doSomething(e);
}
*컬렉션 순회 시 권장하는 관용구
이러한 점 때문에 for >>> while
이유 1. 코드 복사 시 오류 가능성이 더 크다.
Iterator<Element> i = c.iterator();
while(i.hasNext()){
doSomething(i.next());
}
...
Iterator<Element> i2 = c2.iterator();
while(i.hasNext()){
doSomething(i2.next());
}
위 코드의 예에서 분명 두 while문에서 사용하게 되는 반복자는 다르다(i 와 i2)
하지만 코드를 복사하는 과정에서 두 번째 while문에서도 i.hasNext()를 사용하게 되었다.
분명 i2를 사용해야 되는 상황이라 의도와는 다른 코드가 되었음에도, 컴파일도 잘되고 실행 시 예외도 던지지 않는다.
이유 2. 변수 유효 범위가 for 문 범위와 일치한다.
변수 유효 범위가 for문 범위와 일치하여 똑같은 이름의 변수를 여러 반복문에서 써도 서로 아무런 영향을 주지 않는다.
이유 3. 가독성이 더 좋다 & 성능 개선
for(int i=0;, n = expensiveComputation(); i < n ; i++){
doSomething(i);
}
범위가 정확히 일치하는 두 반복 변수 i와 n이다. 반복 여부를 결정짓는 변수 i의 한계값을 변수 n에 저장하여, 반복 때마다 다시 계산해야 하는 비용을 더 줄여줄 수 있다.
같은 값을 반환하는 메소드를 매번 여러번 호출해야 한다면 위와 같은 관용구를 사용하도록 하자
메소드 최소화
지역변수 범위를 최소화하는 마지막 방법은 메소드를 작게 유지하고 한 가지 기능에 집중하는 것이다.
메소드를 기능별로 쪼개서 지역변수가 하나의 기능과만 연관이 되도록 코드를 구성한다.
정리
지역 변수를 사용시에 최대한 사용 시점 근처, 선언과 동시에 초기화, 반복문 사용시에 명확히 명시(for문 사용) 등과 같은 방법을 택하여 가독성, 성능을 챙기도록 하자!