C#
최신 C# 기능
C# 11
C# 11 새기능
C# 11: Raw String Literal
C# 11: 문자열 내삽 복수라인
C# 11: u8 접미어
C# 11: Generic Math 지원
C# 11: Generic Attribute
C# 11: 리스트 패턴
C# 11: 파일 로컬 타입
C# 11: required modifier
C# 11: Auto-default struct
C# 11: ReadOnlySpan 패턴 매칭
C# 11: 확장된 nameof 범위
C# 11: nint, nuint
C# 11: ref 필드
C# 11: 소문자 타입명 경고
C# 11: 향상된 method group 변환
C# 10
VS 2022 설치
C# 10 global using
C# 10 File-scoped Namespace
C# 10 향상된 문자열 내삽
C# 10 향상된 람다식 유추
C# 10 struct 기능 향상
C# 10 record struct
C# 10 확장된 속성패턴
C# 10 향상된 명료한 할당
C# 10 Destructor 기능 개선
C# 9.0
C# 9 레코드 타입
C# 9 init accessor
C# 9 최상위 프로그램
C# 9 향상된 패턴 매칭
C# 9 향상된 Target Typing
C# 9 공변 리턴 타입
C# 9 Native Int 타입
C# 8.0
C# 8 디폴트 인터페이스 멤버
C# 8 패턴 매칭
C# 8 Nullable Reference Type
C# 8 인덱싱과 슬라이싱
C# 8 비동기 스트림
C# 8 using 선언
C# 8 널 병합 할당자
C# 8 구조체 읽기 전용 멤버
C# 8 기타 기능들
C# 7.0
C# 7.0 새기능
C# 7.0 패턴 매칭
C# 7.0 튜플
C# 7.0 로컬 함수
C# 7.0 out 파라미터
C# 7.0 리터럴 표현
C# 7.0 Deconstructor
C# 7.0 ref return
C# 7.0 async 리턴타입
C# 7.0 Expression-bodied
C# 7.0 throw expression
C# 6.0
C# 6.0 새기능
C# 6.0 널 조건 연산자
C# 6.0 문자열 내삽
C# 6.0 Dictionary초기자
C# 6.0 nameof 연산자
C# 6.0 using static문
C# 6.0 catch블럭 await
C# 6.0 Exception 필터
C# 6.0 자동 속성 초기자
C# 6.0 읽기전용 자동 속성
C# 6.0 Expression-bodied

C#으로 이해하는 자료구조
C# 프로그래밍 기초 실습 전자책
C#의 문자열 리터럴(String Literal)

그 동안 C# 문자열 리터럴은 이중인용부호(double quote) 안에 문자들을 넣어 사용하여 왔으며, 여러 라인에 걸쳐 있는 경우, 이중인용부호 앞에 @ 사인을 넣어 복수 라인임을 표시하였다. 또한, C# 문자열 리터럴 안에 특수문자가 있는 경우 해당 특수문자 앞에 적절한 Escape 문자를 앞에 붙여 사용하였다.

예를 들어, 아래 [예제A]는 C# 11 이전 버전에서 복수 라인에 걸쳐 있는 Json 문자열 리터럴을 표현한 것이다. 이중 인용부호 앞의 @ 사인은 해당 리터럴이 복수 라인임을 알려 주며, 문자열 리터럴 내에 하나의 이중부호를 표시하기 위해 Escaping 즉 2개의 이중부호를 붙여 주어야 한다. 특히, 이러한 리터럴 표현은 각 라인의 앞에 공백이나 Tab 등의 Whitespace가 있으면 그것이 그대로 출력에 포함되기 때문에, 이것을 원치 않으면 아래처럼 좌측으로 밀어서 코딩하곤 한다.


예제

// (예제A) C# 11 이전의 경우
public void Sample()
{
    // 복수 라인 앞에 @을 붙임. 
    // 각 라인 앞에 공란이 있으면 그대로 반영됨.
    string s = @"{
""Order"": ""Latte"",
""Address"": {
    ""Addr"": ""111 Main ST"",
    ""Zip"": ""98052""
}
}";

    Console.WriteLine(s);
}




C# 11: Raw String Literal

C# 11에서는 새로운 문자열 리터럴을 사용할 수 있는데, 3개의 (최소 3개, 그 이상도 가능) 이중인용부호(double quote) 로 문자열 리터럴을 감싸 주는 표현이 도입되었다. 이 새로운 기능은 단일 라인 혹은 복수 라인에 모두 사용 가능하며, 리터럴을 보다 간편하게 사용할 수 있으며, (아래에 설명하듯이) 문자열 내삽 기능을 함께 사용할 수 있다.

예를 들어, 아래 [예제B]는 위에 있는 이전 버전의 리터럴을(예제A) C# 11 버전에서 다시 표현해 본 것인데, 리터럴 문자열이 3개의 이중인용부호로 감싸져 있으며, 문자열 리터럴 내에 이중 인용부호를 한번만 표시함으로써 별도로 이중 인용부호를 Escaping 해야하는 번거로움을 피하게 되었다.

복수 라인의 경우 Raw String Literal의 3개의 인용 시작부호 뒤에 있는 Newline은 자동 삭제되고, 마찬가지로 3개의 인용 끝부호 앞의 Newline도 삭제된다. 또한, 복수 라인의 앞 부분에 있는 Whitespace 들은 자동 제거된다.

이중인용부호는 보통 3개를 사용하지만, 만약 리터럴 안에 3개의 인용부호를 사용해야 하는 경우는 아래 [예제C]처럼 4개의 이중인용부호를 사용해서 문자열 리터럴의 시작과 끝을 표시하면 된다. 이 경우 리터럴 안의 3개의 인용부호는 더이상 문자열 리터럴의 시작과 끝으로 인식되지 않고, 그대로 출력된다.


예제

// (예제B) C# 11의 경우
public void Sample()
{
    // 3개의 이중부호로 감싸줌.
    // 리터럴 앞의 Whitespace는 문자열에서 자동 삭제됨.
    string s = """
        {
        "Order": "Latte",
        "Address": {
            "Addr": "111 Main ST",
            "Zip": "98052"
            }
        }
        """;

    Console.WriteLine(s);
}

// (예제C) 4개의 이중인용부호 사용하는 경우:
//    만약 리터럴 안에 3개의 인용부호가 사용된다면,
//    4개의 이중인용부호를 사용하여 리터럴의 시작과 끝을 표시

string s = """"
    문장에 """ 와 같은 인용부호가
    발견되었으면, 4개의 인용부호로 시작과 끝을 표시한다~~
    """";



C# 11: Raw String Literal에서의 문자열 내삽

C# 11에서 Raw String Literal을 사용할 때, 문자열 내삽 기능(String Interpolation)을 사용할 수 있다. 문자열 내삽을 사용하기 위해서는 3개의 (최소 3개 이상) 이중인용부호 앞에 $ 사인을 붙이면 되는데, 이 경우 { 와 } 안의 Expression이 String Interpolation으로 해석된다.

일반적으로 하나의 $ 을 사용하여 String Interpolation을 표현하지만, 만약 문자열 리터럴 안에 Curly Brace 괄호 {, }가 있고 이 Curly Brace 괄호를 출력이 그대로 내보내고 싶다면, $$와 같이 2개의 달러 사인(혹은 2개 이상의 달러 사인)을 쓸 수 있다. 즉, $ 사인의 갯수에 따라 String Interpolation 괄호의 갯수가 결정된다. 예를 들어, 아래 [예제E]에서 $를 2개 사용하였는데, 이때 String Interpolation을 위한 괄호는 {{ 와 }} 같이 2개를 사용한다. 따라서, {{x}} 와 {{y}} 가 String Interpolation되며, 가장 바깥에 있는 괄호는 그대로 출력된다.


예제

// (예제D) $: 내삽을 위해 하나의 brace 괄호 사용
// 출력: Point: 100, 200
//
int x = 100;
int y = 200;
string s1 = $"""Point: {x}, {y}""";
Console.WriteLine(s1);

// (예제E) $$ : 내삽을 위해 2개의 brace 괄호 사용
//     이 경우 가장 {{x}}와 {{y}}는 내삽으로 값이 치환되지만,
//     가장 바깥 쪽의 { } 괄호는 그대로 출력됨
// 출력: Point: {100, 200}
//
string s2 = $$"""Point: {{{x}}, {{y}}} """;
Console.WriteLine(s2);




본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.