더북(TheBook)

12.2.3 컴파일러가 Deconstruct 호출을 처리하는 방법

모든 것이 예상대로 수행되는 상황이라면 컴파일러가 Deconstruct 메서드를 결정하는 방법에 대해 많이 고민할 필요가 없다. 하지만 문제 상황에 봉착할 가능성이 있다면 컴파일러의 동작 방식을 이해하는 것이 큰 도움이 된다.

앞서 살펴본 튜플의 분해와 마찬가지로 메서드를 이용한 분해 또한 수행되는 시점은 동일하므로 메서드의 호출 자체에 대해서만 집중적으로 살펴볼 것이다. 다음 예를 보자. 이처럼 분해를 수행해야 한다면 컴파일러는 어떤 작업을 수행할까?

(int x, string y) = target;

이 예제에서는 target이 어떤 타입인지 알 수 없으므로 완전한 예라고 말하기는 어렵다. 하지만 이는 다소 의도적인 측면이 있다. 이 예를 통해서 우리가 알고자 하는 부분은 target의 구체적인 타입과는 무관하기 때문이다. 컴파일러는 이 코드를 다음과 같이 확장한다.

target.Deconstruct(out var tmpX, out var tmpY);
int x = tmpX;
string y = tmpY;

호출할 메서드를 찾고 찾은 메서드를 호출하는 과정은 일반적인 규칙을 그대로 따른다. 그런데 out var처럼 매개변수를 선언한 예는 이전에 본 적이 없을 것이다. 14.2절에서 자세히 살펴볼 것이므로 지금 당장은 out 매개변수에 대한 타입을 추론할 수 있도록 암시적 타입 변수로 선언했다는 것만 알아 두자.

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