C#에서 String과 string의 차이점

2024-07-27

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



C#에서 사전을 값으로 정렬하는 방법

1. Linq 사용하기LINQ(Language Integrated Query)는 C#에 내장된 기능으로, 데이터 쿼리 및 변환을 쉽게 수행할 수 있도록 합니다. 사전을 값으로 정렬하려면 다음과 같은 코드를 사용할 수 있습니다...


C#, .NET 및 성능과 관련된 Type에서 새 개체 인스턴스를 만드는 방법

1. new 키워드 사용:위 코드는 MyClass 형식의 새 인스턴스를 myObject 변수에 할당합니다. new 키워드는 메모리에 새 개체를 할당하고 해당 클래스의 생성자를 호출합니다.2. Activator 클래스 사용:...


C# 반복문에서 break와 continue 사용법

break가장 가까운 바깥쪽 반복문 또는 switch 문을 종료합니다.종료된 문 다음에 오는 문으로 제어 흐름을 이동합니다 (있는 경우).예시:위 코드는 0부터 9까지 숫자를 출력하는 for 루프입니다. 하지만 i가 5가 되면 break 키워드를 만나 루프를 탈출하고 다음 문 (본 예시에서는 없음)으로 이동합니다...



c# .net string

C#, .NET, DateTime을 이용한 나이 계산

해결 방법:DateTime 타입 변수 선언: 생일을 저장할 DateTime 타입 변수 birthday를 선언합니다. 예시: DateTime birthday = new DateTime(1990, 1, 1);DateTime 타입 변수 선언:


C#에서 사전을 값으로 정렬하는 방법

1. Linq 사용하기LINQ(Language Integrated Query)는 C#에 내장된 기능으로, 데이터 쿼리 및 변환을 쉽게 수행할 수 있도록 합니다. 사전을 값으로 정렬하려면 다음과 같은 코드를 사용할 수 있습니다


C#, .NET 및 성능과 관련된 Type에서 새 개체 인스턴스를 만드는 방법

1. new 키워드 사용:위 코드는 MyClass 형식의 새 인스턴스를 myObject 변수에 할당합니다. new 키워드는 메모리에 새 개체를 할당하고 해당 클래스의 생성자를 호출합니다.2. Activator 클래스 사용:


C#, .NET, DateTime을 이용한 나이 계산

해결 방법:DateTime 타입 변수 선언: 생일을 저장할 DateTime 타입 변수 birthday를 선언합니다. 예시: DateTime birthday = new DateTime(1990, 1, 1);DateTime 타입 변수 선언:


C#에서 상대 시간 계산

1. DateTime 구조체 사용DateTime 구조체는 날짜와 시간을 나타내는 데 사용됩니다. DateTime 객체에서 다른 DateTime 객체를 빼면 두 날짜/시간 사이의 차이를 나타내는 TimeSpan 객체를 얻을 수 있습니다