C#에서 변수의 범위(Scope)란 변수가 어디에서 선언되고, 어디까지 접근할 수 있는지 결정하는 개념이다.
변수의 범위는 해당 변수를 사용할 수 있는 코드 영역을 의미한다.
C#에서는 변수가 선언된 위치에 따라 범위(Scope)가 결정된다.
| 범위(Scope) | 설명 | 선언 위치 |
|---|---|---|
| 블록 범위(Block Scope) | 중괄호 {} 내부에서만 접근 가능 | if, for, while 등 |
| 지역 변수(Local Variable) | 특정 메서드 안에서만 접근 가능 | 메서드 내부 |
| 필드(Field, 멤버 변수) | 클래스 내부에서 접근 가능 (접근제어자에 따라 달라짐) | 클래스 내부 |
| 정적 변수(Static Variable) | 클래스 전체에서 공유됨 | static 키워드 사용 |
| 전역 변수(Global Variable) | 프로그램 전체에서 접근 가능 (C#에서는 사용하지 않음) | C#에서는 지원 X |
블록 {} 내부에서 선언된 변수는 해당 블록 내부에서만 사용 가능하며, 블록을 벗어나면 변수를 사용할 수 없다.
if (true)
{
int x = 10; // x는 if 블록 내부에서만 사용 가능
Console.WriteLine(x); // ✅ 출력 가능
}
Console.WriteLine(x); // ❌ 오류! (x는 블록을 벗어나면 사용 불가능)
변수 x는 if 블록 내부에서 선언되었기 때문에 블록 밖에서는 접근할 수 없다.
class Program
{
static void PrintMessage()
{
string message = "Hello"; // 지역 변수
Console.WriteLine(message);
}
static void Main()
{
string message = "Hi"; // 다른 지역 변수 (독립적)
Console.WriteLine(message);
PrintMessage(); // "Hello" 출력
}
}
// message 변수는 Main()과 PrintMessage()에서 각각 독립적으로 선언된다.
// PrintMessage()의 message는 Main()에서 사용할 수 없다.
class Person
{
private string name; // 필드 (private → 클래스 내부에서만 사용 가능)
public void SetName(string newName)
{
name = newName; // 클래스 내부에서는 사용 가능
}
public void PrintName()
{
Console.WriteLine(name);
}
}
class Program
{
static void Main()
{
Person p = new Person();
// p.name = "Alice"; // ❌ 오류! (private 필드이므로 접근 불가능)
p.SetName("Alice");
p.PrintName(); // ✅ "Alice" 출력
}
}
class Counter
{
public static int count = 0; // 정적 변수
public Counter()
{
count++; // 모든 객체가 같은 count를 공유
}
}
class Program
{
static void Main()
{
Counter c1 = new Counter();
Counter c2 = new Counter();
Console.WriteLine(Counter.count); // 출력: 2
}
}
count는 모든 Counter객체가 공유한다.count값은 2가 된다.class GlobalData
{
public static int globalValue = 100;
}
class Program
{
static void Main()
{
Console.WriteLine(GlobalData.globalValue); // 100 출력
}
}
// 전역 변수를 직접 지원하지 않지만, static 필드를 이용하여 비슷한 효과를 낼 수 있다.
| 범위(Scope) | 설명 | 선언 위치 | 접근 가능 범위 |
|---|---|---|---|
| 블록 범위 (Block Scope) | {} 내부에서만 사용 가능 | if, for, while 등 | 해당 블록 내부 |
| 지역 변수 (Local Variable) | 특정 메서드 안에서만 사용 가능 | 메서드 내부 | 메서드 내부 |
| 필드 (Field, 멤버 변수) | 클래스 내부에서 접근 가능 (접근제어자 적용) | 클래스 내부 | 클래스 내부 |
| 정적 변수 (Static Variable) | 모든 객체가 공유하는 변수 | static 키워드 사용 | 클래스 전체 |
| 전역 변수 (Global Variable) | 프로그램 전체에서 사용 가능 (C#에서는 static으로 대체) | static 필드 사용 | 모든 클래스 |