본문 바로가기
개발언어/C#

[C#] Const와 Readonly의 차이점 #1

by 창용이랑 2023. 5. 17.
728x90

C# 에서 const 와 readonly는 상수형 타입입니다. 보다 자세히 말씀드린다면,

const는 컴파일 타입의 상수이며, readonly는 런타임 상수입니다.


const

  • 컴파일 타입의 상수이다. (컴파일 시 const 변수의 값을 가져온다.)
  • 내장자료형 (정수형, 실수형, Enum, String)에 대해서만 사용 할 수 있다.
  • 변수 선언과 동시에 값을 할당 해야 한다.
  • 메모리 할당 위치는 Stack Memory 이다. 단, static 선언을 하면 Heap Memory에 저장 가능하다.

readonly

  • 런타임 상수이다. (exe 또는 dll을 사용할 때 변수의 값을 가져온다.)
  • 모든 자료형에 사용 할 수 있으며, 생성과 동시에 초기화 할 필요는 없다.
  • 단, 생성자 단계에서 단 1번 할당을 통해 초기화 할 수 있다. 
  • 메모리 할당 위치는 Heap Memory이다.

왜 const 보다 readonly가 더 좋은가?

const는 Stack Memory에 저장 되기 때문에 접근이 빠르다는 장점이 있지만, 

const는 컴파일 상수이기 때문에, const 변수 값이 바뀌는 경우 해당 프로젝트 뿐만 아니라 참조 받거나 영향을 받는 프로젝트 모두 재 컴파일을 해야 하는 단점이 있다.

 

반면, readonly는 생성시 선언하지 않아도, 생성자에서 초기화 하여 사용 할 수 있기 때문에 유연하며, 실제 사용하는 단계에서 변수의 값을 가져오는 장점이 존재한다.

 

 

상수값 변경시 재 컴파일을 하지 않고, 사용하는 생성자 단에서 변수에 값을 할당해서 사용 할 수 있기 때문에

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경우 생성자에서 값을 변경
	}
}


Class Program
{
	static void Main(string[] args)
	{
		A a = new A();

		Console.WriteLine(A.CONST_PI);      // const 변수는 클래스 이름으로 접근
		Console.WriteLine(a.READONLY_PI);   // readonly 변수는 객체 이름으로 접근
	}
}