Java의 final 키워드처럼 변수에 값을 한 번만 할당하고 싶다면, C#에서는 final이 아닌 readonly 키워드를 사용해야 합니다. C# 언어 사양에는 final 키워드가 존재하지 않기 때문입니다.
readonly로 선언된 멤버는 값을 단 한 번만 할당할 수 있습니다. 즉, readonly로 표시된 필드는 객체가 생성되는 시점, 정확히는 생성자 내부에서 한 번만 설정할 수 있으며, 그 이후에는 어떤 경우에도 값을 변경할 수 없습니다.
한 가지 주의할 점은, C#에서 readonly는 메서드 안의 지역 변수에는 적용할 수 없고 클래스의 필드에만 사용할 수 있다는 것입니다. Java에서 흔히 쓰이는 'final 지역 변수' 패턴이 필요하다면, 해당 값을 별도의 readonly 필드나 속성으로 옮기는 방식으로 설계해야 합니다.
예제 코드
아래 예제에서는 empCount 필드를 readonly로 선언했습니다. 생성자에서 한 번 값이 할당되면, 이후에 값을 바꾸려는 시도는 컴파일 오류로 거부됩니다.
class Department {
readonly int empCount;
Department(int empCount) {
this.empCount = empCount;
}
void ChangeCount() {
// empCount = 150; // 컴파일 오류 발생
}
}
ChangeCount() 메서드에서 주석 처리된 empCount = 150; 코드의 주석을 해제하면 컴파일러가 오류를 발생시킵니다. 이처럼 readonly는 실수로 인한 값 변경을 컴파일 단계에서 원천적으로 차단해 주는 안전장치 역할을 합니다.
참고: const와의 차이점
C#에는 비슷한 목적으로 쓰이는 const 키워드도 있습니다. 두 키워드의 차이는 다음과 같습니다.
- const: 컴파일 시점에 값이 반드시 결정되어야 하며, 기본형·문자열 등 리터럴 값에만 사용할 수 있습니다.
- readonly: 런타임에 생성자 실행 중 값이 결정될 수 있으므로, 계산 결과나 외부 입력에 기반한 초기화가 필요한 경우에 적합합니다.
따라서 값이 항상 고정된 상수라면 const, 객체마다 다르지만 한 번 정해지면 변하지 않아야 하는 값이라면 readonly를 사용하는 것이 좋습니다.