C# 정적 멤버란 무엇인가?
C#에서는 static 키워드를 사용하여 클래스 멤버를 정적(static)으로 정의할 수 있습니다. 클래스의 멤버를 static으로 선언하면, 해당 클래스의 객체를 몇 개를 생성하더라도 정적 멤버의 복사본은 단 하나만 존재합니다. 즉, 모든 객체가 이 하나의 멤버를 함께 공유하게 됩니다.
static 키워드는 "클래스당 멤버의 인스턴스가 오직 하나만 존재한다"는 의미를 담고 있습니다. 정적 변수는 클래스의 인스턴스를 생성하지 않고도 클래스 이름만으로 값을 참조할 수 있기 때문에 상수를 정의할 때 특히 유용합니다. 정적 변수는 멤버 함수 외부나 클래스 정의 외부에서 초기화할 수 있으며, 필요하다면 클래스 정의 내부에서 초기화하는 것도 가능합니다.
정적 멤버의 주요 특징
- 객체 생성 횟수와 관계없이 멤버의 복사본은 하나만 유지됩니다.
- 모든 객체가 동일한 정적 변수를 공유하므로, 한 객체에서 변경한 값이 다른 객체에도 그대로 반영됩니다.
- 인스턴스를 만들지 않고
클래스이름.멤버이름형태로 직접 접근할 수 있습니다. - 프로그램 전체에서 공통으로 사용하는 카운터, 설정값, 상수 등을 저장하기에 적합합니다.
예제 코드
다음 예제는 두 개의 객체가 정적 변수 num을 어떻게 공유하는지 보여줍니다.
using System;
namespace StaticVarApplication {
class StaticVar {
public static int num;
public void count() {
num++;
}
public int getNum() {
return num;
}
}
class StaticTester {
static void Main(string[] args) {
StaticVar s1 = new StaticVar();
StaticVar s2 = new StaticVar();
s1.count();
s1.count();
s1.count();
s2.count();
s2.count();
s2.count();
Console.WriteLine("Variable num for s1: {0}", s1.getNum());
Console.WriteLine("Variable num for s2: {0}", s2.getNum());
Console.ReadKey();
}
}
}
실행 결과
Variable num for s1: 6 Variable num for s2: 6
결과 분석
s1과 s2라는 서로 다른 두 객체를 생성했음에도 불구하고, 출력 결과는 두 객체 모두 6으로 동일합니다. 그 이유는 num이 정적 변수이기 때문입니다.
s1에서 count()를 세 번 호출하고, s2에서 다시 세 번 호출했으므로 공유된 num의 값은 총 6번 증가하여 6이 됩니다. 어느 객체를 통해 값을 조회하더라도 같은 변수를 참조하기 때문에 항상 동일한 결과가 출력되는 것입니다. 이것이 바로 C# 정적 멤버의 핵심 동작 방식입니다.