본문 바로가기

진리는어디에/C#

[C#] CONST와 READONLY의 차이

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 변수는 객체 이름으로 접근

 

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!