티스토리 뷰
2) const보다는 readonly가 좋다
C#에는 컴파일타임 상수와 런타임 상수가 있다. 결론부터 말하자면 컴파일타임 상수보다는 런타임 상수를 사용하는 편이 좋다. 컴파일타임 상수가 약간 더 빠르긴 해도 성능면에서 차이가 크지 않고 런타임 상수를 사용하여 얻을 수 있는 유연성이라는 장점은 큰 이득이다.
그래서 컴파일타임 상수는 성능이 중요하고 상수의 값이 절대로 어떤 경우에도 바뀌지 않을 때 사용해야 한다.
런타임 상수는 readonly 키워드를 사용하고, 컴파일타임 상수는 const를 사용한다.
// 컴파일타임 상수
public const string MyName = Kim Min Soo;
// 런타임 상수
public static readonly MyNickname = SoBoroo;
readonly 키워드를 사용한 런타임 상수는 컴파일타임에는 상수에 대한 참조로 컴파일되고 런타임에 값이 평가된다.
const 키워드를 사용한 컴파일타임 상수는 컴파일타임에 값으로 대체된다. 이 차이로 인해 const 상수는 상수 타입에 한계를 가지게 되고 readonly 상수는 좀더 다양한 타입을 상수로 가질 수 있게 된다.
const 상수는 내장된 숫자형, enum, 문자열, null에 대해서만 사용될 수 있다. 내장 자료형이어야만 컴파일타임에 상수를 값으로 대체할 수 있기 때문이다.
한편, readonly 상수는 DateTime과 같은 어떤 타입과도 함께 사용될 수 있다. readonly 상수는 멤버 초기화 구문에서 초기화되거나 생성자(constructor)를 통해서도 초기화 될 수 있다. 그리고 초기화 된 readonly 상수는 그 이후에는 수정될 수 없다.
또한, readonly 상수가 런타임에서 값이 지정된다는 점은 호환성에도 좋은 영향을 준다. 예로 들어 A 어셈블리에서 const 상수와 readonly 상수가 정의되어 있다고 하자. 이후에 A 어셈블리만 수정이 들어간다고 했을 때 응용 프로그램 전체를 리빌드하지 않고 리빌드한 A 어셈블리만 배포할 수 도 있다.
이럴 경우 const 상수는 컴파일타임을 거치지 않았기 때문에 이전에 컴파일타임에 정의된 값을 그대로 쓰고 readonly 상수는 변경된 값을 제대로 반환할 수 있다.
그래서 상수 타입의 폭이 넓은 장점과 호환성에서 유리하다는 장점. 즉, 유연성에서 readonly 상수가 const 상수에 비해 많이 유리하다.
하지만 앞서 말했듯이, 성능이 매우 중요할 때는 const 상수를 써주면 좋고, 컴파일할 때 사용되는 상숫값을 정의할 때도 반드시 const를 사용해야 한다. 예로 들어, Attribute의 매개변수, switch/case 문의 Label, enum 정의 시에는 컴파일 시에 사용되므로 const를 통해서 초기화되어야 한다.
위 경우를 제외하고는 const보다는 readonly를 사용하는 것이 좋다.
const와 readonly를 사용하면서 항상 느끼던 의문이었다.
두 구문의 사용 방법이나 목적이 크게 다르지 않은데 왜 굳이 C#은 const와 readonly로 구분해놓았을까?
이번 파트는 간지러웠던 부분을 긁어주는 것 같은 파트였다.
참조 - Effective C# <강력한 C# 코드를 구현하는 50가지 전략과 기법, 이펙티브>, 빌 와그너, 김명신, 한빛미디어
'Programming > Effective C#' 카테고리의 다른 글
[Effective C# Item 6] nameof() 연산자를 적극 활용하라 (0) | 2020.10.18 |
---|---|
[Effective C# Item 5] 문화권별로 다른 문자열을 생성하려면 FormattableString을 사용하라 (0) | 2020.10.18 |
[Effective C# Item 4] string.Format()을 보간 문자열로 대체하라 (0) | 2020.10.18 |
[Effective C# Item 3] 캐스트보다는 is, as가 더 좋다 (0) | 2020.10.18 |
[Effective C# Item 1] 지역변수를 선언할 때는 var를 사용하는 것이 낫다 (0) | 2020.10.18 |