Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 final 키워드 대신 readonly 사용하기 – 값 변경이 불가능한 필드 만들기

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를 사용하는 것이 좋습니다.