더북(TheBook)

이 책과 함께 제공되는 소스 코드를 내려받아 살펴보면, 이 읽기 전용의 구조체를 ReadOnly YearMonthDay라는 이름으로 별도로 선언해 두었음을 알 수 있다. 이렇게 함으로써 변경 전후의 코드를 모두 살펴볼 수 있을 것이다. 하지만 개발 중인 코드에서는 이렇게 별도로 구조체를 선언할 필요가 없고, 기존 구조체를 읽기 전용으로 변경하더라도 바이너리 호환성이 유지된다. 하지만 이와 반대로 읽기 전용 구조체를 읽고 쓸 수 있는 구조체로 변경하면 바이너리 호환성이 손상될 수 있다. 만약 readonly 한정자를 제거하고 멤버들의 값이 변경될 수 있도록 코드를 수정했다면, 기존에 컴파일된 코드는 이 구조체를 여전히 읽기 전용으로 간주하므로 읽기 전용의 값을 변경하려 한다고 판단할 것이다.

구조체에 readonly 한정자를 적용하려면 이 구조체가 진정으로 읽기 전용으로 사용되어야 하는지 확인하고, 더불어 다음 조건에 부합하는지도 살펴보기 바란다.

모든 인스턴스 필드와 자동 구현 인스턴스 속성이 반드시 읽기 전용이어야 한다. 정적 필드와 정적 속성은 쓰기 가능해도 상관없다.

생성자 내에서만 this 객체에 대해서 할당을 수행할 수 있다. C# 명세에 따르면 생성자 내에서는 thisout 매개변수로 간주되며, 일반 구조체의 멤버 내에서는 참조 매개변수로, 읽기 전용 구조체의 멤버 내에서는 in 매개변수로 간주된다.

이미 특정 구조체를 읽기 전용인 것처럼 사용했다면 readonly 한정자를 추가하고 컴파일해 보라. 컴파일 과정에서 문제가 되는 부분을 확인할 수 있을 것이며, 대부분 문제없이 동작할 것이다. 불행히도 Noda Time에서는 약간 문제가 있었다.

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