
01. 컴파일 상수와 런타임 상수
C#에서 사용하는 상수라고 한다면, const 키워드와 readonly 키워드가 있다. 두 키워드의 차이점은 어느 시점에서 상수화가 진행되는지에 따라서 달라진다. 먼저 const 키워드는 컴파일 상수고 readonly 키워드는 런타임 상수다.
컴파일 상수는 런타임 상수에 비해서 빠른 편이지만, 유연성은 떨어지는 편이다. 그래서 변하지 않는 값임을 확신할 수 있다면 컴파일 상수로 작성하는 것이 좋으며, 변하는 값일 수 도 있다면 런타임 상수를 사용하는 것이 좋다.
이런 경우가 언제 있냐면, DB를 통해서 데이터를 수신받아서 상수화를 진행할 때 차이가 있다. 현재 라이브 중인 프로젝트의 이름이 'Unity'라면 정말 특수한 상황이 아닌 이상, 프로젝트의 이름은 불변할 것이다.
이때는 컴파일 상수를 통해서 게임 이름을 저장해도 괜찮지만, 플레이어의 닉네임 같은 경우에는 변동될 여지가 있을 것이다. DB에 저장된 데이터를 내려받을 때 런타임 상수를 통해서 적용한다면 그에 따라 값을 변경할 수 있다. 런타임 상수는 클래스 생성자에서 값을 입력할 수 있기 때문이다.
다른 차이도 한 번 살펴보자.
02. IL 코드에서의 컴파일/런타임 상수
C# 코드는 컴파일 과정에서 IL 코드로 변경되고 이후 어셈블리로 변경된다. 이때 IL 코드로 변환된 컴파일 상수는 다음과 같이 표기된다.
const int number = 1000;
// C#
number
// IL
1000
C#에서는 number 변수로 작성하였으나 IL 코드는 바로 number 변수에 적용된 값을 표기하는데, 이는 컴파일 상수가 IL 단계에서는 값으로 표기되기 때문이다. 하지만 이와 달리, 런타임 상수는 상수에 대한 참조로 컴파일을 진행하기 때문에 값으로 표기되지 않는다.
'독서 > Effective C#' 카테고리의 다른 글
[Effective C#] nameof 연산자를 적극 활용하라 | 2024.08.01 |
---|---|
[Effective C#] 문화권별로 다른 문자열을 생성하려면 FormattableString을 사용하라 | 2024.07.31 |
[Effective C#] string.Format을 보간 문자열로 대체하라 | 2024.07.30 |
[Effective C#] 캐스트보다는 is, as가 좋다 | 2024.07.29 |
[Effective C#] 지역변수를 선언할 때는 var를 사용하는 것이 낫다 | 2024.07.23 |