연습 - 문자 이스케이프 시퀀스를 사용하여 문자열 결합

완료됨

영어와 일본어로 청구서를 생성하는 명령줄 도구의 모형을 만들도록 요청을 받았다고 가정합니다. 아직 송장을 생성하는 실제 기능을 빌드할 필요는 없습니다. 승인을 위해 청구 부서의 내부 고객에게 명령줄 인터페이스를 제공하면 됩니다. 관리자가 도구의 현재 진행 상태를 돋보이게 보여주는 서식을 추가하라고 요청했습니다. 또한 일본어 사용자에게 일본어로 송장 생성 방법을 알려주는 지침을 제공하라고 요청했습니다.

연습 - C#에서 리터럴 문자열 형식 지정

이 연습에서는 특수 문자를 표시하고 다양한 유형의 형식 지정을 출력에 추가하는 다양한 기술을 알아봅니다.

문자 이스케이프 시퀀스

이스케이프 문자 시퀀스는 문자열의 출력에 영향을 주는 특수 문자를 삽입하기 위한 런타임에 대한 명령입니다. C#에서 이스케이프 문자 시퀀스는 백슬래시(\)로 시작하고 이스케이프할 문자가 뒤에 추가됩니다. 예를 들어 \n 시퀀스는 새 줄을 추가하고 \t 시퀀스는 탭을 추가합니다.

다음 코드에서는 이스케이프 문자 시퀀스를 사용하여 줄 바꿈 및 탭을 추가합니다.

Console.WriteLine("Hello\nWorld!");
Console.WriteLine("Hello\tWorld!");

코드를 실행하면 다음과 같은 출력이 표시됩니다.

Hello
World!
Hello   World!

리터럴 문자열에 큰따옴표를 삽입해야 하는 경우 어떻게 하나요? 문자 이스케이프 시퀀스를 사용하지 않는 경우 문자열을 중간에 종료하려는 것으로 간주되기 때문에 컴파일러를 혼란스럽게 합니다. 컴파일러는 두 번째 큰따옴표 다음에 있는 문자의 용도를 이해하지 못합니다.

Console.WriteLine("Hello "World"!");

.NET 편집기는 World 아래에 빨간색 물결선을 배치합니다. 하지만 코드를 실행하면 다음과 같은 출력이 표시됩니다.

(1,27): error CS1003: Syntax error, ',' expected
(1,27): error CS0103: The name 'World' does not exist in the current context
(1,32): error CS1003: Syntax error, ',' expected

이 상황을 처리하려면 \" 이스케이프 시퀀스를 사용합니다.

Console.WriteLine("Hello \"World\"!");

위의 코드를 실행하면 다음과 같은 출력이 표시됩니다.

Hello "World"!

파일 경로 표시 등 다른 용도로 백슬래시를 사용해야 하는 경우 어떻게 되나요?

Console.WriteLine("c:\source\repos");

불행히도 C#에서는 백슬래시가 이스케이프 시퀀스에 예약되어 있습니다. 따라서 코드를 실행하면 컴파일러는 다음 오류를 표시합니다.

(1,22): error CS1009: Unrecognized escape sequence

\s 시퀀스에 문제가 있습니다. \r은 캐리지 리턴의 유효한 이스케이프 시퀀스이므로 오류를 생성하지 않습니다. 그러나 이 컨텍스트에서 캐리지 리턴을 사용하지 않으려고 합니다.

이 문제를 해결하려면 \\를 사용하여 단일 백슬래시를 표시합니다.

Console.WriteLine("c:\\source\\repos");

백슬래시 문자를 이스케이프하면 의도한 출력이 생성됩니다.

c:\source\repos

문자 이스케이프 시퀀스를 사용하여 출력 형식 지정

  1. .NET 편집기에서 모든 코드를 선택한 다음, Delete 또는 Backspace 키를 눌러 삭제합니다.

  2. 명령줄의 모형을 만들려면 편집기에서 다음 코드를 입력합니다.

    Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ... \n");
    Console.WriteLine("Invoice: 1021\t\tComplete!");
    Console.WriteLine("Invoice: 1022\t\tComplete!");
    Console.WriteLine("\nOutput Directory:\t");
    
  3. 이제 코드를 실행합니다. 출력 콘솔에 다음과 같은 결과가 표시됩니다.

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021           Complete!
    Invoice: 1022           Complete!
    
    Output Directory:    
    

축자 문자열 리터럴

축자 문자열 리터럴은 백슬래시를 이스케이프할 필요 없이 모든 공백과 문자를 유지합니다. 축자 문자열을 만들려면 리터럴 문자열 앞에서 @ 지시문을 사용합니다.

Console.WriteLine(@"    c:\source\repos    
        (this is where your code goes)");

문자열은 두 줄로 나뉘어 있으며 이 C# 명령에 의해 생성된 공백은 다음 출력에서 유지됩니다.

    c:\source\repos    
        (this is where your code goes)

축자 문자열 리터럴을 사용하여 출력 형식 지정

  1. 이전에 만든 코드 바로 아래에 다음 코드 줄을 추가합니다.

    Console.Write(@"c:\invoices");
    
  2. 이제 코드를 실행합니다. “출력 디렉터리”를 포함하는 다음 결과가 표시됩니다.

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021           Complete!
    Invoice: 1022           Complete!
    
    Output Directory:
    c:\invoices
    

유니코드 이스케이프 문자

\u 이스케이프 시퀀스를 사용하여 리터럴 문자열에 인코딩된 문자를 추가한 다음 유니코드(UTF-16)의 일부 문자를 나타내는 네 문자 코드를 추가할 수도 있습니다.

// Kon'nichiwa World
Console.WriteLine("\u3053\u3093\u306B\u3061\u306F World!");

참고

몇 가지 주의 사항이 있습니다. 먼저 Windows 명령 프롬프트와 같은 일부 콘솔에는 유니코드 문자가 모두 표시되지 않습니다. 해당 문자가 물음표 문자로 바뀝니다. 또한 여기에 사용된 예는 UTF-16입니다. 일부 문자의 경우 UTF-32가 필요하므로 다른 이스케이프 시퀀스가 필요합니다. 이는 복잡한 주제이며 이 모듈에서는 가능한 항목만 보여주려고 합니다. 필요에 따라 애플리케이션에서 유니코드 문자를 학습하고 사용하는 데 많은 시간이 소요될 수 있습니다.

유니코드 이스케이프 문자를 사용하여 출력 형식 지정

명령줄 도구의 모형을 완료하려면 “일본어 청구서를 생성하려면”을 번역하는 구를 일본어로 추가합니다. 그런 다음, 사용자가 입력할 수 있는 명령을 나타내는 축자 리터럴 문자열을 표시합니다. 또한 형식 지정을 위한 일부 이스케이프 시퀀스를 추가합니다.

  1. 애플리케이션에 다음 코드를 추가합니다.

    // To generate Japanese invoices:
    // Nihon no seikyū-sho o seisei suru ni wa:
    Console.Write("\n\n\u65e5\u672c\u306e\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3059\u308b\u306b\u306f\uff1a\n\t");
    // User command to run an application
    Console.WriteLine(@"c:\invoices\app.exe -j");
    
  2. 코드가 올바른지 확인하려면 다음 코드와 비교합니다.

    Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ...\n");
    Console.WriteLine("Invoice: 1021\t\tComplete!");
    Console.WriteLine("Invoice: 1022\t\tComplete!");
    Console.WriteLine("\nOutput Directory:\t");
    Console.Write(@"c:\invoices");
    
    // To generate Japanese invoices:
    // Nihon no seikyū-sho o seisei suru ni wa:
    Console.Write("\n\n\u65e5\u672c\u306e\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3059\u308b\u306b\u306f\uff1a\n\t");
    // User command to run an application
    Console.WriteLine(@"c:\invoices\app.exe -j");
    
  3. 이제 코드를 실행합니다. 출력 콘솔에 다음과 같은 결과가 표시됩니다.

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021            Complete!
    Invoice: 1022            Complete!
    
    Output Directory:
    c:\invoices
    
    日本の請求書を生成するには:
        c:\invoices\app.exe -j
    

요약

지금까지 리터럴 문자열 형식 지정에 대해 배운 내용은 다음과 같습니다.

  • \t, 줄 바꿈 \n, 큰따옴표 \" 등과 같은 특수 문자를 리터럴 문자열에 삽입해야 하는 경우 문자 이스케이프 시퀀스를 사용합니다.
  • 다른 모든 시나리오에서 백슬래시를 사용해야 하는 경우 백슬래시 \\에 이스케이프 문자를 사용합니다.
  • @ 지시문을 사용하여 문자열에서 모든 공백 서식과 백슬래시 문자를 유지하는 축자 문자열 리터럴을 만듭니다.
  • 문자열에서 유니코드 문자(UTF-16)를 나타내려면 \u와 네 문자 코드를 사용합니다.
  • 유니코드 문자는 애플리케이션에 따라 제대로 출력되지 않을 수 있습니다.