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
'언어(C, C++, C#)' 카테고리의 다른 글
[C#] 가상 함수 테이블 (0) | 2024.11.17 |
---|---|
[C#] 리플렉션(Reflection)과 속성(Attribute) (0) | 2024.11.14 |
[C#] delegate와 event (3) | 2024.11.08 |
[C#] .NET, 컴파일 과정, CLS, CTS, CIL, CLI, CLR, JIT 컴파일 (1) | 2024.11.06 |
[C#] 접근 제한자(public, private, protected, internal 등) (0) | 2024.11.06 |