Effective Java : 아이템 57. 지역변수의 범위를 최소화하라.

    Effective Java : 아이템 57. 지역변수의 범위를 최소화하라.

    • 지역변수의 범위를 줄이면 가독성이 올라감.
    • 지역변수의 범위를 줄이는 방법
      • 지역변수가 가장 처음 쓰일 때 선언하기
      • 반복문 사용하기 
      • 메서드를 작게 유지하고 한 가지 기능에 집중하기
    • 모든 지역변수는 선언과 동시에 초기화 해야 함. 만약 그럴 수 없다면, 지역변수 선언을 미뤄야함을 의미함.
      • Try ~ catch에서 사용될 때는 예외임.    

     


    지역변수의 범위는?

    지역변수의 범위는 처음 지역 변수가 선언된 지점 ~ 코드 블럭이 끝나는 지점까지다. 아래 코드를 기준으로 살펴보면 지역변수 k, i의 범위는 다음과 같다

    • k : whereIs() 메서드가 끝나는 지점
    • i : for문 블록이 끝나는 지점. 
    public void whereIs() {
        int k = 0;
        List<Integer> integerList = List.of(1, 2, 3, 4, 5, 6, 7);
        for (Integer integer : integerList) {
            int i = 0;
        }
    }

     


    지역변수의 범위를 최소화하면 좋은 점. 

    지역변수의 범위를 최소화하면 전체적인 코드의 가독성이 좋아진다. 아래 코드에서 tooLong(), good() 메서드를 비교하면 알기 쉽다.

    • tooLong() 메서드에서 value는 가장 나중에 사용되지만 메서드의 시작 부분에 선언되었다. 메서드가 길어지고, 사용되는 지점이 멀어질수록 value라는 값이 무엇이었는지 기억하기 어려워진다. 
    • good() 메서드에서는 사용하기 바로 직전에 선언되었다. 상대적으로 읽기 쉽다. 
    public void tooLong() {
        int value = 0;
        int k = 10;
        int v = 10;
        int abc = 10;
        
        
        List<Integer> integerList = List.of(1, 2, 3, 4, 5, 6, 7);
    
        for (Integer i : integerList) {
            value += i;
        }
    }
    
    public void good() {
        List<Integer> integerList = List.of(1, 2, 3, 4, 5, 6, 7);
    
        int value = 0;
        for (Integer i : integerList) {
            value += i;
        }
    }

    위의 사례에서 볼 수 있듯이 지역변수의 범위를 최소화하면 코드의 전체적인 가독성이 올라가는 것을 알 수 있다. 

     


    지역변수의 범위를 줄이는 방법

    지역변수의 범위를 줄이는 방법은 두 가지 정도가 있다.

    • 가장 처음에 사용될 때 지역변수를 선언함. 
    • 반복문 사용하기
    • 가능한 메서드의 크기를 줄임. 

    첫번째 방법은 위에서 확인했다. 

    가능한 메서드의 크기를 줄이면 메서드가 하는 기능이 줄어들 것이다. 메서드가 하는 기능이 줄어들면서, 메서드에 필요한 지역변수의 갯수가 감소할 것이다. 즉, 메서드의 기능을 분리해서 지역변수 각각의 범위를 줄이는 방법이다. 그렇다면 반복문 사용하기는 어떻게 지역변수의 범위를 줄여줄까? 아래에서 좀 더 자세히 확인해보려고 한다.

     

     


    반복문 사용해서 지역변수의 범위 줄이기

    반복문 내에서 지역변수가 선언된다면 지역변수의 범위는 반복문 내로 한정된다. 아래 코드에서 for문 내부에서 'i'라는 지역변수가 선언된 것을 볼 수 있다. 그렇지만 'i'는 for문 내에서만 유효하고, for문 밖에서 이 변수를 사용하려고 하면 사용할 수 없어서 '컴파일 에러'가 발생한다. 

    public void whereIs() {
        int k = 0;
        List<Integer> integerList = List.of(1, 2, 3, 4, 5, 6, 7);
        for (Integer integer : integerList) {
            int i = 0;
        }
        // 지역변수 범위 한정됨. 컴파일 에러 발생.
        // System.out.println("i = " + i);
    }

    이처럼 반복문을 사용하는 것 자체는 지역변수의 범위를 줄이는 역할을 할 수 있다. 

     


    지역변수 초기화 시점의 예외 → try ~ catch 문

    앞서 지역변수는 선언될 때 초기화 되어야 한다고 했다. 만약 선언과 동시에 초기화 될 수 없다면, 오히려 선언을 미루는 것이 맞다고 했다. 그러나 try ~ catch문과 함께 사용되는 경우라면 다르다. 

    • 지역변수가 try() 안에서만 사용되는 경우, try 안에서 선언 + 초기화 동시에 필요
    • 지역변수가 try 밖에서도 사용되는 경우, try 밖에서 선언 + 초기화 한 후에 사용.

    아래가 적절한 예시다. 만약 i가 try 안에서만 사용된다면 try 안에서 int i = 0;을 선언 초기화 해야했다. 그러나 try문 밖에서 사용되는 코드이기 때문에 지역변수의 범위를 고려해서 try 밖에서 i를 초기화 및 선언해야한다. 

    public void tryCatchWith() {
    
        int i = 0;
        try {
            i = 0;
        } catch (Exception e) {
            System.out.println("error");
       }
        int sum = i + 1;
    }

     

    댓글

    Designed by JB FACTORY