13.4.2 구조체에 readonly 한정자 사용

    정리하면, C# 컴파일러가 읽기 전용 값 타입 변수의 복사본을 생성해야 하는 이유는 변수의 값이 변경되는 것을 막기 위함이다. 그런데 구조체가 이와 같이 동작하지 않는다면 어떨까? 구조체는 많은 경우에 변경 불가능한 형태로 사용되기 때문에 C# 7.2부터는 readonly 한정자를 사용하여 구조체 선언 시에 이러한 특성을 명시적으로 지정할 수 있게 되었다.

    이제 YearMonthDay 구조체를 읽기 전용으로 수정해 보자. 실제 코드에서는 이미 이 구조체를 읽기 전용인 것처럼 사용하고 있기 때문에 readonly 한정자만 추가하면 된다.

    public readonly struct YearMonthDay
    {
        public int Year { get; }
        public int Month { get; }
        public int Day { get; }
    
        public YearMonthDay(int year, int month, int day) =>
            (Year, Month, Day) = (year, month, day);
    }

    구조체 내부 코드는 전혀 수정하지 않고 그저 구조체 선언부만을 수정했을 뿐이지만, PrintYear MonthDay(in YearMonthDay input) 메서드의 컴파일 결과를 살펴보면 훨씬 더 효율적으로 개선되었음을 알 수 있다. 개별 속성에 접근하는 코드는 다음과 같다.

    ldarg.1
    call instance int32 YearMonthDay::get_Year()

    결과적으로, 구조체의 복사본을 전혀 생성하지 않는다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.