지역변수의 범위를 최소화하라.
: 코드 가독성과 유지보수성이 높아지고 오류 가능성이 낮아진다.
- 클래스의 멤버와 접근 권한을 최소화하라(item 15)와 비슷한 의도이다.
- 이번 포스트에서는 지역변수의 범위를 최소화하는 방법에 대해 다룬다.
가장 처음 사용되는 시점에서 선언하자.
- 코드의 어수선함을 줄이고 가독성을 높일 수 있다.
- 변수가 미리 선언되어 있으면 그 타입이나 초기값을 찾기 어려울 수 있다.
선언과 동시에 초기화하자.
- 필요한 정보가 충분하지 않다면 선언을 늦추는 것이 좋다.
- try-catch 문은 이 규칙에서 예외다.
- 변수를 초기화하는 표현식에서 검사 예외를 던질 가능성이 있다면 try 블록 안에서 초기화해야 한다.
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader("test.txt")); // try 블록 안에서 초기화
} catch(IOException e) {
// 예외 처리
}
- 변수 값을 try 블록 밖에서도 사용해야 한다면 try 블록 앞에서 선언해야 한다.
BufferedReader reader = null; // try 블록 앞에서 선언
try {
reader = new BufferedReader(new FileReader("test.txt"));
} catch(IOException e) {
// 예외 처리
} finally {
if (reader != null) {
try {
reader.close(); // try 블록 바깥에서 reader를 사용
} catch(IOException e) {
// 예외 처리
}
}
}
반복문을 사용하여 변수 범위를 최소화하자.
- for-each 문이나 for 문을 사용하면 반복 변수의 범위가 반복문의 범위로 제한된다.
- while 문을 사용하는 경우에는 반복 변수의 범위가 더 넓어지므로 for 문을 사용하는 것이 좋다.
- (반복문이 끝난 뒤에 반복 변수가 필요한 것이 아니라면)
- 아래 예시(while을 사용할 경우)는 의도치 않게 반복자인 i의 hasNext() 메소드를 호출하여 잘못 동작한다.
- 아래 예시(for을 사용할 경우)는 컴파일 에러가 발생하여 디버깅을 더 쉽게 할 수 있다.
// while을 사용할 경우
Iterator<Element> i = c.iterator();
while(i.hasNext()) {
doSomething(i.next());
}
Iterator<Element> i2 = c.iterator();
while(i.hasNext()) { // 문제 발생
doSomething(i2.next());
}
// for을 사용할 경우
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();;
...
}
- 반복자(index)를 사용해야 하는 경우네는 for-each 문보다 for 문이 낫다.
for (Element e : c) {
// e로 무언가를 반복한다.
}
for(Iterator<Element> i = c.iterator(); i.hasNext();) {
Element e = i.next(); //e와 i로 무언가를 반복한다.
}
- for문의 초기화 부분은 한 번만 실행되므로 계산 비용이 큰 표현식을 다룰 때 유용하다.
for (int i = 0; i < expensiveComputation(); i++) {
// do something...
}
// n에 한 번만 계산되어 계산 비용을 절약
for (int i = 0, n = expensiveComputation(); i < n; i++) {
// do something...
}
메소드를 작게 유지하고 한 가지 기능에 집중하자.
- 한 메소드가 여러 기능을 처리하면 관련 없는 코드에서도 변수에 접근할 수 있게 된다.
- 따라서 기능별로 쪼개어 한 가지 기능에만 집중하도록 하자.