티스토리 뷰
지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다.
🔍 지역변수의 범위를 줄이는 방법? - 4가지!
'미리 선언하지 말고, 가장 처음 쓰일 때 선언 하기'
- 사용하려면 멀었는데, 미리 선언부터 해두었다면?
- 코드가 어수선해져 가독성이 떨어진다.
- 변수를 실제로 사용하는 시점엔 타입과 초깃값이 기억나지 않을 수도 있다.
- 다 쓴 뒤에도 여전히 살아있게 되기 쉽다. (지역변수의 범위는 선언된 지점부터 그 지점을 포함한 블록이 끝날 때까지이므로)
'거의 모든 지역변수는 선언과 동시에 초기화해야 한다.'
초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다.
- 예외상황으로 try-catch문이 있다.
- 변수를 초기화하는 표현식에서 검사 예외를 던질 가능성이 있다면 try 블록 안에서 초기화해야 한다.
- 그렇지 않으면 예외가 블록을 넘어 메서드에까지 전파된다.
- 변수 값을 try 블록 바깥에서도 사용해야 한다면 try블록 앞에서 선언해야 한다.
'반복문을 사용할 때는 while문보다 for문을 사용한다.'
- 반복문에서는 반복 변수의 범위가 반복문의 몸체, 그리고 for 키워드와 몸체 사이의 괄호 안으로 제한된다.
- 따라서 반복 변수의 값을 반복문이 종료된 뒤에도 써야 하는 상황이 아니라면 while문보다 for문을 쓰는 편이 낫다.
반복자를 사용해야 하는 상황이면 for-each문 대신 전통적인 for문을 쓰는 것이 낫다.
for (Element e : c) {
... // e로 무언가를 한다.}
while문의 오류를 보여주기 위해 다음과 같은 예시를 들 수 있다.
Iterator<Element> i = c.iterator();
while (i.hasNext()) {
dosSomething(i.next());
}
...
Iterator<Element> i2 = c2.iterator();
while (i.hasNext()) { //<- i를 다시 씀
doSomethingElse(i2.next());
}
위와 같은 코드에서는 실수로 새로운 반복 변수 i2를 초기화했지만, while문에서 쓴 i를 다시 썼다.
불행히도 i의 유효 범위는 아직 끝나지 않았으므로, 컴파일도 잘 되고 실행 시 예외도 던지지 않지만 c2를 순회하지 않고 끝나버려 c2가 비었다고 착각하게 만든다.
프로그램 오류가 겉으로 드러나지 않으니 오랜 기간 발견되지 않을 수 있다.
다음과 같은 오류는 for문(for-each 포함)을 사용하면 첫 번째 반복문이 사용한 원소와 반복자의 유효 범위가 반복문 종료와 함께 끝나기 때문에 해결할 수 있다.
for (Iterator<Element> i = c.iterator(); i.hasNext(); ){
Element e2 = i.next();
... // e와 i로 무언가를 한다.
}
...
// 다음 코드는 "i를 찾을 수 없다"는 컴파일 오류를 낸다.
for (Iterator<Element> i2 = c2.iterator(); i.hasNext(); ){
Element e2 = i2.next();
... // e와 i로 무언가를 한다.
}
또한 for문은 변수 유효 범위가 for문 범위와 일치하여 똑같은 이름의 변수를 여러 반복문에서 써도 서로 아무런 영향을 주지 않는다.
거기에 더해서 for문은 while문보다 짧아서 가독성 또한 좋다.
for (int i=0, n=expensiveComputation(); i<n ; i++){
... // i로 무언가를 한다.
}
- - 반복 여부를 결정짓는 변수 i의 한계값을 변수 n에 저장하여, 반복 때마다 다시 계산해야 하는 비용을 없앴다.
'메서드를 작게 유지하고 한 가지 기능에 집중하는 것'
- 한 메서드에서 여러 가지 기능을 처리한다면 그중 한 기능과만 관련된 지역변수라도 다른 기능을 수행하는 코드에서 접근할 수 있을 것이다.
- 단순히 메서드를 기능별로 쪼개라.
📃 정리
즉, 지역변수의 유효 범위를 최소로 줄이기 위해선 다음과 같은 4가지 방법이 있다.
- 미리 선언하지 말고, 가장 처음 쓰일 때 선언해라.
- 선언과 동시에 초기화해라.
- while문 대신 for문을 사용해라.
- 메서드를 작게 유지하고 한 가지 기능에 집중해라.
728x90
'Programming > Effective Java' 카테고리의 다른 글
[이펙티브자바] Item 60. 정확한 답이 필요하다면 float와 double은 피하라 (0) | 2022.07.20 |
---|---|
[이펙티브자바] Item59. 라이브러리를 익히고 사용하라 (2) | 2022.07.20 |
[이펙티브자바] Item 58. 전통적인 for문 보다는 for-each문을 사용하라 (1) | 2022.07.19 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- docker-compose
- 알고리즘
- Retrofit2
- 토큰기반인증
- dfs
- 운영체제
- springboot
- 순열
- 그래프탐색
- BFS
- DevOps
- IMAGE
- dp
- 완탐
- 백준
- bruteforce
- OS
- cicd
- docker
- BOJ
- 아이템61
- 아이템59
- 조합
- 이펙티브자바
- EffectiveJava
- subset
- Java
- 완전탐색
- 아이템60
- Container
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
250x250