더북(TheBook)

앞의 메서드는 문법 사항을 설명하기 위해서 작성한 간단한 항등 함수에 불과하다. 이 메서드를 표현식 본문 메서드로 작성할 수도 있었지만, 반환 부분을 명확히 보여주고자 이와 같이 작성했다.

지금까지는 단순하다. 하지만 세부 사항은 꽤나 복잡하다. 대부분의 경우, 컴파일러는 반환된 종이 조각이 메서드가 반환된 이후에도 여전히 유효한지를 확인한다. 즉, 메서드 내부에서 생성된 종이 조각은 사용할 수 없다.

이를 세부적인 구현 방식을 빌려 설명하자면, 참조를 반환하는 메서드는 해당 메서드의 스택에 저장되는 변수는 반환할 수 없다고 말할 수 있다. 메서드가 반환되는 순간 해당 스택이 모두 제거되어, 더 이상 유효하지 않을 것이기 때문이다. C# 언어의 동작 방식을 설명할 때, 에릭 리퍼트(Eric Lippert)는 스택을 즐겨 이야기하곤 한다. 사실 이 경우는 구현 세부 사항이 언어의 측면에까지 영향을 미친 경우라 할 수 있다. 이러한 내용은 사실 참조 필드가 허용되지 않는 이유와도 일맥상통한다. 따라서 이 중 하나만 이해한다면 다른 하나도 동일한 논리로 이해할 수 있을 것이다.

참조 반환을 사용하여 반환할 수 없는 모든 종류의 변수를 완벽히 살펴보지는 않겠지만, 자주 사용되는 몇 가지 예는 살펴보자.

 

 

유효함

ref 혹은 out 매개변수

참조 타입의 필드

refout 매개변수로 전달받은 구조체의 필드

배열 요소

 

 

유효하지 않음

메서드 내에서 선언한 지역 변수(매개변수 포함)

메서드 내에서 생성한 구조체의 필드

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