Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# const, static, readonly 차이점 완벽 비교 가이드

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 비교 요약

구분conststaticreadonly
초기화 시점선언 시 (컴파일 타임)선언 시 또는 정적 생성자선언 시 또는 인스턴스 생성자
값 변경 가능 여부불가능가능생성자 종료 후 불가능
적용 대상필드, 지역 변수필드, 메서드, 속성, 클래스 등필드
형식 제한값 형식, string 등 일부없음없음

마무리

정리하면, 절대 변하지 않는 고정 값이라면 const, 타입 전체가 공유하는 멤버라면 static, 생성 시점에만 결정되고 이후에는 변경되지 않아야 하는 값이라면 readonly를 사용하는 것이 좋습니다. 세 키워드의 차이를 정확히 이해하면 더 안전하고 유지보수하기 쉬운 C# 코드를 작성할 수 있습니다.