티스토리 뷰
(Effective Java) 규칙57. 지역변수의 범위를 최소화하라
지역변수의 범위를 최소화
- 지역변수의 유효범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다.
지역변수의 범위를 줄이는 방법
1. 가장 처음 쓰일 때 선언하기
- 미리 선언부터 해두면 코드가 어수선해져 가독성이 떨어짐
- 변수를 실제로 사용하는 시점엔 타입과 초기값이 기억나지 않을 수도 있음
- 그렇지 않으면 지역변수가 쓰이는 범위 보다 너무 앞서 선언하거나, 다 쓴 뒤에도 여전히 살아 있게 되기 쉬움
2. 거의 모든 지역변수는 선언과 동시에 초기화하기
- 만약 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 함
- 단,
try-catch
문은 예외임 변수를 초기화하는 표현식에서 검사 예외를 던질 가능성이 있다면 try 블록안에서 초기화 해야 함- 한편 변수값을
try
블록 바깥에서도 사용해야 한다면,try
블록 앞에서 선언해야 함
- 한편 변수값을
3. 되도록 for문보다는 while문을 쓰자
- 반복문 사용시 반복 변수의 값을 반복문이 종료된 뒤에도 써야 하는 상황이 아니라면
whlie
문 보다for
문을 사용하는 편이 낫다.- 반복문은 반복 변수(loop variable)의 범위가, 반복문의 몸체, 그리고
for
키워드와 몸체 사이의 괄호 안으로 제한됨 - 컬렉션을 순회할 떄 권장하는 관용구임
for (Element e : c) { ...//e로 무언가를 한다. }
- 반복자를 사용해야 하는 상황이면 (반복자의
remove
메서드를 써야 한다든가)for-each
문 대신 전통적인for
문을 쓰는 것이 나음
for (Iterator<Element> i = c.iterator(); i.hasNext();) { Element e = i.next(); ... // e와 i로 무언가를 한다. }
- 반복문은 반복 변수(loop variable)의 범위가, 반복문의 몸체, 그리고
while
문의 오류의 소지Iterator<Element> i = c.iterator(); while (i.hasNext()) { doSomething(i.next()); } ... Iterator<Element> i2 = c2.iterator(); while (i.hasNext()) { //버그! doSomething(i2.next()); }
- 두 번째
while
문에서는 이전while
문을 복사해서 쓰다가 이전에 사용한i
를 다시 사용하고 말아 문제가 생김 i
의 유효 범위는 아직 끝나지 않았으므로, 코드는 컴파일이 되고 실행되 되지만 두 번째while
은 순회하 지 않을 것임
- 두 번째
for
문 사용을 통한 해결- (
for-each
를 포함한)for
문을 사용하면 이런 복사 붙여넣기 오류를 컴파일 타임에 잡아줌- 반복문이 사용한 원소와 반복자의 유효범위가 반복문 종료와 함께 끝나기 때문
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로 무언가를 한다. }
- 똑같은 이름의 변수를 여러 반복문에서 써도 서로 아무런 영향을 주지 않음
while
문보다 짧아서 가독성이 좋다는 점
- (
- 지역변수의 범위최소화하는 또 다른 반복문 관용구 (범위가 정확히 일치하는 두 반복 변수
i
와n
을 주목)for (int i = 0, n = expensiveComputation(); i < n; i++) { ... // i로 무언가를 한다. }
- 반복 여부를 결정짓는 변수
i
의 한곗값을 변수n
에 저장하여, 반복 때마다 다시 계산해야 하는 부분을 없앰 - 같은 값을 반환하는 메서드를 매번 호출한다면 사용하길 바람
- 반복 여부를 결정짓는 변수
4. 메서드를 작게 유지하고 한 가지 기능에 집중하자
- 한 메서드에서 여러 가지 기능을 처리한다면 그 중 한 기능만과 관련된 지역변수라도 다른 기능을 수행하는 코드에서 접근 가능
- 단순히 메서드를 기능별로 쪼개면 됨
결론
지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다.
끝으로
이 글이 도움이 되었다면, 하단의 Google 광고 👎👎👎 한번씩 클릭 부탁 드립니다. 🙏🙏🙏
광고 클릭은 많은 힘이 됩니다!
반응형
'프로그래밍 > EffectiveJava' 카테고리의 다른 글
(이펙티브 자바) 규칙 60. 정확한 답이 필요하다면 float과 double은 피하라 (0) | 2020.03.02 |
---|---|
(이펙티브 자바) 규칙58. 전통적인 for 문보다는 for-each 문을 사용하라 (0) | 2020.02.29 |
(이펙티브 자바) 규칙16. public 클래스에서는 public필드가 아닌 접근자 메서드를 사용하라 (0) | 2020.02.26 |
(이펙티브 자바) 규칙12. toString을 항상 재정의하라 (0) | 2020.02.25 |
(이펙티브 자바) 규칙7. 다 쓴 객체 참조를 해제하라 (0) | 2020.02.24 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 방통대 과제물
- windows
- 배낭여행
- git
- 자바
- 자전거
- springboot
- 배낭 여행
- 일본여행
- JavaFX
- 텐트
- 이펙티브 자바
- 스프링부트
- 일본 자전거 여행
- TableView
- JavaFX 종료
- intelij
- JavaFX 테이블뷰
- effectivejava
- 이펙티브
- java
- effective java
- Java UI
- 인텔리제이
- JavaFX Window Close
- JavaFX Table View
- 일본 여행
- 이펙티브자바
- 일본 배낭여행
- 자전거 여행
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함