IT공부

[C#] 문자열 리터럴 vs 참조 타입 문자열

shine94 2025. 4. 10. 20:00

🔠 1. string은 어떤 타입인가?

string은 참조 타입 (Reference Type)

System.String 클래스의 alias

immutable 불변

 

 

🧳 2. 문자열 리터럴 vs 힙에 생성된 string 참조 타입 객체

   문자열 리터럴
"..."
힙에 생성된 string 참조 타입 객체
new string("...")
생성 시점 컴파일 타임에 intern pool 등록 런타임에 힙에 새 객체 생성
메모리 위치 Intern Pool (공유) Heap (새로운 인스턴스)
ReferenceEquals 비교 결과 true (같은 리터럴이면) false (항상 다른 참조)

 

 

📂 3. Intern Pool이란?

.NET 런타임(CLR)이 중복된 문자열을 하나만 저장해서 재사용하는 공용 문자열 저장소

 

[사용 이유]

(1) 메모리 낭비 방지("hello"를 100번 써도 하나만 저장)

(2) 문자열 비교도 빠르게 처리(참조 비교 가능)

 

  리터럴 풀 (Literal Pool) Intern Pool
대상 문자열 소스 코드에 있는 "..." 리터럴 수동 등록 문자열
등록 시점 컴파일 타임 런타임
등록 방법 자동 자동(리터럴), 수동(string.Intern())
포함 관계 Intern Pool의 부분 집합 리터럴 풀 포함 + 추가 등록 가능

 

 

🧬 4. IL 코드로 본 차이

 

 

⚔️ 5. C 언어와의 비교

C언어

   같은 리터럴이 같은 주소를 가리킬 수 있지만, 보장되지 않는다

   컴파일러 구현에 따라 리터럴 풀을 사용할 수도 있고, 중복 저장될 수도 있다

   표준상 문자열 리터럴은 읽기 전용이며, 중복 제거 여부는 UB(Undefined Behavior)에 가깝다

 

C#

   string interning(인터닝: 이미 생성된 객체를 재사용하는 기법)이라는 개념 존재한다

   같은 리터럴은 프로그램 내에서 단 하나만 존재한다

   컴파일러가 같은 문자열을 Intern Pool에 자동으로 등록하며, 동일한 참조 공유한다

 

🏁 정리하며

✔️ string은 참조 타입이며 immutable이다

✔️ 문자열 리터럴은 컴파일 타임에 Intern Pool에 자동 등록된다

✔️ new string("...")은 Intern Pool과 무관하게 항상 새 객체가 생성된다

✔️ Intern Pool은 리터럴 풀을 포함하며, 런타임에 수동 등록도 가능하다