더북(TheBook)

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는 초기화하지 않더라도 그러한 경고 메시지가 출력되지 않는다.

단일의 튜플로 묶을 필드는 모두 읽기 전용이거나 읽기 전용이 아니어야 한다. 연관된 필드를 모아서 하나의 그룹으로 묶으려고 했더니 일부는 읽기 전용이고 또 다른 일부는 그렇지 않다면, 읽기 전용으로 설정하는 것을 포기하거나 튜플로 묶는 것 자체를 포기해야 한다. 내 경우 보통 튜플로 묶는 것을 포기한다.

만약 튜플로 묶으려던 필드가 자동 구현 속성을 이용하여 생성된 필드라면 전체 속성을 다시 작성해야 한다. 이 경우에도 나는 튜플로 묶지 않는다.

마지막으로 튜플과 동적 타이핑의 조합은 어떨지 알아보자.

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