본문은 Effective Java를 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.
선결론
- "지역변수의 범위를 최소화하라"라는 말은 "클래스와 멤버의 접근 권한을 최소화하라"한 아이템 15와 취지가 비슷하다.
- 즉, 프로그램 요소의 접근성을 가능한 한 최소한으로 유지하여 정보 은닉의 장점을 취하자는 것이다
지역변수의 범위를 줄이는 방법
1) 가장 처음 쓰일 때 선언하기
- 사용하는 시점보다 훨씬 이전에 미리 선언하면 가독성이 떨어지고, 실제로 사용하는 시점엔 타입과 초깃값이 헷갈릴 수 있다
- 변수의 스코프를 고려하지 않고 마구잡이식으로 선언하면 의도한 범위의 앞이나 뒤에서 해당 변수를 사용할 때 문제가 발생할 수 있다
2) 가능한 한 지역변수는 선언과 동시에 초기화하기
- 초기화에 필요한 정보가 충분치 않다면 충분해질 때까지 선언을 미뤄야 한다
- try-catch문은 예외다
- 변수를 초기화하는 표현식에서 검사 예외를 던질 가능성이 있다면 try블록 안에서 초기화해야 한다(그렇지 않으면 예외가 블록을 넘어 메서드에까지 전파된다)
try {
Object object = canMakeCheckedException();
// ...
} catch (IOException e) {
// ...
}
- 변수 값을 try 블록 바깥에서도 사용해야 한다면 비록 정확히 초기화하진 못하더라도 try 블록 앞에서 선언해야 한다(아이템 65, 코드65-1)
Constructor<? extends Set<String>> cons = null;
try {
cons = cl.getDeclaredConstructor();
} catch (NoSuchMethodException e) {
fatalError("매개변수 없는 생성자를 찾을 수 없습니다.");
}
3) while문 대신 for문(또는 for-each문)을 사용하기
- for문이나 for-each문을 사용한 반복문에서는 반복 변수(loop variable)의 범위가 반복문의 몸체, 그리고 for 키워드와 몸체 사이의 괄호 안으로 제한된다 → 지역범수의 범위가 줄어든다!
- 그러나 반복 변수의 값을 반복문이 종료된 뒤에도 써야 하는 상황이라면 while문을 사용하라
컬렉션이나 배열을 순회하는 권장 관용구
for (Element e : c) {
... // e로 무언가를 한다.
}
- 반복자를 사용해야 하는 상황이면 for-each문 대신 전통적인 for문을 쓰는 것이 낫다
반복자가 필요할 때의 관용구
for (Iterator<Element> i = c.iterator(); i.hasNext();) {
Element e = i.next();
... // e와 i로 무언가를 한다.
}
- 원소와 반복자의 유효 범위가 반복문 종료와 함께 끝난다
- 똑같은 이름의 변수를 여러 반복문에서 반복해서 사용할 수 있다
- while문보다 짧아서 가독성이 좋다
4) 메서드를 작게 유지하고 한 가지 기능에 집중하기
- 한 메서드에서 여러 기능을 처리한다면 각 기능을 수행하는 코드가 임의의 지역변수에 접근함으로써 부수효과가 발생할 수 있다
- 따라서 메서드를 기능별로 쪼개서 구현할 것을 권장한다
'책 > Effective Java' 카테고리의 다른 글
[이펙티브 자바] 아이템 59: 라이브러리를 익히고 사용하라 (0) | 2022.07.01 |
---|---|
[이펙티브 자바] 아이템 58: 전통적인 for문보다는 for-each문을 사용하라 (0) | 2022.06.30 |
[이펙티브 자바] 아이템 55: 옵셔널 반환은 신중히 하라 (0) | 2022.06.29 |
[이펙티브 자바] 아이템 54: null이 아닌 빈 컬렉션이나 배열을 반환하라 (0) | 2022.06.23 |
[이펙티브 자바] 아이템 53: 가변인수는 신중히 사용하라 (0) | 2022.06.23 |