더북(TheBook)

» 이 내용은 값 타입에 한정된 내용이다


읽기 전용 필드가 참조 타입인 경우에는 참조하는 객체의 데이터를 수정할 수 있다. 예를 들어 읽기 전용으로 선언된 StringBuilder 필드가 있다고 가정할 때, 이 객체의 Append() 메서드를 호출하여 내부적으로 가지고 있는 데이터를 수정하는 것은 얼마든지 가능하다. 필드의 값은 참조 그 자체이므로 다른 객체를 참조하도록 변경할 수는 없다.

이 절에서는 읽기 전용 필드가 decimal이나 DateTime과 같은 값 타입인 경우에 집중하고 있으며, 이 타입이 내부적으로 가지고 있는 필드가 클래스인지 구조체인지는 중요하지 않다.

C# 7.2 이전에는 필드만 읽기 전용으로 선언할 수 있었다. 하지만 이제는 읽기 전용 참조 지역 변수와 in 매개변수에 대해서도 신경을 써야 한다. 매개변수로 YearMonthDay 객체를 전달받아 연, 월, 일을 출력하는 메서드를 살펴보자.

private void PrintYearMonthDay(YearMonthDay input) =>
    Console.WriteLine($"{input.Year} {input.Month} {input.Day}");

이 메서드의 IL을 살펴보면 이미 스택에 포함되어 있는 값의 주소를 사용하고, 속성은 다음과 같이 간단히 접근하게 된다.

ldarga.s input
call instance int32 Chapter13.YearMonthDay::get_Year()
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.