C#에서 지정된 문자열에 대한 시스템 참조(system's reference)를 검색하려면 string.Intern() 메서드를 사용합니다. 이 메서드는 CLR(공용 언어 런타임)의 인턴 풀(intern pool)에서 해당 문자열과 동일한 값을 가진 참조를 찾아 반환하며, 풀에 존재하지 않으면 새로 등록한 후 그 참조를 돌려줍니다.
string.Intern()의 동작 원리
인턴 풀은 컴파일 타임에 리터럴 문자열이 자동으로 저장되는 해시 테이블입니다. 동일한 내용의 문자열이 여러 번 생성되더라도 Intern 메서드를 사용하면 메모리상의 단일 인스턴스를 공유하게 되어 메모리 사용량을 줄이고 문자열 비교 성능을 향상시킬 수 있습니다.
예제 1
using System;
public class Demo{
public static void Main(string[] args){
string str1 = "David";
string str2 = string.Intern(str1);
Console.WriteLine("String1 = "+str1);
Console.WriteLine("System reference of String1 = "+str2);
}
}출력 결과
String1 = David System reference of String1 = David
위 예제에서 string.Intern(str1)은 문자열 "David"의 시스템 참조를 반환하므로 str2에는 동일한 값이 저장됩니다.
예제 2
이번에는 두 개의 서로 다른 문자열 변수를 사용해 Intern 메서드가 참조를 어떻게 재할당하는지 살펴보겠습니다.
using System;
public class Demo{
public static void Main(string[] args){
string str1 = "50";
string str2 = "100";
Console.WriteLine("String1 = "+str1);
Console.WriteLine("String2 = "+str2);
str2 = string.Intern(str1);
Console.WriteLine("System reference of String1 = "+str2);
}
}출력 결과
String1 = 50 String2 = 100 System reference of String1 = 50
실행 결과를 보면 str2가 처음에는 "100"을 담고 있었지만, string.Intern(str1) 호출 이후 str1("50")의 시스템 참조로 대체된 것을 확인할 수 있습니다.
정리
string.Intern()은 문자열 리터럴의 공유 참조를 활용하여 메모리를 절약하고 ReferenceEquals를 통한 빠른 참조 비교를 가능하게 하는 유용한 메서드입니다. 다만 런타임에 동적으로 생성된 문자열에 남용하면 인턴 풀이 불필요하게 커질 수 있으므로, 반복적으로 사용되는 고정 문자열에 적용하는 것이 좋습니다.