더북(TheBook)

11.4.8 제네릭이 아닌 ValueTuple 구조체

웜플이라는 말이 좀 이상하게 들렸다면, 너플(nuple, 희안한) 튜플(제네릭이 아니며, 어떤 요소도 가지지 않는 튜플)은 더욱 이상하게 들리지 않을까 싶다. 제네릭이 아닌 ValueTuple을 제네릭이 아닌 Nullable 클래스 같은 정적 클래스라고 생각할지 모르지만, 이 타입은 완전한 구조체이며 어떤 요소도 가지고 있지 않다는 점을 제외하면 다른 튜플 구조체와 똑같이 생겼고 앞서 설명한 모든 인터페이스를 구현한다. 아무런 값이 없음에도 불구하고 모든 너플 값은 (일반적인 동일성 비교와 순차성 비교의 관점에서) 다른 너플 값과 항상 동일하다. 다를 만한 값을 가지고 있지 않으니 어느 정도 이치에 맞는 말이다.

너플은 튜플 리터럴 없이 새로운 ValueTuple<…> 타입의 튜플을 생성할 때 유용하게 사용할 수 있는 정적 메서드들을 가지고 있다. 이러한 메서드는 C# 6에서 튜플을 사용하거나 튜플을 표현하는 방법을 제공하지 않는 언어를 사용하는 경우, 튜플에 담을 요소를 이용하여 튜플 타입을 추론해야 하는 경우(생성자를 호출할 때 모든 타입 인수를 명시적으로 지정해야 한다면 귀찮은 노릇이다.) 유용하게 사용할 수 있다. 예를 들어 C# 6에서 (int, int) 튜플을 생성해야 한다면 다음과 같이 코드를 작성할 수 있다.

var tuple = ValueTuple.Create(5, 10);

C# 팀은 패턴 매칭과 분해에 너플이 상당히 유용하게 사용될 것이라고 넌지시 알려준 바 있다. 하지만 지금 당장은 대단한 쓸모를 가지고 있는 것 같지는 않다.

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