본문 바로가기
Java/Effective Java

Item57. 지역변수의 범위를 최소화하라.

by 쁘니쁘나 2022. 7. 3.

 

지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다.

 

오늘은 그럼 지역변수의 범위를 줄이는 방법에 대해 알아보자.

 

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

댓글