다음을 통해 공유


문자열 기본 사항(C# 프로그래밍 가이드)

업데이트: 2007년 11월

문자열은 값이 텍스트인 String 형식의 개체입니다. 텍스트는 내부적으로 Char 개체의 읽기 전용 컬렉션으로 저장되고 이 컬렉션의 각 개체는 UTF-16으로 인코딩된 유니코드 문자 하나를 나타냅니다. C 및 C++와 달리 C# 문자열 끝에는 null 종결 문자가 없습니다. 따라서 C# 문자열은 포함된 null 문자('\0')를 제한 없이 포함할 수 있습니다. 문자열 길이는 문자가 유니코드 서로게이트 쌍에서 형성되었는지 여부에 관계없이 문자 수를 나타냅니다. 문자열에서 개별 유니코드 코드 포인트에 액세스하려면 StringInfo 개체를 사용합니다.

문자열과 System.String

C#에서 string 키워드는 String의 별칭입니다. 따라서 String 및 string은 동일하며 원하는 명명 규칙을 사용할 수 있습니다. String 클래스는 문자열의 안전한 작성, 조작 및 비교에 사용할 수 있는 많은 메서드를 제공합니다. 또한 C# 언어는 일부 연산자를 오버로드하여 일반적인 문자열 작업을 간편하게 수행할 수 있도록 합니다. 키워드에 대한 자세한 내용은 string(C# 참조)을 참조하십시오. 형식 및 형식 메서드에 대한 자세한 내용은 String을 참조하십시오.

문자열 선언 및 초기화

다음 예제처럼 다양한 방식으로 문자열을 선언하고 초기화할 수 있습니다.

// Declare without initializing.
string message1;

// Initialize to null.
string message2 = null;

// Initialize as an empty string.
// Use the Empty constant instead of the literal "".
string message3 = System.String.Empty;

//Initialize with a regular string literal.
string oldPath = "c:\\Program Files\\Microsoft Visual Studio 8.0";

// Initialize with a verbatim string literal.
string newPath = @"c:\Program Files\Microsoft Visual Studio 9.0";

// Use System.String if you prefer.
System.String greeting = "Hello World!";

// In local variables (i.e. within a method body)
// you can use implicit typing.
var temp = "I'm still a strongly-typed System.String!";

// Use a const string to prevent 'message4' from
// being used to store another string value.
const string message4 = "You can't get rid of me!";

// Use the String constructor only when creating
// a string from a char*, char[], or sbyte*. See
// System.String documentation for details.
char[] letters = { 'A', 'B', 'C' };
string alphabet = new string(letters);

문자열을 문자 배열로 초기화할 경우 이외에는 new 연산자를 사용하여 문자열 개체를 만들지 마십시오.

Empty 상수 값으로 문자열을 초기화하여 문자열 길이가 0인 String 개체를 새로 만듭니다. 길이가 0인 문자열의 문자열 리터럴 표현은 ""입니다. 문자열을 null 대신 Empty 값으로 초기화하면 NullReferenceException 발생 위험을 줄일 수 있습니다. 문자열에 액세스하기 전에 문자열 값을 확인하려면 IsNullOrEmpty(String) 메서드를 사용합니다.

문자열 개체의 불변성

문자열 개체는 한 번 만들어지면 변경할 수 없는 변경 불가능 개체입니다. 문자열을 수정하는 것처럼 보이는 모든 String 메서드 및 C# 연산자도 실제로는 새 문자열 개체로 결과를 반환합니다. 다음 예제에서 s1과 s2의 내용이 결합되어 단일 문자열이 만들어질 때, 두 원본 문자열은 변경되지 않습니다. += 연산자는 결합된 내용을 포함하는 새 문자열을 만듭니다. 새 개체는 s1 변수에 할당되고 s1에 할당되었던 원래 개체는 해당 개체에 대한 참조를 유지하는 다른 변수가 없으므로 가비지 수집을 위해 해제됩니다.

string s1 = "A string is more ";
string s2 = "than the sum of its chars.";

// Concatenate s1 and s2. This actually creates a new
// string object and stores it in s1, releasing the
// reference to the original object.
s1 += s2;

System.Console.WriteLine(s1);
// Output: A string is more than the sum of its chars.

문자열 "수정"이 실제로는 새 문자열 생성이므로 문자열에 대한 참조를 만들 때 주의해야 합니다. 문자열에 대한 참조를 만든 다음 원래 문자열을 "수정"할 경우 해당 참조는 문자열을 수정할 때 만든 새 개체 대신 원래 개체를 계속해서 가리킵니다. 다음 코드에서는 이러한 동작을 보여 줍니다.

string s1 = "Hello ";
string s2 = s1;
s1 += "World";

System.Console.WriteLine(s2);
//Output: Hello

원래 문자열에 대한 검색 및 바꾸기 작업과 같은 수정에 기반하여 새 문자열을 만드는 방법에 대한 자세한 내용은 방법: 문자열 내용 수정(C# 프로그래밍 가이드)을 참조하십시오.

일반 문자열 및 약어 문자열 리터럴

다음 예제에서 볼 수 있는 것처럼, C#에서 제공하는 이스케이프 문자를 포함해야 하는 경우 일반 문자열 리터럴을 사용합니다.

string columns = "Column 1\tColumn 2\tColumn 3";
//Output: Column 1        Column 2        Column 3

string rows = "Row 1\r\nRow 2\r\nRow 3";
/* Output:
  Row 1
  Row 2
  Row 3
*/

string title = "\"The \u00C6olean Harp\", by Samuel Taylor Coleridge";
//Output: "The Æolean Harp", by Samuel Taylor Coleridge

문자열 텍스트에 파일 경로 등의 백슬래시 문자가 포함되는 경우에는 사용 편의성과 가독성을 향상시킬 수 있도록 약어 문자열을 사용합니다. 약어 문자열은 줄 바꿈 문자를 문자열 텍스트의 일부로 포함하므로 여러 줄 문자열을 초기화하는 데 사용할 수 있습니다. 약어 문자열 내에 인용 부호를 포함하려면 큰따옴표를 사용합니다. 다음 예제에서는 약어 문자열의 몇 가지 일반적인 용도를 보여 줍니다.

         string filePath = @"C:\Users\scoleridge\Documents\";
         //Output: C:\Users\scoleridge\Documents\

         string text = @"My pensive SARA ! thy soft cheek reclined
Thus on mine arm, most soothing sweet it is
To sit beside our Cot,...";
         /* Output:
         My pensive SARA ! thy soft cheek reclined
            Thus on mine arm, most soothing sweet it is
            To sit beside our Cot,... 
         */

         string quote = @"Her name was ""Sara.""";
         //Output: Her name was "Sara."

문자열 이스케이프 시퀀스

이스케이프 시퀀스

문자 이름

유니코드 인코딩

\'

작은따옴표

0x0027

\"

큰따옴표

0x0022

\\

백슬래시

0x005C

\0

Null

0x0000

\a

경고

0x0007

\b

백스페이스

0x0008

\f

폼 피드

0x000C

\n

줄 바꿈

0x000A

\r

캐리지 리턴

0x000D

\t

가로 탭

0x0009

\U

서로게이트 쌍에 대한 유니코드 이스케이프 시퀀스

\Unnnnnnnn

\u

유니코드 이스케이프 시퀀스

\u0041 = "A"

\v

세로 탭

0x000B

\x

가변 길이를 특징으로 하는 "\u"와 유사한 유니코드 이스케이프 시퀀스

\x0041 = "A"

참고:

컴파일 타임에 약어 문자열은 동일한 이스케이프 시퀀스를 갖는 보통 문자열로 변환됩니다. 따라서 약어 문자열을 디버거 조사식 창에서 보면 소스 코드의 약어 버전이 아니라 컴파일러가 추가한 이스케이프 문자를 보게 됩니다. 예를 들어 약어 문자열 @”C:\files.txt”는 조사식 창에 “C:\\files.txt”로 나타납니다.

형식 문자열

형식 문자열은 런타임에 동적으로 내용을 결정할 수 있는 문자열입니다. 정적 Format 메서드를 사용하고 런타임에 다른 값으로 대체될 내용에 해당하는 자리 표시자를 중괄호로 묶는 방법으로 형식 문자열을 만들 수 있습니다. 다음 예제에서는 형식 문자열을 사용하여 루프의 각 반복 결과를 출력합니다.

class FormatString
{
    static void Main()
    {
        // Get user input.
        System.Console.WriteLine("Enter a number");
        string input = System.Console.ReadLine();

        // Convert the input string to an int.
        int j;
        System.Int32.TryParse(input, out j);

        // Write a different string each iteration.
        string s;
        for (int i = 0; i < 10; i++)
        {
            // A simple format string with no alignment formatting.
            s = System.String.Format("{0} times {1} = {2}", i, j, (i * j));
            System.Console.WriteLine(s);
        }

        //Keep the console window open in debug mode.
        System.Console.ReadKey();
    }
}

WriteLine 메서드의 한 오버로드는 형식 문자열을 매개 변수로 사용합니다. 따라서 메서드를 명시적으로 호출하지 않고 형식 문자열 리터럴을 포함할 수 있습니다. 하지만 WriteLine 메서드를 사용하여 Visual Studio 출력 창에 디버그 출력을 표시하는 경우에는 WriteLine에 형식 문자열이 아닌 문자열만 사용할 수 있으므로 Format 메서드를 명시적으로 호출해야 합니다. 형식 문자열에 대한 자세한 내용은 형식 지정을 참조하십시오.

부분 문자열

부분 문자열은 문자열에 포함된 임의의 문자 시퀀스입니다. Substring 메서드를 사용하면 원래 문자열의 일부를 새 문자열로 만들 수 있습니다. IndexOf 메서드를 사용하면 하나 이상의 부분 문자열 항목을 검색할 수 있습니다. Replace 메서드를 사용하면 지정된 부분 문자열의 모든 항목을 새 문자열로 바꿀 수 있습니다. Substring 메서드와 마찬가지로 Replace는 실제로 새 문자열을 반환하고 원래 문자열을 수정하지 않습니다. 자세한 내용은 방법: 문자열 처리 메서드를 사용하여 문자열 검색(C# 프로그래밍 가이드)방법: 문자열 내용 수정(C# 프로그래밍 가이드)을 참조하십시오.

string s3 = "Visual C# Express";
System.Console.WriteLine(s3.Substring(7, 2));
// Output: "C#"

System.Console.WriteLine(s3.Replace("C#", "Basic"));
// Output: "Visual Basic Express"

// Index values are zero-based
int index = s3.IndexOf("C");
// index = 7

개별 문자 액세스

다음 예제에서 볼 수 있는 것처럼, 인덱스 값을 지정하는 배열 표기법을 사용하여 개별 문자에 읽기 전용으로 액세스할 수 있습니다.

string s5 = "Printing backwards";

for (int i = 0; i < s5.Length; i++)
{
    System.Console.Write(s5[s5.Length - i - 1]);
}
// Output: "sdrawkcab gnitnirP"

String 메서드가 문자열의 개별 문자를 수정할 수 있는 기능을 제공하지 않는 경우 StringBuilder 개체를 사용하여 개별 문자를 "현재 위치"에서 수정한 후 StringBuilder 메서드를 사용하여 결과를 저장하는 새 문자열을 만들 수 있습니다. 다음 예제에서는 원래 문자열을 특정 방식으로 수정한 다음 나중에 사용할 수 있도록 결과를 저장한다고 가정합니다.

string question = "hOW DOES mICROSOFT wORD DEAL WITH THE cAPS lOCK KEY?";
System.Text.StringBuilder sb = new System.Text.StringBuilder(question);

for (int j = 0; j < sb.Length; j++)
{
    if (System.Char.IsLower(sb[j]) == true)
        sb[j] = System.Char.ToUpper(sb[j]);
    else if (System.Char.IsUpper(sb[j]) == true)
        sb[j] = System.Char.ToLower(sb[j]);
}
// Store the new string.
string corrected = sb.ToString();
System.Console.WriteLine(corrected);
// Output: How does Microsoft Word deal with the Caps Lock key?            

Null 문자열 및 빈 문자열

빈 문자열은 문자가 들어 있지 않은 System.String 개체의 인스턴스입니다. 빈 문자열은 다양한 프로그래밍 시나리오에서 빈 텍스트 필드를 나타내는 데 종종 사용됩니다. 빈 문자열은 유효한 System.String 개체이므로 빈 문자열에서 메서드를 호출할 수 있습니다. 빈 문자열은 다음과 같이 초기화됩니다.

string s = String.Empty;

이와 반대로, null 문자열은 System.String 개체의 인스턴스를 참조하지 않으며 null 문자열에서 메서드를 호출하려고 하면 항상 NullReferenceException이 발생합니다. 그러나 다른 문자열과의 연결 및 비교 연산에서는 null 문자열을 사용할 수 있습니다. 다음 예제에서는 null 문자열을 참조할 때 예외가 throw되는 경우와 그렇지 않은 경우를 보여 줍니다.

static void Main()
{
    string str = "hello";
    string nullStr = null;
    string emptyStr = "a";

    string tempStr = str + nullStr; // tempStr = "hello"
    bool b = (emptyStr == nullStr);// b = false;
    string newStr = emptyStr + nullStr; // creates a new empty string
    int len = nullStr.Length; // throws NullReferenceException

}

빠른 문자열 생성을 위해 StringBuilder 사용

.NET의 문자열 작업은 매우 최적화되어 있어 대부분의 경우 성능에 영향을 미치지 않습니다. 하지만 수백 번이나 수천 번 이상 실행되는 루프 같은 일부 시나리오에서는 문자열 작업이 성능에 영향을 줄 수 있습니다. StringBuilder 클래스는 프로그램에서 수행할 문자열 조작 작업이 많을 경우 성능을 향상시켜 주는 문자열 버퍼를 만듭니다. 또한 StringBuilder 문자열을 사용하면 개별 문자를 다시 할당할 수 있습니다. 이러한 기능은 기본 제공 데이터 형식에서는 지원하지 않습니다. 예를 들어 다음 코드에서는 새 문자열을 만들지 않고 문자열의 내용을 변경합니다.

System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet");
sb[0] = 'C';
System.Console.WriteLine(sb.ToString());
System.Console.ReadLine();

//Outputs Cat: the ideal pet

이 예제에서는 StringBuilder 개체를 사용하여 숫자 형식의 집합에서 문자열을 만듭니다.

class TestStringBuilder
{
    static void Main()
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        // Create a string composed of numbers 0 - 9
        for (int i = 0; i < 10; i++)
        {
            sb.Append(i.ToString());
        }
        System.Console.WriteLine(sb);  // displays 0123456789

        // Copy one character of the string (not possible with a System.String)
        sb[0] = sb[9];

        System.Console.WriteLine(sb);  // displays 9123456789
    }
}

문자열, 확장 메서드 및 LINQ

String 형식은 IEnumerable<T>을 구현하기 때문에 문자열에서 Enumerable 클래스에 정의된 확장 메서드를 사용할 수 있습니다. 시각적인 혼란을 피하기 위해 이러한 메서드는 String 형식에 대한 IntelliSense에서 제외되어 있지만 여전히 사용할 수 있습니다. 또한 문자열에 LINQ 쿼리 식을 사용할 수도 있습니다. 자세한 내용은 LINQ 및 문자열을 참조하십시오.

참고 항목

작업

방법: 정규식을 사용하여 문자열 검색(C# 프로그래밍 가이드)

방법: 문자열 처리 메서드를 사용하여 문자열 검색(C# 프로그래밍 가이드)

방법: 문자열 분할(C# 프로그래밍 가이드)

개념

C# 프로그래밍 가이드

기타 리소스

문자열 구문 분석