개발공부/C#

[Effective C#] 아이템 2 : const와 readonly 차이

개발자 찐빵이 2021. 11. 19. 17:15
728x90

const, readonly는 무엇일까?

변수를 변하지 못하는 변수로 만들어 주는 C# 키워드.

const

컴파일 타임 상수로 내장 자료형(정수형, 실수형, enum, string)에 대해서만 쓸 수 있으며, 변수 선언과 동시에 사용 해야 한다.

readonly

런타임 상수이고, 모든 자료형에 사용할 수 있다. 런타임에 이루어 지므로 생성과 동시에 초기화할 필요는 없다.
단, 생성자 단계에서 1번 할당을 통해 초기화 할 수 있다.

static readonly

스태틱 생성자에서 초기화할 수 있는 상수. 클래스 이름으로 접근할 수 있다.

런타임 상수를 이용해야 하는 이유

컴파일타임 상수는 런타임 상수에 비해 유연성이 떨어진다.

  • readonly로 선언할 수 있지만 const로 선언할 수 없는 구조체가 있다. (ex : DateTime)
  • 런타임 상수는 생성자를 통해서 초기화할 수 있다.
  • C# 컴파일러는 const를 사용하는 컴파일타임 상수에 대해서 참조 코드를 생성하지 않고 값으로 대체해버리지만,
    런타임 상수는 컴파일 시에 참조 코드가 생성되고 런타임에 그 값을 평가한다.
    따라서 런타임 상수는 응용프로그램을 완전히 리빌드하지 않아도 어셈블리의 변경 사항을 올바르게 반영할 수 있다.

const는 언제 사용해야 할까?

  • 컴파일 할 때 사용되는 상수값을 정의할 때
  • 특성의 매개변수, switch/case 문의 레이블, enum을 정의할 때
    (사용되는 상수는 컴파일 시에 사용되어야 하므로 반드시 const를 통해 초기화되어야 한다.)

이런 상황을 제외하고는 readonly를 사용하는 것이 좋다.

결론

const를 사용했을 때는 코드를 상수 값으로 대체하기 때문에 성능이 빠르지만, 그렇게 많이 빨라지는 것도 아니고 무엇보다 유연성을 해치는 단점이 있다.

컴파일 타임 상수는 성능이 매우 중요하고 상수의 값이 절대로 바뀌지 않는 경우에만 제한적으로 사용하는 것이 좋다.

반응형