[Effective C# item 2] const보다는 readonly가 좋다
- C#/Effective C# 책 정리
- 2021. 5. 22. 00:00
1. 참조
- https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/readonly
- https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/how-to-define-constants
2. 소개
- C#에서는 컴파일타임 상수와 런타임 상수가 있습니다.
- 결론부터 말씀드리면 컴파일타임 상수보다는 런타임 상수를 사용하는 편이 좋습니다.
- 컴파일타임 상수가 약간 더 빠르긴 하더라도 성능면에서 차이가 크지 않고 런타임 상수를 사용하여 얻을 수 있는 유연성 이라는 장점은 큰 이득입니다.
- 그래서 컴파일타임 상수는 성능이 중요하고 상수의 값이 절대로 어떤 경우에도 바뀌지 않을 때 사용해야 합니다.
런타임상수는 readonly 키워드를 사용하고, 컴파일타임 상수는 const 키워드를 사용합니다.
// 컴파일타임 상수 :
public const string MyName = "beombeomjojo";
// 런타임 상수 :
public static readonly MyName2 = "beombeomjojo";
3. const
- 컴파일타임 상수 입니다.
- 컴파일타임에 변수가 값으로 대체되어, 메서드 내부에서도 선언이 가능합니다.
- 컴파일타임에 상수를 리터럴로 대체해야 하기 떄문에, 내장된 숫자형, enum, 문자열, null과 같은 내장 자료형만 사용 가능합니다.
4. readonly
- 런타임 상수입니다.
- 컴파일 타임에 값으로 대체되는 것이 아닌, 상수에 대한 참조 로 컴파일 되어 메서드 내에서는 선언이 불가능합니다.
- 반드시 생성과 동시에 초기화하지 않아도 되며, 생성자에서 최초 1번 초기화 가능합니다. 그 이후에는 수정이 불가능 합니다.
- 어떤 타입과도 사용될 수 있다는 장점이 있습니다.
핵심
- readonly 키워드를 사용한 런타임 상수는 컴파일 타임에는 상수에 대한 참조로 컴파일 되고 런타임에 값이 평가됩니다.
- const 키워드를 사용한 컴파일타임 상수는 컴파일타임에 값으로 대체됩니다.
- 이러한 차이로 인해 const 상수는 상수 타입에 한계를 가지게 되고 readonly 상수는 좀더 다양한 타입을 상수로 가질 수 있다는 차이가 있습니다.
정리
- readonly 키워드를 사용하면 타입의 폭이 넓다는 장점과 호환성에 유리하다는 장점이 있습니다.
- 즉, 유연성에서 readonly 상수가 const 상수에 비해 많이 유리합니다.
- 하지만, 성능이 매우 중요한 때는 const 상수를 써주는게 좋고, 컴파일할 때 사용되는 상수값을 정의할 때도 반드시 const를 사용해야 합니다.
- 예시로 Attribute의 매개변수, switch/case 문의 Label, enum 정의 시에는 컴파일 시에 사용되므로 const를 통해서 초기화 되어야 합니다.
- 이러한 경우를 제외한 나머지의 상수는 readonly로 사용하는 것이 좋습니다.
728x90
'C# > Effective C# 책 정리' 카테고리의 다른 글
[Effective C# 개정판 3판 19장] 런타임에 타입을 확인하여 최적의 알고리즘을 사용하라 (0) | 2021.06.11 |
---|---|
[Effective C# 개정판 3판 ] 17장 표준 Dispose 패턴을 구현하라 (0) | 2021.06.03 |
[Effective C# item 15] 불필요한 객체를 만들지 말라 (0) | 2021.05.21 |
[Effective C# Item 5] 문화권별로 다른 문자열을 생성하려면 FormattableString을 사용하라. (0) | 2021.05.12 |
[Effective C# Item 3] 캐스트 보다는 is,as가 좋다. (0) | 2021.05.11 |
이 글을 공유하기