C# 상수 키워드 const vs readonly

 

 

왜 두 키워드가 비교될까?

const 키워드와 readonly 키워드는 비슷한 기능을 하기 때문에 많이 비교되곤 한다.

두 키워드 모두 최초 값을 정한 뒤에는 값을 변경할 수 없게 만드는 기능을 가지고 있다.

public const int myConst = 1000;
public readonly int myRead = 2000;

 

 

그렇다면 다른점은 무엇일까?

조금 더 자세히 말하자면,

const는 컴파일타임 상수를 정의한다.

readonly는 런타임 상수를 정의한다.

 

컴파일타임 상수 const는 컴파일 타임에 변수가 값으로 대체된다.

그래서 반드시 변수의 선언과 동시에 값을 할당하며, 변경할 수 없다.

컴파일 시점에서 결정된 값이 변할 수 없음으로 모든 클래스의 인스턴스가 동일한 값을 가진다.

사용자 정의 클래스에는 적용하지 못하고, 내장 숫자, enum 문자열, null에 대해서만 활용 가능하다.

 

런타임 상수 readonly는 런타임 시점에서 값이 평가된다.

변수의 선언과 동시에 값을 할당할 수도 있지만, 생성자에서 1회 할당도 가능하다.

런타임 시점에 와서야 값이 결정되니 같은 클래스라 하더라도 인스턴스에 따라 다른 값을 가질 수 있다. 

모든 타입에 대해서 사용할 수 있다.

 

 

두 키워드 중에 무엇을 선택해야 할까?

앞서 말했듯 컴파일타임 상수는 컴파일러에 의해 변수가 실제 값으로 대체되어버리니 변수 참조 형태인 readonly보다 훨씬 빠르긴 하지만 값이 바뀌는 경우 프로젝트 전체를 다시 컴파일해야 한다.

 

상수를 만들어야 할 때 두 가지 중 선택해야 한다면, 다음의 요소를 고려해보자.

1. 사용자 정의 타입이라면 const키워드를 적용하지 못하니 readonly밖에 선택지가 없다. 
2. 인스턴스마다 다른 값을 가지게 하고 싶다면 readonly를 선택하자.
3. 마지막으로 해당 상수가 값이 절대 변하지 않을 예정이라면 성능을 위해 const를 선택하자.

 

결론적으로 const는 Math.PI 같이 그 값이 불변하며 여러 클래스나 인스턴스에서 자주 사용되는 경우에 성능을 위해 적용하며, 그 외의 경우에는 전부 readonly를 선택하는 것이 좋다.

 

 

 

댓글

Designed by JB FACTORY