C#에서 READONLY와 CONST의 차이는 무엇일까? 변수가 단순히 읽을 수만 읽고 변경이 불가능하다는 '상수'를 정의하는 것이라면 둘 다 같은 것인가? 대답은 당연히 '아니오'다. 만일 같다고하면 이 포스트는 시작도 하지 않았을 것이다.
그렇다면 둘의 차이는 무엇인가? 가장 기본적인 부분에서 부터 출발해보자. 일단 겉보기에는 둘다 같은 기능을 가졌지만 이름만 다른것 처럼 보인다. 하지만 우리가 이 둘의 차이를 제대로 이해하지 못하고 남발하게 되면 꽤나 심각하고 많은 문제을 일으키게 될 가능성이 높다.
C#에서 상수를 정의하기 위해서는 아래와 같이 사용한다.
public const double PI = 3.14;
const 한정자는 컴파일러에게 이 변수는 할당 된 값을 절대 변경하지 않을 것임을 알려준다. const 한정자는 선언 시점에만 그 값을 할당 할 수 있다.
만일 우리가 이 변수의 값을 변경하려고 시도하면 컴파일러는 아래 처럼 에러를 발생 시킬 것이다.
그렇다면 C#에서 read-only 변수를 정의하기 위해서는 어떻게 해야 할까?
public readonly double PI = 3.14;
그리고 read-only 변수 역시 값을 변경하려고 시도하면 컴파일러는 아래와 같은 에러를 발생 시킨다.
위 두가지 케이스가 모두 에러를 발생 시키긴 하지만 에러의 내용은 다르다. 위 상황에서의 차이점은 const로 선언된 변수는 초기화 시점에 값이 할당 되고나면 변경이 불가능하지만, readonly 는 클래스의 생성자에서 값을 수정하는 것이 가능하다는 것이다.
class A
{
public const double CONST_PI = 3.14f;
public readonly double READONLY_PI = 0.0f;
public A()
{
READONLY_PI = 3.14f; // readonly경우 생성자에서 값을 변경
}
}
이로인한 차이는 const의 경우 값이 변경될 수 없기 때문에 여러 개의 변수가 존재할 필요가 없다. 따라서 const 변수에 접근하기 위해서는 static 변수의 접근 방법과 동일한 방법을 사용한다. 반면에 readonly 변수의 경우는 생성자에서 값을 재정의 할 수 있으므로 각 변수마다 각각의 인스턴스를 가져야 할 필요가 있다.
A a = new A();
Console.WriteLine(A.CONST_PI); // const 변수는 클래스 이름으로 접근
Console.WriteLine(a.READONLY_PI); // readonly 변수는 객체 이름으로 접근