지역변수의 범위를 최소화하라
선언 시점
- 지역변수의 범위를 줄이는 가장 강력한 기법 → ‘가장 처음에 쓰일 때 선언하기’
- 미리 선언해둘 경우 코드가 어수선해짐 → 가독성 떨어짐
- 지역변수의 범위: 선언된 지점 ~ 그 블록이 끝날 때
- 거의 모든 지역변수는 선언과 동시에 초기화해야 함
- 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미루자
try-catch
는 예외
- 초기화 과정에서 검사 예외를 던질 가능성이 있다면 try 블록 안에서 초기화해야 함
- 예외가 블록을 넘어 메소드까지 전파되는걸 막기 위함
- 변수 값을 try 블록 밖에서도 사용해야 한다면 try 블록 앞에서 선언해야 함
반복문(for? while?)
- 반복문은 독특한 방식으로 변수 범위를 최소화함
- 반복 변수(loop variable)의 범위 제한됨
- 반복문의 몸체
- for 키워드와 몸체 사이의 괄호 안
- 반복 변수의 값을 반복문이 종료된 뒤에도 써야 하는 상황이 아닐 경우 → while보다는 for를 쓰자
- 컬렉션 순회의 예
for (Element e : c) {
... // Do Something with e
}
- 반복자를 사용해야 하는 상황 = 전통적인 for 문을 쓰는 것이 유리
for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {
Element e = i.next();
... // Do something with e and i
}
반복문의 변수 범위가 한정되지 않을 경우 문제
Iterator<Element> i = c.iterator();
while (i.hasNext()) {
doSomething(i.next());
}
// ...
Iterator<Element> i2 = c2.iterator();
// 일부러 i 받아서 쓴거임!
while (i.hasNext()) {
doSomethingElse(i2.next());
}
- 이슈: 새로운 반복 변수를 초기화했지만, 이전 while 에서의 변수(i)를 다시 사용
- i의 유효 범위는 while 문 바깥 → 2번째 while도 범위 안에 포함됨
- c2를 조회하지 않고 비었다고 착각하게 만듦
- 프로그램 오류가 겉으로 들어나지 않음 → 오랜 기간 발견되지 않을 수도 있음
For 문 사용 시 장점
- for 문 사용 시 복붙 오류를 컴파일 시점에 잡을 수 있음
- 첫 번째 반복문이 사용한 원소의 유효 범위 → 반복문 종료와 함께 끝
for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {
Element e = i.next();
... // Do something with e and i
}
...
// Compile-time error - cannot find symbol i
for (Iterator<Element> i2 = c2.iterator(); i.hasNext(); ) {
Element e2 = i2.next();
... // Do something with e2 and i2
}
- for 문이 복붙 오류를 줄여주는 이유 또 하나
- 변수 유효 범위가 for 문 범위와 일치 → 똑같은 이름의 변수를 여러 반복문에서 써도 아무런 영향 X