이펙티브 자바, 쉽게 정리하기 - item 57. 지역변수의 범위를 최소화하라
지역변수의 범위는 최소한으로
item 15.
에서 "클래스와 멤버의 접근 권한을 최소화하라"고 했던 것과 비슷한 내용이다.- 변수는 항상 유효범위를 최소한으로 두고 필요할 때 늘리는 방식으로 활용하자.
지역변수의 범위를 줄이는 테크닉
이 테크닉에 대해서는 동의하는 부분도 있는데, 개인적으로는 변수를 한 곳에 몰아두는 것이 관리하기 훨씬 편하다고 생각한다.
메서드의 시작 부분에 한번에 초기화하여 일목요연하게 보기 좋게 만드는 것이 최선이라 생각한다.
- 항상 지역변수가 처음 쓰일 때 선언하자.
- 미리 선언해두면 코드 가독성이 떨어지고 어수선해진다.
- 쓰이지 않는 변수가 살아있을 위험도 있다.
- 선언과 동시에 초기화하자.
- 초기화에 필요한 정보가 충분치 않아서 초기화하지 못한다면, 정보가 충분해질 때까지 선언을 미루자.
- 단
try-catch
의 경우에는try
블록 안의 변수를 밖에서 쓸 확률이 높으니 예외이다.
- 메서드를 작게 유지하고 한가지 기능에 집중하자
- 단순히 메서드를 기능별로 쪼개는 것으로 가능하다.
반복문에서 반복자가 필요 없을 때
반복자란,
index
혹은Iterator
와 같은 용도로 쓰이는i
를 말한다.
- 반복자가 필요 없을 때는
for-each
가 가장 나은 선택이다. - 반복되는 요소를 최대한 해당 블록에서만 접근 가능하도록 만들자
for (Element e : c) {
// TODO: SOMETHING
}
반복문에서 반복자가 필요할 때
- 바깥의 스코프를 끌어쓸 수 있는
while
보다는for
를 쓰는 것이 더 좋다.
for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {
Element e = i.next();
... // 반복자가 필요했기 때문에 e와 i를 함께 써 무언가를 하는 내용이 있을 것이다.
}
반복자로 while
을 쓰면 아래와 같은 실수를 만들 수 있다.
Iterator<Element> i = c.iterator();
while(i.hasNext()) {
doSomething(i.next());
}
// ...
Iterator<Element> i2 = c2.iterator();
while(i.hasNext()) { // 버그
doSomethingElse(i2.next());
}
- 실수로 새로 초기화한
i2
를 사용하지 않고 그냥i
를 써버렸다.
반복자로 for
을 쓰면 위와 같은 실수를 할 일이 없다.
for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {
Element e = i.next();
// e와 i로 무언가 한다...
}
for (Iterator<Element> i2 = c2.iterator(); i.hasNext(); ) {
Element e2 = i2.next();
// e와 i로 무언가 한다...
}
- 아래의
for
문에서 에러가 뜰 것이다.- 위쪽
for
문의i
는 스코프가 만료되어 더이상 존재하지 않기 때문이다.
- 위쪽
for
문의 지역변수 초기화 응용하기
for (int i = 0, n = expensiveComputation(); i < n; i++) {
// do something...
}
- 지역변수 초기화는 단 한번만 실행하기 때문에 비교해야 할 값비싼 비교값이 있다면, 초기화할 때 위와 같은 양식으로 같이 초기화 해줌으로써 많은 비용을 절약할 수 있다.
반응형
'Java > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바, 쉽게 정리하기 - item 59. 라이브러리를 익히고 사용하라 (0) | 2023.06.22 |
---|---|
이펙티브 자바, 쉽게 정리하기 - item 58. 전통적인 for 문보다는 for-each 문을 사용하라 (0) | 2023.06.22 |
이펙티브 자바, 쉽게 정리하기 - item 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라 (0) | 2023.06.21 |
이펙티브 자바, 쉽게 정리하기 - item 55. 옵셔널 반환은 신중히 하라 (0) | 2023.06.20 |
이펙티브 자바, 쉽게 정리하기 - item 54. null 이 아닌, 빈 컬렉션이나 빈 배열을 반환하라 (0) | 2023.06.10 |