자바에서는 주로 다음과 같은 범위로 구분됩니다:
클래스 범위 (Class Scope)
인스턴스/멤버 범위 (Instance/Field Scope)
메소드 범위 (Method Scope)
블록 범위 (Block Scope)
매개변수 범위 (Parameter Scope)
클래스 내에서 선언된 **필드(멤버 변수)**는 클래스 전체에서 접근할 수 있습니다. 접근 제한자(private, public 등)에 따라 외부 접근 가능 여부는 달라지지만, 클래스 내부에서는 어디서든 사용 가능합니다.
public class Person {
String name; // 필드, 클래스 범위
void sayHello() {
System.out.println("안녕하세요, " + name);
}
}
메소드 내에서 선언된 지역 변수는 해당 메소드 내에서만 유효합니다. 메소드가 종료되면 메모리에서 사라집니다.
public class Example {
void doSomething() {
int number = 10; // 메소드 범위
System.out.println(number);
}
void anotherMethod() {
// System.out.println(number); // 오류: number는 이 메소드에 없음
}
}
제어문(if, for, while 등)이나 { } 중괄호로 묶인 블록 내에서 선언된 변수는 해당 블록 내에서만 유효합니다.
void testBlock() {
if (true) {
int x = 5; // x는 if 블록 내부에서만 유효
System.out.println(x);
}
// System.out.println(x); // 오류: x는 이 블록 밖에서 접근 불가
}
메소드의 매개변수는 해당 메소드 블록 내에서만 사용 가능합니다.
void greet(String name) {
System.out.println("Hello, " + name); // name은 여기서만 유효
}
같은 이름의 변수를 중첩된 범위 안에서 다시 선언할 수는 없습니다. 하지만 내부 범위에서 같은 이름의 변수가 있으면 외부 범위의 변수는 가려짐(Shadowing)
int x = 100;
void printX() {
int x = 50; // 외부 x를 가림
System.out.println(x); // 50 출력
}
변수는 선언된 범위 밖에서 사용할 수 없다
같은 범위 내에서 동일한 이름의 변수를 중복 선언할 수 없다
메모리 사용 최적화를 위해 가능한 한 좁은 범위에서 선언하는 것이 좋다
중괄호 {} 기준으로 범위가 결정되므로 코드 작성 시 중괄호 구조에 유의해야 한다
범위 종류 |
선언 위치 |
유효 범위 |
예시 변수 종류 |
---|---|---|---|
클래스 범위 |
클래스 내부 |
클래스 전체 |
static 필드, static 메소드 |
인스턴스 범위 |
클래스 내부, static 아님 |
클래스 전체 |
멤버 변수 |
메소드 범위 |
메소드 내부 |
메소드 전체 |
지역 변수 |
블록 범위 |
제어문/블록 내부 |
해당 블록 내부 |
if/for/while 변수 등 |
매개변수 범위 |
메소드의 괄호 안 |
메소드 내부 |
메소드 매개변수 |