C# 정적 멤버 함수의 기본 개념
C#에서 정적(static) 멤버 함수는 특정 객체(인스턴스)에 속하지 않고 클래스 자체에 소속되는 함수입니다. 따라서 객체를 생성하기 전에도 이미 존재하며, 클래스 이름만으로 바로 호출할 수 있습니다.
정적 함수의 가장 중요한 특징은 다음과 같습니다.
- 정적 변수만 접근 가능: 정적 함수 내부에서는 static으로 선언된 변수만 직접 다룰 수 있습니다. 일반 인스턴스 변수에는 접근할 수 없습니다.
- 객체 생성 이전에 존재: 정적 함수는 프로그램 실행 시점에 메모리에 로드되므로, 객체가 만들어지기 전에도 사용할 수 있습니다.
- 클래스 이름으로 호출: new 키워드로 인스턴스를 만들 필요 없이
클래스이름.함수이름()형태로 호출합니다.
정적 함수는 아래와 같이 static 키워드를 붙여 선언합니다.
public static int getNum() {}정적 함수 활용 예제
다음 예제는 정적 변수 num과 이를 읽어오는 정적 함수 getNum()을 함께 사용하는 모습을 보여줍니다.
Example
using System;
namespace Demo {
class StaticVar {
public static int num;
public void count() {
num++;
}
public static int getNum() {
return num;
}
}
class StaticTester {
static void Main(string[] args) {
StaticVar s = new StaticVar();
s.count();
s.count();
s.count();
Console.WriteLine("Variable num: {0}", StaticVar.getNum());
Console.ReadKey();
}
}
}Output
Variable num: 3
코드 동작 원리 살펴보기
위 코드의 흐름을 단계별로 정리하면 다음과 같습니다.
StaticVar클래스에는 정적 변수num이 선언되어 있으며, 모든 인스턴스가 이 값을 공유합니다.- 일반(인스턴스) 메서드인
count()는 호출될 때마다num을 1씩 증가시킵니다. - 정적 함수
getNum()은 객체 없이StaticVar.getNum()형태로 호출되어num의 현재 값을 반환합니다. count()가 세 번 호출되었으므로 최종 출력 결과는 Variable num: 3이 됩니다.
참고: Main 메서드가 static인 이유
C# 프로그램의 진입점인 Main 메서드가 반드시 static으로 선언되어야 하는 것도 같은 맥락입니다. 프로그램 시작 시점에는 어떤 객체도 존재하지 않기 때문에, 런타임이 객체 생성 없이 곧바로 호출할 수 있도록 정적 함수로 정의해야 합니다.
마무리
정적 멤버 함수는 객체 상태와 무관한 공용 데이터나 유틸리티 성격의 기능을 구현할 때 매우 유용합니다. 단, 정적 함수 안에서는 정적 멤버만 접근할 수 있다는 제약을 항상 기억하고, 인스턴스별 고유 데이터가 필요하다면 일반 메서드를 사용하는 것이 올바른 설계입니다.