스코프(Scope)
✒️ 2025-05-23 13:47 내용 수정
변수와 메서드의 생명주기와 접근 권한을 정의하는 개념
- 스코프를 통해 변수나 메서드의 유효 범위를 지정할 수 있어 이를 통해 코드의 구조와 논리적 흐름을 제어할 수 있다.
- Java에서 변수의 스코프는 컴파일 때 결정된다.
1. 클래스 스코프(Class Scope)
- 클래스 내에 선언될 때의 스코프이며, 클래스의 메서드들 외부에 선언된다.
- 클래스의 모든 인스턴스에서 공통적으로 사용되는 변수와 메서드를 포함한다.
public class Test {
// 클래스 스코프 필드
private int number;
String name;
public void print() {}
}
인스턴스 변수(Instance Variable)
- 클래스의 어느 위치에서든 접근할 수 있으며, 접근자에 따라 클래스 외부에서도 접근할 수 있다.
- 클래스의 인스턴스를 생성할 때 메모리에 할당(Heap 영역)되며, 인스턴스들은 각각의 인스턴스 변수를 가진다.
- 메모리 구조 참고.
public class Test {
// 인스턴스 변수
private int number;
public Test() {
number = 10;
}
public void print(int number) {
this.number = number;
System.out.println("number: " + number);
}
}
public class Main {
public static void main(String[] args) {
Test test = new Test();
test.print(100);
Test test2 = new Test();
test2.print(500);
}
}
print()에서number를 받아 인스턴스 변수에 저장하고 비교하면 각 인스턴스들의number멤버 값이 다르게 나온다.
number: 100
number: 500
정적 변수(Static Variable)
- 클래스를 로드할 때 메모리에 할당(Method 영역)된다.
- 클래스의 모든 인스턴스들이 공유하는 변수다.
- static 제어자 참고.
public class Test {
private int number;
static String name = "test";
public Test() {
number = 10;
}
public void print(int number) {
this.number = number;
System.out.println("number: " + number);
}
public void setName(String name) {
this.name = name;
}
public void getName() {
System.out.println("name: " + name);
}
}
public class Main {
public static void main(String[] args) {
Test test = new Test();
Test test2 = new Test();
// test에서 static 변수 변경
test.setName("Kim");
test.getName();
test2.getName();
// test2에서 static 변수 변경
test2.setName("Elsa");
test.getName();
test2.getName();
}
}
test에서name을 변경했을 때 두 인스턴스의getName()의 결과가 동일하고, 마찬가지로test2에서name을 변경했을 때도 두 인스턴스의getName()의 결과가 동일하다.
name: Kim
name: Kim
--------
name: Elsa
name: Elsa
2. 메서드 스코프(Method Scope)
- 메서드 내에서 선언될 때의 스코프다.
- 지역 변수에 해당하며, 메서드 내부에서만 접근할 수 있고 메서드 외부에선 접근할 수 없다.
- 메서드의 실행이 끝나면 해당 변수는 소멸된다.
public class Test {
public void print() {
int number = 10;
System.out.println("number: " + number);
}
// 메서드 외부에서 접근 불가
// System.out.println("number: " + number); - 에러
}
3. 파라미터 스코프(Parameter Scope)
- 메서드 스코프의 또 다른 예로 메서드로 전달되는 매개변수의 유효 범위를 지정한 스코프다.
- 메서드가 호출될 때 전달되며, 메서드 실행 중에만 유효한 지역 변수다.
public class Test {
public void print(String name) {
System.out.println(name);
}
}
4. 블록 스코프(Block Scope)
- 특정 블록에서의 유효 범위를 지정한 스코프다.
- 블록은
{}로 구분되는 영역으로,if문,while문, 기타{}영역을 말한다.
- 블록은
- 블록 내에서 선언된 변수는 해당 블록에서만 유효하다.
public class Test {
private int number;
static String name = "test";
public Test() {
number = 10;
}
public void blockTest() {
String name = "alpha";
{
int number = 200;
System.out.println("'number' in block: " + number);
}
System.out.println("'name' in blockTest(): " + name);
System.out.println("'number' outside block: " + number);
}
}
public class Main {
public static void main(String[] args) {
Test test = new Test();
test.blockTest();
}
}
'number' in block: 200
'name' in blockTest(): alpha
'number' outside block: 10