C#에서 String과 string의 차이점
String 클래스
String
은 .NET Framework의 기본 문자열 클래스입니다. 문자열 데이터를 다루기 위한 다양한 메서드와 속성을 제공하며, 다음과 같은 특징을 가집니다.
- 불변:
String
객체는 생성 후 변경할 수 없습니다. 즉, 문자열의 내용을 수정하려면 새로운String
객체를 만들어야 합니다. - 참조 유형:
String
객체는 메모리에 참조로 저장됩니다. 즉, 여러 변수가 동일한String
객체를 참조할 수 있습니다. - 풀링: C# 컴파일러는 자주 사용되는 문자열 리터럴을 풀링하여 성능을 향상시킵니다. 즉, 동일한 문자열 리터럴이 여러 번 사용되면 메모리에 하나의
String
객체만 만들어 여러 변수에서 공유합니다.
string 형식
string
형식은 String
클래스의 별칭입니다. 즉, string
변수를 선언하면 실제로는 String
객체를 참조하게 됩니다. string
형식은 다음과 같은 특징을 가집니다.
- 간결성:
string
형식은String
클래스보다 간결하게 코드를 작성할 수 있도록 합니다. - 편의성:
string
형식은 일상적인 문자열 처리 작업에 편리하게 사용할 수 있도록 여러 메서드와 속성을 제공합니다.
사용 시점
언제 String
클래스를 사용하고 언제 string
형식을 사용해야 하는지 판단하는 것은 상황에 따라 다릅니다. 일반적으로 다음과 같은 지침을 따르는 것이 좋습니다.
- 불변 문자열 데이터를 다루는 경우:
String
클래스를 사용하는 것이 좋습니다.String
객체는 변경할 수 없으므로 데이터 무결성을 보장하는 데 도움이 됩니다. - 문자열 데이터를 자주 변경하거나 처리해야 하는 경우:
string
형식을 사용하는 것이 좋습니다.string
형식은String
클래스보다 편리하고 간결하게 사용할 수 있습니다. - 성능이 중요한 경우:
String
풀링을 활용하여String
클래스를 사용하는 것이 좋습니다.String
풀링은 동일한 문자열 리터럴을 여러 번 사용하는 경우 성능을 향상시킬 수 있습니다.
코드 예시
다음은 String
클래스와 string
형식을 사용하는 코드 예시입니다.
// String 클래스 사용
String str1 = "Hello";
str1 = str1 + " World";
Console.WriteLine(str1); // 출력: Hello World
// string 형식 사용
string str2 = "Hello";
str2 += " World";
Console.WriteLine(str2); // 출력: Hello World
위 코드 예시에서 str1
변수는 String
클래스를 사용하고 str2
변수는 string
형식을 사용합니다. 두 코드 모두 동일한 결과를 출력합니다. 하지만 String
클래스를 사용하는 코드는 문자열을 변경하기 위해 새로운 객체를 만들어야 하므로 좀 더 복잡합니다. 반면에 string
형식을 사용하는 코드는 +=
연산자를 사용하여 문자열을 간편하게 변경할 수 있습니다.
C# 문자열 예제 코드
문자열 선언 및 초기화
// 문자열 리터럴 사용
string str1 = "Hello, World!";
// 문자 변수 사용
char ch = 'A';
string str2 = ch.ToString();
// Formatted 문자열 사용
string str3 = String.Format("This is a formatted string: {0}, {1}", 100, "Example");
문자열 출력
Console.WriteLine(str1); // Hello, World! 출력
Console.WriteLine("This is another string literal.");
문자열 연결
string str1 = "Hello";
string str2 = " World";
string str3 = str1 + str2;
Console.WriteLine(str3); // Hello World 출력
문자열 길이 계산
string str = "This is a string.";
int length = str.Length;
Console.WriteLine("The length of the string is: {0}", length); // 16 출력
문자열 인덱싱
string str = "Hello, World!";
char firstChar = str[0]; // 'H'
char lastChar = str[str.Length - 1]; // '!'
Console.WriteLine("The first character is: {0}", firstChar);
Console.WriteLine("The last character is: {0}", lastChar);
문자열 검색
string str = "This is a string with the word 'example'.";
int index = str.IndexOf("example");
if (index != -1)
{
Console.WriteLine("The word 'example' is found at index: {0}", index);
}
else
{
Console.WriteLine("The word 'example' is not found.");
}
문자열 비교
string str1 = "Hello";
string str2 = "hello";
bool areEqual = str1.Equals(str2, StringComparison.OrdinalIgnoreCase);
Console.WriteLine("Are the strings equal (case insensitive): {0}", areEqual); // True 출력
bool startsWithH = str1.StartsWith("H");
Console.WriteLine("Does the string start with 'H': {0}", startsWithH); // True 출력
문자열 변환
string str = "123";
int number = Int32.Parse(str);
Console.WriteLine("The parsed integer is: {0}", number); // 123 출력
string hexString = "FF";
byte byteValue = Byte.Parse(hexString, NumberStyles.Hexadecimal);
Console.WriteLine("The parsed byte value is: {0}", byteValue); // 255 출력
문자열 서식 지정
string name = "John Doe";
int age = 30;
string formattedString = String.Format("Name: {0}, Age: {1}", name, age);
Console.WriteLine(formattedString); // Name: John Doe, Age: 30 출력
정규식 사용
string str = "This is a string with phone numbers (123) 456-7890 and (987) 654-3210.";
Regex phoneRegex = new Regex("\\d{3}-\\d{3}-\\d{4}");
MatchCollection matches = phoneRegex.Matches(str);
foreach (Match match in matches)
{
Console.WriteLine("Phone number found: {0}", match.Value);
}
StringBuilder
클래스는 불변인 String
객체와 달리 변경 가능한 문자열 데이터를 만들 수 있도록 합니다.
장점:
- 효율성:
StringBuilder
는 문자열을 여러 번 반복적으로 연결하거나 수정해야 하는 경우String
클래스보다 더 효율적입니다. - 편의성:
StringBuilder
는 문자열 조작을 위한 다양한 메서드를 제공하여 편리하게 사용할 수 있습니다.
예제:
StringBuilder sb = new StringBuilder();
sb.Append("Hello, ");
sb.Append("World!");
Console.WriteLine(sb.ToString()); // Hello, World! 출력
C# 6.0부터 도입된 문자열 보간 기능을 사용하여 문자열 리터럴을 간결하게 작성할 수 있습니다.
- 간결성: 문자열 리터럴 내에 식을 직접 포함하여 코드를 간결하게 작성할 수 있습니다.
- 가독성: 코드가 더욱 명확하고 읽기 쉬워집니다.
int age = 30;
string name = "John Doe";
Console.WriteLine($"Hello, {name}! You are {age} years old."); // Hello, John Doe! You are 30 years old. 출력
FormattableString 클래스
FormattableString
클래스는 사용자 정의 서식 지정 옵션을 제공하여 문자열을 서식 지정하는 데 유연성을 제공합니다.
- 유연성: 다양한 서식 옵션을 사용하여 문자열을 원하는 대로 서식 지정할 수 있습니다.
- 제어력: 서식 지정 방식을 직접 제어할 수 있어 더욱 정교한 서식이 가능합니다.
int population = 1000000;
string cityName = "New York";
Console.WriteLine($"{cityName:N0} has a population of {population:N0} people."); // New York has a population of 1,000,000 people. 출력
ASCII 코드 및 유니코드
문자열을 직접 ASCII 코드 또는 유니코드 값으로 작업해야 하는 경우 해당 문자의 코드 값을 사용하여 문자열을 만들 수 있습니다.
char c1 = 'A'; // ASCII 코드 65
char c2 = '\u00A0'; // 유니코드 공백 문자
string str = $"{c1}{c2}Hello, World!";
Console.WriteLine(str); // A Hello, World! 출력
바이트 배열
문자열을 바이트 배열로 변환하거나 바이트 배열에서 문자열을 추출해야 하는 경우 Encoding
클래스를 사용할 수 있습니다.
string str = "Hello, World!";
byte[] bytes = Encoding.UTF8.GetBytes(str);
string newStr = Encoding.UTF8.GetString(bytes);
Console.WriteLine(newStr); // Hello, World! 출력
c# .net string