더북(TheBook)

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()

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

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