11.6.3 필드
때때로 필드 또한 지역 변수처럼 자연스럽게 모아 볼 수 있다. 다음 예제는 Noda Time의 PrecalculatedDateTimeZone에서 발췌한 것이다.
private readonly ZoneInterval[] periods;
private readonly IZoneIntervalMapWithMinMax tailZone;
private readonly Instant tailZoneStart;
private readonly ZoneInterval firstTailZoneInterval;
각각의 필드가 어떤 의미를 가지는지 설명하지는 않겠지만, 마지막 세 개의 필드가 tailZone과 관련되어 있을 것이라고 합리적으로 생각해 볼 수 있다. 이제 이 네 개의 필드를 튜플을 활용하여 두 개로 바꿔 보자.
private readonly ZoneInterval[] periods;
private readonly
(IZoneIntervalMapWithMinMax intervalMap,
Instant start,
ZoneInterval firstInterval) tailZone;
이제 다른 코드에서는 tailZone.start, tailZone.intervalMap 등과 같이 필드를 참조하면 된다. tailZone 필드가 readonly로 선언되었음에 주목하자. 이 경우 생성자 외에는 각 튜플 요소에 개별적으로 값을 할당할 수 없다. 몇 가지 한계점도 있고 주의할 점도 있다.
• 생성자 내에서 튜플의 각 요소는 개별적으로 값을 할당할 수 있다. 하지만 모든 값을 초기화하지 않았다고 경고하지는 않으므로 주의할 필요가 있다. 예를 들어 이전 코드에서 tailZoneStart에 값을 초기화하지 않으면 경고 메시지가 출력되겠지만, tailZone.start는 초기화하지 않더라도 그러한 경고 메시지가 출력되지 않는다.
• 단일의 튜플로 묶을 필드는 모두 읽기 전용이거나 읽기 전용이 아니어야 한다. 연관된 필드를 모아서 하나의 그룹으로 묶으려고 했더니 일부는 읽기 전용이고 또 다른 일부는 그렇지 않다면, 읽기 전용으로 설정하는 것을 포기하거나 튜플로 묶는 것 자체를 포기해야 한다. 내 경우 보통 튜플로 묶는 것을 포기한다.
• 만약 튜플로 묶으려던 필드가 자동 구현 속성을 이용하여 생성된 필드라면 전체 속성을 다시 작성해야 한다. 이 경우에도 나는 튜플로 묶지 않는다.
마지막으로 튜플과 동적 타이핑의 조합은 어떨지 알아보자.