Language/Java

Java 스코프 존재 이유

괘창 2024. 7. 1. 09:57

■ 스코프 존재 이유

예제 코드)

package scope;

public class Scope3_1 {
    public static void main(String[] args) {
        int m = 10;
        int temp = 0;
        if (m > 0) {
            temp = m * 2;
            System.out.println("temp = " + temp);
        }
        System.out.println("m = " + m);
    }
}

 

 

실행 결과)

 

# 조건이 맞으면 변수 m 의 값을 2배 증가해서 출력하는 코드로 2배 증가한 값을 저장하기 위해 temp 사용

   해당 코드는 좋은 코드라 조기 어렵다. 이유는 temp의 경우 if 조건이 만족할 때 임시로 잠깐 사용하는 변수이다.

   하지만 임시 변수 temp  는 main() 코드 블록에 선언되어 있기 떄문에 아래와 같은 문제가 발생한다.

  • 비효율적인 메모리 사용 : temp 는 if 코듭 블록에서만 필요하지만, main() 코드 블록이 종료될때 까지 메모리에 유지
    따라서 불필요한 메모리가 낭비되며, if 코드 블록 안에 temp를 선언했다면 자바를 구현하는 곳에서
    if 코드 블록의 종료 시점에 이 변수를 메모리에서 제거하여 더 효율적인 메모리를 사용할 수 있다.
  • 코드 복잡성 증가 : 좋은 코드는 군더더기 없는 단순한 코드이다.
    temp는 if 보드 블록에서만 필요하고. 해당 블록에서만 사용하면 된다.
    만약 if 코드 블록 안에 temp를 선언했다면 if가 끝나고 나면 temp를 전혀 생각하지 않아도 된다.
    하지만 위 예제 코드는 if 블록이 끝나도 main() 어디서나 temp 를 여전히 접근할 수 있다.
    누군가 위 코드를 유지보수할 때 m은 물론 temp까지 계속 신경써야하기 떄문에 스코프가 불필요하게 넓다.
    현재 코드는 단순해서 이해할 수 있지만 실무에서는 코드가 복잡한 경우가 많다.

temp 스코프가 필요한 곳에 이동한 예제)

package scope;

public class Scope3_2 {
    public static void main(String[] args) {
        int m = 10;
        if (m > 0) {
            int temp = m * 2;
            System.out.println("temp = " + temp);
        }
        System.out.println("m = " + m);
    }
}

 

 

실행 결과)

# temp 를 if 코드 블록 안에 선언하여 temp는 if 코드 블록 안으로 스코프가 줄어든다.
   덕분에 temp는 메모리를 빨리 제거하여 효율적으로 메모리 사용이 가능하며, temp 변수를 생각해야 하는 범위르 줄여
   보다 유지보수 하기 좋은 코드로 만들었다.


■ while문 vs for문 - 스코프 관점

 

while 예시)

package scope;

public class ScopeWhile {
    public static void main(String[] args) {
        int sum = 0;
        int i = 1;
        int endNum = 3;

        while (i <= endNum) {
            sum = sum + i;
            System.out.println("i = " + i + " sum = " + sum);
            i++;
        }
    }
}

 

 

 

 For 예시)

package scope;

public class ScopeFor {
    public static void main(String[] args) {
        int sum = 0;
        int endNum = 3;

        for (int i = 1; i <= endNum; i++) {
            sum = sum + i;
            System.out.println("i = " + i + " sum = " + sum);
        }
    }
}

 

# 변수 스코프 관점에서 카운터 변수 i 비교

  • while 문의 경우 변수 i 의 스코프가 main( ) 메소드 전체가 된다.
    반면 for 문의 경우 변수 i 스코프가 for 문 안으로 한정되어 있다.
  • 이에 따라 변수 i 와 같이 for 문 안에서만 사용되는 카운터 변수가 있다면 while문 보다는 for문을 사용해서
    스코프의 범위를 제한하는 것이 메모리 사용과 유지보수 관점에 더 좋다.

 

※ 정리

  • 변수는 꼭 필요한 범위로 한정해서 사용하는 것이 좋다.
    변수의 스코프는 꼭 필요한 곳으로 한정해서 아용하자!
    메모리를 효율적으로 사용하고 더 유지보수하기 좋은 코드를 만들 수 있다.

  • 좋은 프로그램은 무한한 자유가 있는 프로그램이 아닌 적절한 제약이 있는 프로그램이다.