요약
지역변수의 범위 최소화하는 법
- 지역변수는 가장 처음 쓰일 때 선언해라
- 거의 모든 지역변수는 선언과 동시에 초기화해라
- 메서드를 기능별로 쪼개 작게 유지하고 한 가지 기능에 집중하게 설계해라
지역변수의 유효 범위를 최소로 줄였을 때의 이점
- 코드 가독성과 유지보수성이 높아진다
- 오류 가능성이 낮아진다
1. 지역변수는 가장 처음 쓰일 때 선언해라
지역변수를 미리 선언해두면 다음과 같은 문제가 발생할 수 있다.
- 코드가 어수선해져 가독성 저하
- 변수를 실제 사용하는 시점에 타입/초깃값 중복 확인
- 변수를 다 사용한 뒤에도 변수가 살아있어 다른 곳에서 사용될 수 있고, 그로인한 부작용 발생 가능성이 있다
2. 거의 모든 지역변수는 선언과 동시에 초기화해야 한다
만약 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다.
반복문
for 문이나 for-each 문 같은 반복문의 경우에는 반복 변수의 범위가 반복문 괄호와 몸체에 제한되기 때문에 변수의 범위를 최소화할 수 있다. 반복 변수의 값을 반복문이 종료된 뒤에도 써야하는 상황이 아니라면 while문 보다 for 문을 사용하는 것이 더 낫다.
- 예시1 : 컬렉션이나 배열을 순회하는 권장 관용구
public static void main1(String[] args) {
ArrayList<String> elements = new ArrayList<>();
for (String element : elements) {
// element 를 사용한 로직
}
}
- 예시2 : while + 복붙 사용시 발생할 수 있는 문제
// 예시 2-2 : while 문 사용시 주의해야할 점 - 복사 붙여넣기
ArrayList<Element> elements = new ArrayList<>();
Iterator<Element> i = elements.iterator();
while (i.hasNext()) {
// i.next() 를 사용한 로직
}
// 만약 i 를 i2로 변경하지 않더라도 컴파일 오류가 발생하지 않지만,
// 추후 다른 문제 발생 가능성이 있다
ArrayList<Element> elements2 = new ArrayList<>();
Iterator<Element> i2 = elements2.iterator();
while (i.hasNext()) {
// i2.next() 를 사용한 로직
}
- 예시3 : for 문
ArrayList<Element> elements = new ArrayList<>();
for (Iterator<Element> i = elements.iterator(); i.hasNext();) {
Element e = i.next();
// e 와 i 를 사용한 로직
}
ArrayList<Element> elements2 = new ArrayList<>();
// 변수 이름 잘못 입력해도 컴파일 오류로 잡을 수 있다
for (Iterator<Element> i2 = elements2.iterator(); i.hasNext();) { // 컴파일 오류 발생
Element e = i2.next();
// e 와 i 를 사용한 로직
}
for문 사용의 이점
- 반복자 사용 가능
- 복사 붙여넣기 시 오류 예방 가능
- 복붙 오류를 컴파일 타임에 잡아준다
- 변수 유효 범위가 for 문 범위와 일치해 똑같은 이름의 변수를 여러 반복문에서 써도 서로 영향을 주지 않는다
- while문보다 짧아서 가독성이 좋다
3. 메서드를 작게 유지하고 한 가지 기능에 집중해라
한 메서드에서 여러 가지 기능을 처리한다면 그 중 기능과만 관련된 지역변수라도 다른 기능을 수행하는 코드에서 접근할 수 있을 것이다. 따라서 메서드를 기능별로 쪼개면 위 상황을 예방할 수 있다.
'Dev Language > EffectiveJava' 카테고리의 다른 글
[EffectiveJava] 가변인수는 신중히 사용하라 (0) | 2025.03.23 |
---|---|
[EffectiveJava] 다중정의는 신중히 사용하라 (0) | 2025.03.16 |
[EffectiveJava] 적시에 방어적 복사본을 만들라 (0) | 2025.03.09 |
[EffectiveJava] 스트림 병렬화는 주의해서 적용하라 (0) | 2025.03.03 |
[EffectiveJava] 스트림에서는 부작용 없는 함수를 사용하라 (0) | 2025.02.23 |