🔠 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은 리터럴 풀을 포함하며, 런타임에 수동 등록도 가능하다
'IT공부' 카테고리의 다른 글
[C#] 추상 클래스와 인터페이스의 차이 (0) | 2025.04.14 |
---|---|
[C#] 오버라이딩 정리 (0) | 2025.04.11 |
[ETC] 자바는 JVM 생략 OK, C#은 왜 .NET까지 묶일까? (0) | 2025.04.10 |
[C++] const T&(읽기 전용 참조), T&&(우변 참조, 이동 가능) (0) | 2025.03.22 |
[C++] 참조값 리턴 (0) | 2025.03.22 |