const 키워드
const 키워드
상수로 두고 싶은 값이 있나요? const 키워드를 쓰면 컴파일 타임 상수(필드나 로컬 상수)를 선언할 수 있어요. 상수를 담은 필드와 로컬은 변수가 아니라서, 값이 담기고 나면 절대 바꿀 수 없죠.
상수로 쓸 수 있는 건 숫자, Boolean 값, 문자열, 그리고 null 참조뿐이에요. 여기서 꼭 한 가지를 기억해 주세요. 앞으로 바뀔 수 있는 정보를 상수로 만들지 마세요. 예를 들어 서비스 요금, 제품 버전 번호, 회사 브랜드 이름 같은 값은 절대 상수로 두면 안 돼요. 이런 값은 시간이 지나면서 바뀌는데, 컴파일러가 상수를 그대로 코드 속에 복사해 넣기 때문이에요. 그래서 값을 바꾸면 여러분의 라이브러리를 함께 컴파일한 다른 코드들도 새 값을 보려면 전부 다시 컴파일해야 해요. 참고로 readonly 키워드에 대해서도 함께 알아두면 좋아요. 먼저 기본 사용법부터 볼게요.
const int X = 0;
public const double GravitationalConstant = 6.673e-11;
private const string ProductName = "Visual C#";
보간된 문자열도 안에 사용된 모든 식이 상수 문자열이면 상수가 될 수 있어요. 이 기능을 쓰면 상수 문자열을 조립하는 코드가 훨씬 깔끔해져요.
const string Language = "C#";
const string Platform = ".NET";
const string FullProductName = $"{Platform} - Language: {Language}";
C# 언어 참조는 가장 최근에 출시된 C# 언어 버전을 문서화해요. 공개 미리 보기에 포함된 기능의 초기 문서도 함께 실려 있죠. 이 문서에서는 최근 세 버전에서 처음 등장했거나 현재 공개 미리 보기에 있는 기능도 표시해요.
상수 선언의 타입은 그 선언이 도입하는 멤버들의 타입을 정해요. 로컬 상수든 상수 필드든, 초기화 값은 컴파일러가 대상 타입으로 암시적 변환할 수 있는 상수 식이어야 해요.
여기서 상수 식이 뭔지 짚고 갈게요. 상수 식은 컴파일러가 컴파일 타임에 완전히 평가할 수 있는 식을 말해요. 그래서 참조 타입의 상수로 가능한 값은 문자열과 null 참조뿐이죠.
한 번의 선언으로 상수를 여러 개 묶어서 선언할 수도 있어요.
public const double X = 1.0, Y = 2.0, Z = 3.0;
한 가지, 상수 선언에는 static 수식어를 쓸 수 없어요.
상수는 그 자체로 상수 식에 참여할 수도 있답니다.
public const int C1 = 5;
public const int C2 = C1 + 100;
[!NOTE]
readonly키워드는const와 다르다는 걸 꼭 기억해 둘게요.const필드는 필드를 선언할 때만 초기화할 수 있어요. 반면readonly필드는 선언할 때나 생성자에서 초기화할 수 있어요. 그래서readonly필드는 어떤 생성자를 쓰느냐에 따라 값이 달라질 수 있죠. 게다가const필드가 컴파일 타임 상수인 반면,readonly필드는 런타임 상수로도 쓸 수 있어요. 다음처럼 말이에요:public static readonly uint l1 = (uint)DateTime.Now.Ticks;
예제
필드 상수를 쓰는 예제를 볼게요. SampleClass 안의 C1과 C2가 선언부에서 초기화된 상수 필드예요.
public class ConstTest
{
class SampleClass
{
public int X;
public int Y;
public const int C1 = 5;
public const int C2 = C1 + 5;
public SampleClass(int p1, int p2)
{
X = p1;
Y = p2;
}
}
static void Main()
{
var mC = new SampleClass(11, 22);
Console.WriteLine($"X = {mC.X}, Y = {mC.Y}");
Console.WriteLine($"C1 = {SampleClass.C1}, C2 = {SampleClass.C2}");
}
}
/* Output
X = 11, Y = 22
C1 = 5, C2 = 10
*/
이번엔 로컬 상수 선언 예제예요. 메서드 안에서 const로 상수를 만들고 그 값을 출력하고 있어요.
public class SealedTest
{
static void Main()
{
const int C = 707;
Console.WriteLine($"My local constant = {C}");
}
}
// Output: My local constant = 707
C# 언어 사양
더 자세한 내용은 C# 언어 사양의 다음 섹션을 참고해요.