지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다.
오늘은 그럼 지역변수의 범위를 줄이는 방법에 대해 알아보자.
1. 처음 쓰일 때 선언하기
- 미리 선언해두면 변수를 실제로 사용하는 시점에 타입과 초깃값이 기억이 나지 않을 수 있다.
- 지역변수의 범위는 선언된 지점부터 그 지점을 포함한 블록이 끝날 때까지 이므로, 실제 사용하는 블록 바깥에 선언된 변수는 그 블록이 끝난 뒤까지 살아 있게 된다.
2. 선언과 동시에 초기화하기
- 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미루기.
✅ 예외 : try-catch
변수를 초기화 하는 표현식에서 검사 예외를 던질 가능성이 있다면 try 블록 안에서 초기화하기.
(그렇지 않으면 예외가 블록을 넘어 메서드에까지 전파)
변수 값을 try 블록 바깥에서도 사용해야한다면?
➡️ try 블록 앞에서 선언하기
3. while 문 보다는 for (for-each) 문을 사용하기
- 반복문에서는 반복 변수의 범위가 반복문의 몸체, for 키워드와 몸체 사이의 괄호 안으로 제한되기에 반복 변수의 값을 반복문이 종료된 뒤에도 써야 하는 상황이 아니라면 while 문 보다는 for 문을 쓰는 편이 낫다.
while 문 보다 for 문이 더 나은 이유 : while 문의 문제점
Iterator<Element> i = c.iterator();
while (i.hasNext()) {
doSomething(i.next());
}
...
Iterator<Element> i2 = c2.iterator();
while (i.hasNext()) { // ✅ 버그!!
doSomethingElse(i2.next());
}
➡️ 복사 붙여넣기의 실수를 보여주고있다. 두번째 while 문에 새로운 반복 변수 i2 를 초기화 했지만, 실수로 이전 while 문에서 쓴 i 를 다시 썻다!
i 의 유효 범위는 아직 끝나지 않았으므로 이 코드는 컴파일도 잘 되고 실행 시 예외도 던지지 않게 되었다. 또한, 두번째 while 문은 c 를 순회하지 않고 곧장 끝나 버려 c2 가 비었다고 착각하게 만든다!
for 문을 사용하면 이러한 복사 붙여넣기 오류를 컴파일 타임에 잡아준다.
while 문 보다 for 문이 더 나은 이유 : for 문의 좋은점1
for (Iterator<Element> i = c.iterator(); i.hasNext();) {
Element e = i.next();
... // e와 i로 무언가를 한다.
}
...
// 다음 코드는 "i를 찾을 수 없다"논 컴파일 오류를 낸다.
for (Iterator<Element> i2 = c2.iterator(); i.hasNext(); ) {
Element e2 = i2•next();
... // e2와 i2로 무언가률 한다.
}
➡️ 변수 유효 범위가 for 문 범위와 일치하여 똑같은 이름의 변수를 여러 반복문에서 써도 서로 아무런 영향을 주지 않는다.
while 문 보다 for 문이 더 나은 이유 : for 문의 좋은점2
for (int i = 0, n = expensiveComputation(); i < n; i++) {
... // i로 무언가를 한다.
}
➡️ 반복 여부를 결정짓는 변수 i의 한계값을 변수 n 에 저장하여, 반복 때마다 다시 계산해야 하는 비용을 없앴다.
4. 메서드를 작게 유지하고 한가지 기능에 집중하기.
한 메서드에서 여러 가지 기능을 처리한다면 그 중 한 기능과 관련된 지역변수라도 다른 기능을 수행하는 코드에서 접근할 수 있다. 이 해결책으로는 메서드를 기능별로 쪼개면 된다.
✅ 결론
지역변수의 범위를 최소화할때는 사용할때 선언하며, 선언하는 즉시 초기화를 시켜라.
또한, 반복변수가 사용될 때는 while 문보다 for 문을 사용하여 복사 붙여넣기의 실수를 줄여라.
참고
도서 - Effective Java Item57
'Java > Effective Java' 카테고리의 다른 글
Item61. 박싱된 기본 타입보다는 기본 타입을 사용하라. (0) | 2022.07.03 |
---|---|
Item47. 반환 타입으로는 스트림보다 컬랙션이 낫다. (0) | 2022.06.29 |
댓글