분산 시스템이 점차 대중화됨에 따라 서로 다른 시스템 사이에데이터를 주고받아야 하는 일이 많아
졌다. 이는 이질적인 플랫폼과 서로 다른 언어로 개발된 프로그램 사이에서 데이터를 주고 받아야 하
는 일이 만하졌다는 것을 의미하기도 한다. 이러한 차이를 극복하기 위해서 이름이나 문자열 식별자
에 의존하는 간단한 라이브러리들이 많이 사용되곤 한다. 하지만 이 같은 방식이 간편할지는 몰라도
그에 준하는 추가 비용이 발생한다는 것을 잊어서는 안 된다. 대표적인 단점이 바로 타입 정보를
손실한다는 것이다. 이로 인해 타입 정보를 활용하여 추가 기능을 제공하는 개발 도구의 도움을 더
이상 받지 못하며 정적 타입 언어의 주요 장점을 상실하는 문제도 있다.
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)을 사용하더라도 항상 로컬 이름