보다시피 이 예제에서는 Deconstruct 자체를 이를 사용하는 코드와 동일한 클래스 내에 두고 private 확장 메서드로 선언했다. 하지만 이보다는 다른 확장 메서드와 마찬가지로 public이나 internal로 선언하는 것이 좀 더 일반적이다.
DateTime을 분해할 때 날짜 이외에 다른 정보도 가지고 오려면 어떻게 해야 할까? 이때 오버로딩을 사용하면 유용하다. 서로 다른 매개변수 목록을 가진 두 개의 메서드를 정의해 두면 컴파일러가 매개변수의 개수를 기반으로 어떤 메서드를 사용할지 결정할 것이다. 이제 DateTime으로부터 날짜와 시간을 함께 분해할 수 있는 확장 메서드를 추가해 보자. 그리고 두 메서드를 이용하여 어떻게 다른 값을 가져올 수 있는지 확인해 보자.
예제 12-9 Deconstruct 오버로드 사용 ▶ DateTimeDeconstruction2.cs
➊
static void Deconstruct(
this DateTime dateTime,
out int year, out int month, out int day) =>
(year, month, day) =
(dateTime.Year, dateTime.Month, dateTime.Day);
➋
static void Deconstruct(
this DateTime dateTime,
out int year, out int month, out int day,
out int hour, out int minute, out int second) =>
(year, month, day, hour, minute, second) =
(dateTime.Year, dateTime.Month, dateTime.Day,
dateTime.Hour, dateTime.Minute, dateTime.Second);
static void Main()
{
DateTime birthday = new DateTime(1976, 6, 19);
DateTime now = DateTime.UtcNow;
var (year, month, day, hour, minute, second) = now; ----- 여섯 개의 값으로 인스턴스를 분해하는 Deconstruct 사용
(year, month, day) = birthday; ----- 세 개의 값으로 인스턴스를 분해하는 Deconstruct 사용
}
➊ 날짜를 연/월/일로 분해
➋ 날짜를 연/월/일/시/분/초로 분해