카테고리:

업데이트:

1. 들어가기

역사가 깊은 프로그래밍 언어 중에는 지역변수를 코드 블록의 첫머리에 선언하는 경우가 많습니다.

그렇기 때문에 이 방식을 여전히 습관처럼 따르는 프로그래머도 있습니다.

하지만 이런 경우, 정상적으로 작동되나 유지보수 측면에서 좋지 않습니다.

한번 자세히 알아보도록 하겠습니다.

2. 지역변수를 미리 선언하는 경우의 문제점

지역변수를 사용 시점이 아닌 미리 선언하게 되는 경우 문제점은 다음과 같습니다.

  1. 코드가 어수선해져 가독성이 떨어질 수 있다.

    변수를 미리 선언했는데 실제로 사용하려던 곳이 100줄 아래라고 생각하면

    실제 사용하는 시점엔 변수의 타입과 초기값이 기억나지 않을 수도 있습니다.


  2. 변수의 잘못된 사용으로 끔찍한 결과로 이어질 수 있다.

    지역변수의 범위는 선언된 지점부터 그 지점을 포함한 블록이 끝날 때까지인데

    의도한 범위 앞 또는 뒤에서 실수로 그 변수를 사용하면 끔찍한 결과로 이어질 수 있습니다.

3. 반복문의 변수 범위 차이

반복문을 사용할 때는 while 문보다 for 문이 더 나을 수 있습니다.

예시를 통해 while 문은 for 문에 비해 어떤 문제가 있는지 알아보겠습니다.

/* while 문 */
   Iterator<Element> i = c.iterator();
   while (i.hasNext()) {
      doSomething(i.next());
   }

   Iterator<Element> i2 = c2.iterator();
   while (i.hasNext()) {         // 버그!
      doSomething(i2.next());
   }

해당 코드는 컴파일도 잘 되고 실행 시 예외도 던지지 않습니다.

하지만 두 번째 while 문은 c2가 비었다고 착각하게 만드는 오류가 있습니다.

하지만 for 문을 사용하면 위와 같은 문제를 조기에 발견할 수 있습니다.

/* for 문 */
   for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {
      Element e = i.next();
      ...
   }

   for (Iterator<Element> i2 = c2.iterator(); i.hasNext(); ) {    // 컴파일 오류
      Element e = i2.next();
      ...
   }

for 문의 변수 유효 범위는 for 문 범위와 일치하기 때문에 두 번째 for 문에서는 컴파일 오류가 발생합니다.

추가로 for 문은 다음과 같이 두 지역변수의 범위를 동일하게 만들 수도 있습니다.

   for (int i = 0, n = expensiveComputation(); i < n; i++) {
      ...
   }

해당 코드는 변수 i의 한계값을 변수 n에 저장해 반복 때마다 다시 계산해야 하는 비용을 없앤 예로

같은 값을 반환하는 메서드를 매번 호출한다면 해당 관용구를 사용하면 깔끔하게 해결할 수 있습니다.

4. 정리

이번 포스트는 지역변수의 범위에 따른 문제점에 대해 알아보았습니다.

최대한 지역변수는 선언과 동시에 초기화하여 문제점을 조기에 차단하고,

메서드를 기능별로 쪼개어 최대한 관련 지역변수만을 사용하도록 해봅시다.

            
              📕 개인 기록용 블로그입니다.
              😊 오타나 잘못된 정보가 있을 경우 댓글이나 메일로 말씀해주시면 바로 수정하겠습니다! 😊
          

댓글남기기