본문 바로가기
언어(C, C++, C#)

[C#] const vs readonly

by 적용1 2024. 11. 9.
728x90

const와 readonly는 C#에서 값을 변경할 수 없도록 하는 역할을 한다는 공통점이 있지만, 서로 다른 상황에서 사용된다.

const(상수)

  • 컴파일 타임 상수이다. 즉, 컴파일 시 값이 결정된다.
  • 정적으로 할당되며(static의 성질을 갖고 있음) 클래스의 모든 인스턴스가 동일한 값을 공유한다.
  • 선언 시 반드시 값을 초기화해야 한다.
  • const 변수는 컴파일 시 코드에 직접 삽입되어, code 영역에 저장된다.
    코드에서 참조될 때 마다 실제 값을 복사하여 사용하게 된다. 따라서 모든 인스턴스에서 같은 값을 가진다.
  • 내장 자료형에만 사용이 가능하다.
    따라서 사용자 정의 클래스로는 불가능하다.

readonly(읽기 전용 필드)

  • 런타임 상수이다. 따라서 선언과 동시에 값을 지정하거나, 생성자에서 값을 할당할 수 있다.
    선언 시 값을 초기화하지 않아도 이후에 생성자를 통해 한 번만 값을 설정할 수 있다.(런타임에 초기화할 수 있다.)
  • 생성자에서 설정한 값은 인스턴스마다 다르게 지정할 수 있다.
  • heap 영역에 저장이 된다.
    이 때, 메모리에 참조 가능한 형태로 존재하며, 객체가 생성된 후 참조되는 필드이다.
  • 어떤 타입과도 사용이 가능하다.
  • 예시
public class MyClass
{
	public readonly int ReadOnlyValue;	// readonly 필드 선언
    
    // 생성자에서 readonly 필드 초기화
    public MyClass(int value)
    {
    	ReadOnlyValue = value;	// 생성자에서 값 할당 가능
    }
}

public class Program
{
	public static void Main()
    {
    	// 서로 다른 값으로 MyClass의 인스턴스를 생성
    	MyClass inst1 = new MyClass(10);
        MyClass inst2 = new MyClass(20);
        
        Console.WriteLine(inst1.ReadOnlyValue);	// 출력 : 10
        Console.WriteLine(inst2.ReadOnlyValue);	// 출력 : 20
    }
}

const vs readonly

속도

  • const : 컴파일 타임에 코드에 삽입되기 때문에 별도로 메모리에서 읽어오는 과정이 없기 때문에 빠른 접근이 보장된다.
  • readonly : 참조 형태로 메모리에 저장되므로 해당 값에 접근할 때 메모리에서 값을 읽는 과정이 발생한다.
  • 한 번의 연산에서 큰 차이가 있지는 않지만, 매우 빈번한 호출이 일어나는 핵심 루프나 성능이 중요한 곳이라면 const가 더 효율적일 수 있다.

유연성 및 재사용성

  • const : 컴파일 타임에 결정되어야 하기 때문에 런타임에 변경하거나 객체나 참조 타입에 사용하기 어렵다. 또 다른 어셈블리에서 참조할 경우 상수 값이 달라질 수 있다.(다른 라이브러리에서는 변경 사항이 적용되지 않을 수 있다.)
  • readonly : 런타임에 초기화할 수 있고, 객체나 구조체와 같은 복잡한 타입의 불변 필드로 사용할 수 있기 때문에 재사용성이 높다.
  • readonly가 더 유연하게 재사용할 수 있다. 예를 들어, 클래스 내에서 특정 데이터나 설정 값을 런타임에 읽어와서 초기화하고자 할 때 유용하다.

컴파일 편의성 및 유지보수

  • const : 컴파일 시점에 값이 삽입되기 때문에 변경이 쉽지 않고, 유지보수 시 상수값의 변경이 많은 경우 불편할 수 있다.
  • readonly : 런타임에 초기화할 수 있고, 생성자에서 변경이 가능하기 때문에 유지보수가 비교적 용이하다. 상황에 맞게 값이 할당된 이후 불변성을 보장할 수 있다.

결론

  • 특성의 매개변수, switch/case 문의 레이블, enum 정의와 같이 고정된 숫자, 문자열 등의 상수 값을 빠르게 참조하고자 할 때는 const가 더 적합하다.
  • 그 외의 상황에서는 readonly 변수가 더 효율적일 수 있다.
728x90