더북(TheBook)

이 코드를 보면 추가적으로 복사본을 생성하지 않는다는 것을 알 수 있는데, 이는 해당 속성이 변경 가능한 값이며 input 변수의 값이 변경되더라도 문제가 없다고 가정하고 있다. 결국 읽고 쓸 수 있는 값이라는 이야기다. 하지만 input 변수를 다음과 같이 in 매개변수로 변경할 수도 있다.

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

이 메서드의 IL을 다시 살펴보면, 각각의 속성에 접근할 때마다 다음과 같은 코드가 수행됨을 알 수 있다.

ldarg.1
ldobj Chapter13.YearMonthDay
stloc.0
ldloca.s V_0
call instance int32 YearMonthDay::get_Year()

ldobj 명령은 (매개변수로 주어진) 주소에 위치한 값을 스택에 복사하는 명령이다. 호출 측에서 복사본을 생성하지 않으려고 노력했음에도 이 메서드 내에서는 세 벌의 복사본이 생성된다. 이러한 동작 방식은 읽기 전용 참조 지역 변수의 경우와 완전히 동일하다. 썩 좋아 보이지 않는다! 이미 짐작했을 수도 있겠지만 C# 7.2에는 이에 대한 해결책이 있다. 바로, 읽기 전용 구조체다.

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