C#

[C#]const와 readonly 차이점

DevStory 2021. 12. 25.

const와 readonly 키워드

C#의 const 키워드는 변수를 상수로 만들며, readonly 키워드는 변수를 읽기 전용으로 만듭니다. 이 두 가지 키워드는 '값을 변경할 수 없다'라는 관점에서는 동일하게 보이지만, 미묘한 차이점이 존재하므로 혼란스러울 수 있습니다. 따라서 이번 포스팅에서 예제와 함께 const와 readonly 키워드의 차이점을 알아보겠습니다.


MSDN에서 언급된 내용

상수는 프로그램 컴파일 시 정해진 불변 값이며 프로그램이 종료될 때까지 값을 변경할 수 없습니다. 읽기 전용 변수 역시 불변 값이지만 런타임에 정해지며, 마찬가지로 프로그램이 종료될 때까지 값을 변경할 수 없습니다.

 

MSDN에서 언급된 위 내용을 머릿속에 넣어두고 const와 readonly 키워드에 대해 알아봅시다.


const 키워드

  1. const 키워드를 사용하여 생성된 변수는 상수라고 합니다. 상수는 값이 변하지 않는 변수를 의미합니다. 즉, const로 변수를 선언하면 값을 변경하거나 수정할 수 없습니다.
  2. 상수는 기본적으로 정적(static)입니다.
  3. const 키워드를 사용하여 상수를 만드는 경우 반드시 값이 초기화되어야 합니다.
  4. 상수 변수는 정적 변수와 동일하게 동작합니다. 즉, 객체를 생성할 필요가 없습니다.
  5. 정적 변수와 상수 변수의 유일한 차이점은 정적 변수의 값은 수정할 수 있지만 상수 변수의 값은 수정할 수 없습니다.

const 예제

다음 예제를 통해 const 키워드를 알아봅시다. ConstExample 클래스 내에서 const 키워드를 사용하여 상수 변수를 선언합니다. Main 문에서 클래스 이름을 사용하여 상수에 접근합니다. 상수는 기본적으로 정적이므로 객체를 생성하지 않아도 됩니다.

 

Main 문에서 로컬 변수를 const로 선언하는 것도 가능합니다. 상수는 컴파일 시 불변 값이 정해 지므로 상수의 값을 변경하려고 하면 compile-time 오류가 발생합니다.

class ConstExample
{
  public const int number = 5;
}
    
class Program
{
  static void Main(string[] args)
  {
    // 객체를 생성하지 않고 ConstExample 클래스의 상수를 접근합니다.
    Console.WriteLine(ConstExample.number);

    // 로컬 변수를 상수로 생성합니다.
    const int num = 10;
    Console.WriteLine(num);

    // 만약 아래 주석처럼 상수의 값을 변경하면 compile-time 오류가 발생합니다.
    // num = 20;
  }
}
반응형

readonly 키워드

  1. readonly 키워드를 사용하여 생성된 변수는 읽기 전용 변수라고 합니다. 읽기 전용 변수의 값은 초기화 후 수정할 수 없습니다.
  2. 상수와 달리 변수를 선언할 때 값을 초기화하는 것은 필수가 아닙니다. 생성자에서 읽기 전용 변수를 초기화할 수 있지만, 가장 중요한 점은 생성자 외부에서는 읽기 전용 변수의 값을 수정할 수 없다는 것입니다.
  3. 읽기 전용 변수는 비정적(non-static) 변수와 유사하게 동작합니다.
  4. 상수는 클래스에 대한 값입니다. 반면 읽기 전용 변수는 객체에 대한 값입니다.

 

readonly 예제

다음 예제를 통해 readonly 키워드를 알아봅시다. ReadOnlyExample 클래스 내에서 읽기 전용 변수를 선언합니다. 상수와 달리 Main 문에서 객체를 생성하고 객체를 통해 읽기 전용 변수에 접근합니다. 읽기 전용 변수는 비정적이므로 접근하기 위해 객체가 필요합니다.

class ReadOnlyExample
{
  public readonly int number = 5;
}

class Program
{
  static void Main(string[] args)
  {
    ReadOnlyExample readOnlyInstance = new ReadOnlyExample();
    Console.WriteLine(readOnlyInstance.number);
  }
}

생성자에서 readonly 변수 초기화

다음 예제는 클래스 생성자에서 읽기 전용 변수를 초기화합니다. 읽기 전용 변수는 선언 시 초기화하거나 클래스 생성자에서 초기화할 수 있습니다.

class ReadOnlyExample
{
  public readonly int number = 5;
  
  public ReadOnlyExample()
  {
    number = 50;
  }
  
  public ReadOnlyExample(bool IsAnotherInstance)
  {
    number = 100;
  }
}

class Program
{
  static void Main(string[] args)
  {
    ReadOnlyExample readOnlyInstance = new ReadOnlyExample();
    Console.WriteLine(readOnlyInstance.number);

    ReadOnlyExample readOnlyAnotherInstance = new ReadOnlyExample(true);
    Console.WriteLine(readOnlyAnotherInstance.number);
  }
}

실행 결과

20
100

실행 결과에서 볼 수 있듯이 읽기 전용 변수는 생성자에서 값을 초기화할 수 있으며, 다른 인스턴스에 대해 값이 다른 것을 확인할 수 있습니다. 따라서 읽기 전용 변수는 런타임 시 값이 정해지며 프로그램이 종료될 때까지 불변이라는 것을 알 수 있습니다.

반응형

댓글