기본적인 개념이지만 리마인드 느낌으로 정리해본다.

자바에서 Scope(스코프)는 변수나 메소드, 클래스가 어디서부터 어디까지 접근 가능한지를 정의하는 범위를 의미한다.

스코프는 코드의 가독성을 높이고, 변수의 중복 선언을 방지하며, 메모리 관리를 효율적으로 수행할 수 있게 해준다.

자바에서는 크게 클래스 스코프, 메소드 스코프, 블록 스코프의 세 가지로 나눌 수 있다.

 

1. 클래스 스코프 (Class Scope)

클래스 스코프는 클래스 전체에서 접근할 수 있는 변수나 메소드의 범위를 의미한다.

클래스 변수(Static 변수)와 인스턴스 변수(Non-static 변수)가 클래스 스코프에 속한다.

클래스 스코프에 속한 변수들은 클래스 내의 모든 메소드에서 접근할 수 있다.

public class Car {
    // 클래스 스코프
    private String model; // 인스턴스 변수
    private static int numberOfCars = 0; // 클래스 변수

    public Car(String model) {
        this.model = model;
        numberOfCars++; // 클래스 변수에 접근 가능
    }

    public String getModel() {
        return model; // 인스턴스 변수에 접근 가능
    }

    public static int getNumberOfCars() {
        return numberOfCars; // 클래스 변수에 접근 가능
    }
}

위 예시에서 model은 인스턴스 변수로, 각 Car 객체마다 별도로 존재하며, 클래스 내 모든 메소드에서 접근할 수 있다.

numberOfCars는 클래스 변수로, 모든 Car 객체가 공유하는 변수다.

 

2. 메소드 스코프 (Method Scope)

메소드 스코프는 메소드 내에서 선언된 변수들이 가지는 범위를 의미한다.

이 변수들은 메소드가 종료될 때 소멸된다. 즉, 메소드 내부에서만 접근 가능하며, 메소드가 호출될 때마다 새롭게 생성된다.

public class Calculator {
    public int add(int a, int b) {
        // 메소드 스코프
        int sum = a + b;
        return sum;
    }

    public void multiply(int a, int b) {
        // 메소드 스코프
        int product = a * b;
        System.out.println(product);
    }
}

위 예시에서 sum과 product는 각각 add와 multiply 메소드 내에서 선언된 로컬 변수로, 이 변수들은 해당 메소드 내에서만 접근 가능하고 메소드가 끝나면 사라진다.

즉, 결과를 print 및 return 후 다시 메소드를 호출하기 전까지 소멸된다.

 

3. 블록 스코프 (Block Scope)

블록 스코프는 중괄호 {}로 묶인 코드 블록 내에서 선언된 변수들이 가지는 범위를 의미한다.

이 변수들은 해당 블록 내에서만 유효하며, 블록을 벗어나면 소멸된다.

public class ScopeExample {
    public void checkScope() {
        // 메소드 스코프
        int x = 10;
        
        if (x > 5) {
            // 블록 스코프
            int y = x + 5;
            System.out.println("y: " + y);
        }

        // y는 이 블록 바깥에서는 접근 불가
        // System.out.println(y); // 오류 발생
    }
}

위 예시에서 y 변수는 if 블록 내부에서 선언되었기 때문에, 해당 블록 내에서만 접근할 수 있다. if 블록을 벗어난 곳에서 y를 사용하려 하면 컴파일 오류가 발생한다.

 

결론

변수는 꼭 필요한 범위로 한정해서 사용하는 것이 좋다. 변수의 스코프는 꼭 필요한 곳으로 한정해 사용하여 가독성이 좋고 유지보수가 용이한 코드로 만들자.

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

반응형