분산 시스템이 점차 대중화됨에 따라 서로 다른 시스템 사이에데이터를 주고받아야 하는 일이 많아

졌다. 이는 이질적인 플랫폼과 서로 다른 언어로 개발된 프로그램 사이에서 데이터를 주고 받아야 하

는 일이 만하졌다는 것을 의미하기도 한다. 이러한 차이를 극복하기 위해서 이름이나 문자열 식별자

에 의존하는 간단한 라이브러리들이 많이 사용되곤 한다. 하지만 이 같은 방식이 간편할지는 몰라도

그에 준하는 추가 비용이 발생한다는 것을 잊어서는 안 된다. 대표적인 단점이 바로 타입 정보를

손실한다는 것이다. 이로 인해 타입 정보를 활용하여 추가 기능을 제공하는 개발 도구의 도움을 더

이상 받지 못하며 정적 타입 언어의 주요 장점을 상실하는 문제도 있다.

C# 언어 설계팀은 이러한 문제를 인지하고 C# 6.0에 nameof()라는 연산자를 추가했다. 이 키워드의

역할은 심볼 그 자체를 해당 심볼을 포함하는 문자열로 대체해준다. 가장 일반적인 활용 예의 하나로

INotifyPropertyChanged 인터페이스의 구현부를 살펴보자.

public string Name
{
		get
		{
				return name;
		}
		set
		{
				if (value != name)
				{
						name = value;
						PropertyChanged?.Invoke(this,
								new PropertyChangedEventArgs(nameof(Name)));
				}
		}
}

private string name;

nameof() 연산자를 사용했기 때문에 속성의 이름을 변경할 경우 이벤트의 인자로 전달해야 하는

문자열도 쉽게 변경할 수 있다. 이것이 nameof()의 가장 간단한 사용 예다.

nameof()는 심볼의 이름을 평가하며, 타입, 변수, 인터페이스, 네임스페이스에 대하여 사용할 수 있

다. 완전히 정규화된 이름을 사용할 수도 있지만 정규화되지 않은 이름도 제한 없이 사용할 수 있다.

다만 제네릭 타입을 사용할 경우에는 부분적으로 제약이 있어서 모든 타입 매개변수를 지정한 닫힌

제네릭 타입만을 사용할 수 있다.

nameof() 연산자는 이처럼 다양하게 활용할 수 있고 항상 로컬 이름을 문자열로 반환하는 역할을

수행한다. 설사 완전히 정규화된 이름 (예: System.Int.MaxValue)을 사용하더라도 항상 로컬 이름