티스토리 뷰

(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로 무언가를 한다.
    }
  • 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문보다 짧아서 가독성이 좋다는 점
  • 지역변수의 범위최소화하는 또 다른 반복문 관용구 (범위가 정확히 일치하는 두 반복 변수 in을 주목)
    for (int i = 0, n = expensiveComputation(); i < n; i++) {
        ... // i로 무언가를 한다.
    }
    • 반복 여부를 결정짓는 변수 i의 한곗값을 변수 n에 저장하여, 반복 때마다 다시 계산해야 하는 부분을 없앰
    • 같은 값을 반환하는 메서드를 매번 호출한다면 사용하길 바람

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

  • 한 메서드에서 여러 가지 기능을 처리한다면 그 중 한 기능만과 관련된 지역변수라도 다른 기능을 수행하는 코드에서 접근 가능
  • 단순히 메서드를 기능별로 쪼개면 됨

 

결론


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

 


끝으로

이 글이 도움이 되었다면, 하단의 Google 광고 👎👎👎 한번씩 클릭 부탁 드립니다. 🙏🙏🙏

광고 클릭은 많은 힘이 됩니다! 

반응형
댓글