문자열 정의 및 특징
C# 언어에서 문자열(String) 타입은 일반적으로 사용되는 데이터 타입 중 하나이며, 기술적으로는 참조 타입이지만 값 타입처럼 동작하는 독특한 특성을 가지고 있다. 문자열의 기본 정의 및 특징은 다음과 같다.
| 구분 | 설명 |
|---|---|
| 타입 분류 | 참조 타입이다. |
| 데이터 저장 | 문자열 데이터 자체는 힙 메모리에 저장된다. |
| 변수 역할 | string 변수 자체는 힙에 있는 실제 데이터의 주소를 스택에 저장한다. |
| 기본 타입 분류 | C# 언어의 기본 데이터 타입 15가지 중 하나로, 문자열 타입으로 분류된다. |
문자열 불변성
문자열의 가장 중요한 특징은 불변성(Immutability)이다.
-
불변성 원리: string 인스턴스가 한 번 생성되면 그 내용을 변경할 수 없다.
-
수정 시 동작: 문자열에 변경을 가하는 연산을 수행하면, 기존 객체가 변경되는 것이 아니라 내용이 수정된 새로운 문자열 객체가 힙에 생성되고, 변수는 이 새로운 객체를 가리키게 된다.
-
값 타입과의 유사성: 불변성 덕분에 string 변수를 다른 변수에 할당할 때, 마치 값 타입처럼 복사된 값이 할당되는 것처럼 느껴져 사용이 편리하다.
-
연산자 및 메모리 효율성
string 타입은 개발자의 편의를 위해 연산자가 오버로딩 되어 있다.
-
동등 비교(
==): 참조 타입의 일반적인==연산이 주소 비교인 것과 달리, string 타입의==연산자는 내용 즉, 문자열의 값이 같은지를 비교하도록 오버로딩 되어 있다. 이는 값 타입의 동작과 유사하다. -
문자열 풀링(String Interning): 컴파일러와 공용 언어 런타임(Common Language Runtime, CLR)은 메모리 사용 효율을 높이기 위해 문자열 풀링 기능을 제공한다. 이는 동일한 리터럴 문자열이 코드 내에서 여러 번 사용될 경우, 힙 메모리의 문자열 풀(String Pool) 영역에 그 문자열을 한 번만 저장하고, 해당 문자열을 사용하는 모든 변수가 같은 객체를 참조하도록 한다.
문자열 메소드 종류
C# 언어는 문자열을 가공하기 위해 클래스 안에 구현된 다양한 기능을 제공하며, 이는 다음과 같다.
| 메소드 | 설명 |
|---|---|
| IndexOf() | 현재 문자열 내에서 찾으려고 하는 지정된 문자 또는 문자열의 위치를 찾는다. |
| LastIndexOf() | 현재 문자열 내에서 찾으려고 하는 지정된 문자 또는 문자열의 위치를 뒤에서부터 찾는다. |
| StartsWith() | 현재 문자열이 지정된 문자열로 시작되는지를 평가한다. |
| EndsWith() | 현재 문자열이 지정된 문자열로 끝나는지를 평가한다. |
| Contains() | 현재 문자열이 지정된 문자열을 포함하는지를 평가한다. |
| Replace() | 현재 문자열에서 지정된 문자열이 다른 지정된 문자열로 모두 바뀐 새 문자열을 반환한다. |
| ToLower() | 현재 문자열의 모든 대문자를 소문자로 바꾼 새 문자열을 반환한다. |
| ToUpper() | 현재 문자열의 모든 소문자를 대문자로 바꾼 새 문자열을 반환한다. |
| Insert() | 현재 문자열의 지정된 위치에 지정된 문자열이 삽입된 새 문자열을 반환한다. |
| Remove() | 현재 문자열의 지정된 위치로부터 지정된 수만큼의 문자가 삭제된 새 문자열을 반환한다. |
| Trim() | 현재 문자열의 앞/뒤에 있는 공백을 삭제한 새 문자열을 반환한다. |
| TrimStart() | 현재 문자열의 앞에 있는 공백을 삭제한 새 문자열을 반환한다. |
| TrimEnd() | 현재 문자열의 뒤에 있는 공백을 삭제한 새 문자열을 반환한다. |
| Split() | 지정된 문자를 기준으로 현재 문자열을 분리한 다음 분리한 문자열의 배열을 반환한다. |
| SubString() | 현재 문자열의 지정된 위치로부터 지정된 수만큼의 문자로 이루어진 새 문자열을 반환한다. |
성능 및 대안
문자열은 불변이기에, 문자열 연결 + 연산을 반복하면 매번 새로운 객체가 힙에 생성되고 가비지 컬렉터 부하가 발생하여 성능이 저하된다. 이에 대한 대안으로 반복적인 문자열 조작이나 연결 작업이 필요한 경우, System.Text.StringBuilder 클래스를 사용하는 것이 성능 상 유리하다.
- StringBuilder 클래스: 내부적으로 가변적인 버퍼를 사용하여 문자열을 효율적으로 수정할 수 있게 한다.