JAVA/Effective Java

[아이템 57] 지역변수의 범위를 최소화하라

꾸준함. 2024. 3. 16. 01:27

이번 아이템은 아이템 15에서 다루었던 `클래스의 멤버와 접근권한을 최소화하라`와 취지가 비슷합니다.

지역 변수의 범위를 최소화하면 코드의 가독성이 높아지고 유지보수가 쉬워지며 오류 발생 가능성이 낮아집니다.

 

지역변수는 가장 처음 쓰일 때 선언하자

  • 지역 변수가 초기화된 지점과 사용되는 지점이 멀어질수록 코드의 가독성이 떨어지고 혼란스러워짐.
    • 막상 쓰일 시점에 돼서는 해당 지역변수가 무슨 타입이었는지, 무슨 값으로 초기화했는지 기억이 나지 않을 가능성이 높음

 

  • 지역변수를 생각 없이 선언하다 보면 변수가 쓰이는 범위보다 너무 앞서 선언하거나, 다 쓴 후에도 메모리 회수가 되지 않고 여전히 살아있을 확률이 높음
    • 지역변수의 범위는 선언된 지점부터 그 지점이 포함한 블록이 끝날 때까지 유효
    • 실수로 의도한 범위 앞 혹은 뒤에서 해당 변수를 사용할 경우 끔찍한 결과를 초래할 수 있음

 

지역변수는 선언과 동시에 초기화하자

  • 초기화에 필요한 정보가 충분하지 않을 경우 정보가 충분할 때까지 선언을 미루는 것을 권장
    • try-catch-finally 구문에서는 예외

 

  • 변수를 초기화하는 표현식에서 checked exception을 던질 가능성이 있다면 try 블록 내에서 초기화해야 함
    • 그렇지 않을 경우 예외가 블록을 넘어 메서드에까지 전파됨

 

try 블록 안에 작성하지 않아 main 메서드까지 예외가 전파

 

try 블록 내 지역변수를 선언하면 예외 전파 X

 

  • 반복문은 독특한 방식으로 변수 범위를 최소화
    • 반복문에서는 반복 변수의 범위가 반복문의 몸체, 그리고 for 키워드와 몸체 사이의 괄호 안으로 제한
    • 따라서 반복 변수의 값을 반복문이 종료된 뒤에도 써야하는 케이스가 아니라면 while문보다는 for문 사용하는 것을 권장

 

 

 

for문이 while문보다 나은 이유

  • 반복 변수가 여러개일 경우 실수로 이전 while문에서 쓰인 반복 변수를 사용할 수 있음 (휴먼 에러 발생 가능성)
    • 컴파일 시점에는 에러를 파악하기 쉽지 않고 런타임에서 실수를 발견할 확률이 높음
    • for문을 포함한 for-each문을 사용하는 경우에는 반복자의 유효범위가 for문의 종료와 함께 끝나기 때문에 이러한 문제를 컴파일 타임에 잡아줌

 

 

 

 

메서드를 작게 유지하고 한 가지 기능에 집중하자

  • 한 메서드 내에서 여러가지 기능을 처리할 경우 그중 한 기능과 관련된 지역변수라도 다른 기능을 수행하는 코드에서 접근 가능
  • 따라서 기능별로 메서드를 쪼개면 위와 같은 상황을 모면할 수 있음

 

참고

이펙티브 자바

반응형