C#에서는 const, static, readonly 세 가지 키워드를 통해 변수와 멤버의 동작 방식을 제어할 수 있습니다. 세 키워드는 모두 '변경 제한'과 관련이 있어 초보 개발자들이 자주 혼동하지만, 실제로는 값이 할당되는 시점과 적용 범위가 서로 다릅니다. 이 글에서는 각 키워드의 개념과 특징을 예제 코드와 함께 살펴보겠습니다.
1. C# const란?
const(상수) 키워드로 선언된 필드는 한 번 값이 정해지면 프로그램 실행 중 절대 수정할 수 없는 필드입니다. 반드시 선언과 동시에 값을 할당해야 하며, 그 값은 컴파일 타임에 결정됩니다.
const int a = 5;
const의 주요 특징
- 선언 시점에 값을 반드시 초기화해야 합니다.
- 컴파일 타임 상수이므로 값이 어셈블리(IL 코드)에 직접 삽입됩니다.
- 암묵적으로 static처럼 동작하며, 클래스 이름을 통해 접근합니다.
- int, double 같은 값 형식이나 string, null 참조에만 사용할 수 있습니다.
2. C# static이란?
static 한정자는 특정 객체(인스턴스)가 아닌 타입 자체에 소속되는 멤버를 정의할 때 사용합니다. 클래스에 static을 적용하면 해당 클래스는 new 키워드로 인스턴스를 생성할 수 없으며, 메서드·속성·생성자·클래스 등 다양한 멤버에 적용할 수 있습니다.
static int a = 10;
static의 주요 특징
- 클래스에 적용하면 인스턴스화가 불가능하며, 정적 멤버만 포함할 수 있습니다.
- 모든 인스턴스가 하나의 값을 공유하는 단일 복사본을 가집니다.
- 선언 시 또는 정적 생성자(static constructor)에서 초기화할 수 있으며, 런타임에 값 변경이 가능합니다.
- 유틸리티 함수, 전역 카운터, 공용 설정 값 등에 활용하기 좋습니다.
3. C# readonly란?
readonly 필드는 선언 시점에 초기화하거나 생성자 내부에서 값을 설정할 수 있는 읽기 전용 필드입니다. 생성자 실행이 끝난 이후에는 값을 변경할 수 없지만, 생성자에 전달되는 매개변수에 따라 인스턴스마다 다른 값을 가질 수 있다는 점이 const와 큰 차이입니다.
readonly의 주요 특징
- 선언 시 또는 인스턴스 생성자에서 초기화할 수 있습니다.
- 런타임에 값이 결정되므로, 생성자 로직에 따라 유연하게 값을 설정할 수 있습니다.
- 모든 데이터 형식(참조 형식 포함)에 사용할 수 있습니다.
예제: 생성자에서 readonly 초기화하기
다음 예제는 readonly 필드를 선언만 해두고, 생성자 내부에서 값을 할당하는 방식을 보여줍니다.
class Demo {
readonly int a;
public Demo( ) {
a = 5;
}
}
이처럼 readonly는 런타임 조건에 따라 초기값을 결정해야 하는 경우에 유용하게 사용됩니다.
4. const vs static vs readonly 비교 요약
| 구분 | const | static | readonly |
|---|---|---|---|
| 초기화 시점 | 선언 시 (컴파일 타임) | 선언 시 또는 정적 생성자 | 선언 시 또는 인스턴스 생성자 |
| 값 변경 가능 여부 | 불가능 | 가능 | 생성자 종료 후 불가능 |
| 적용 대상 | 필드, 지역 변수 | 필드, 메서드, 속성, 클래스 등 | 필드 |
| 형식 제한 | 값 형식, string 등 일부 | 없음 | 없음 |
마무리
정리하면, 절대 변하지 않는 고정 값이라면 const, 타입 전체가 공유하는 멤버라면 static, 생성 시점에만 결정되고 이후에는 변경되지 않아야 하는 값이라면 readonly를 사용하는 것이 좋습니다. 세 키워드의 차이를 정확히 이해하면 더 안전하고 유지보수하기 쉬운 C# 코드를 작성할 수 있습니다.