$(을)를 사용하여 문자열 보간

$ 문자는 문자열 리터럴을 보간된 문자열로 식별합니다. 보간된 문자열은 보간 식이 포함될 수 있는 문자열 리터럴입니다. 보간된 문자열이 결과 문자열로 해석되면 보간 식이 있는 항목이 식 결과의 문자열 표현으로 바뀝니다.

문자열 보간은 문자열 형식을 지정하는 더욱 읽기 쉽고 편리한 구문을 제공합니다. 문자열 복합 형식 지정보다 더 쉽게 읽을 수 있습니다. 다음 예제에서는 두 기능을 사용하여 동일한 출력을 생성합니다.

var name = "Mark";
var date = DateTime.Now;

// Composite formatting:
Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);
// String interpolation:
Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
// Both calls produce the same output that is similar to:
// Hello, Mark! Today is Wednesday, it's 19:40 now.

C# 10부터 보간된 문자열을 사용하여 상수 문자열을 초기화할 수 있습니다. 보간된 문자열 내의 모든 보간 식이 상수 문자열인 경우에만 이 작업을 수행할 수 있습니다.

보간된 문자열의 구조

문자열 리터럴을 보간된 문자열로 식별하려면 $ 기호를 사용하여 추가합니다. 문자열 리터럴을 시작하는 $" 사이에 공백이 없어야 합니다.

보간 식이 있는 항목의 구조는 다음과 같습니다.

{<interpolationExpression>[,<alignment>][:<formatString>]}

대괄호 안의 요소는 선택 사항입니다. 다음 표에서는 각 요소에 대해 설명합니다.

요소 설명
interpolationExpression 서식을 지정할 결과를 생성하는 식입니다. null의 문자열 표현은 String.Empty입니다.
alignment 식 결과의 문자열 표현에 최소 문자 수를 정의하는 값을 갖는 상수 식입니다. 양수이면 문자열 표현이 오른쪽에 맞춰지며, 음수이면 왼쪽에 맞춰집니다. 자세한 내용은 복합 서식 지정 문서의 맞춤 구성 요소 섹션을 참조하세요.
formatString 식 결과의 형식을 기준으로 지원되는 서식 문자열입니다. 자세한 내용은 복합 서식 지정 문서의 형식 문자열 구성 요소 섹션을 참조하세요.

다음 예제에서는 위에 설명된 선택적 서식 지정 구성 요소를 사용합니다.

Console.WriteLine($"|{"Left",-7}|{"Right",7}|");

const int FieldWidthRightAligned = 20;
Console.WriteLine($"{Math.PI,FieldWidthRightAligned} - default formatting of the pi number");
Console.WriteLine($"{Math.PI,FieldWidthRightAligned:F3} - display only three decimal digits of the pi number");
// Output is:
// |Left   |  Right|
//     3.14159265358979 - default formatting of the pi number
//                3.142 - display only three decimal digits of the pi number

C# 11부터 보간 식 내에서 새 줄을 사용하여 식의 코드를 더 읽기 쉽게 만들 수 있습니다. 다음 예제에서는 새 줄이 패턴 일치와 관련된 식의 가독성을 향상시킬 수 있는 방법을 보여 줍니다.

string message = $"The usage policy for {safetyScore} is {
    safetyScore switch
    {
        > 90 => "Unlimited usage",
        > 80 => "General usage, with daily safety check",
        > 70 => "Issues must be addressed within 1 week",
        > 50 => "Issues must be addressed within 1 day",
        _ => "Issues must be addressed before continued use",
    }
    }";

보간된 원시 문자열 리터럴

C# 11부터 다음 예제와 같이 보간된 원시 문자열 리터럴을 사용할 수 있습니다.

int X = 2;
int Y = 3;

var pointMessage = $"""The point "{X}, {Y}" is {Math.Sqrt(X * X + Y * Y):F3} from the origin""";

Console.WriteLine(pointMessage);
// Output is:
// The point "2, 3" is 3.606 from the origin

결과 문자열에 {} 문자를 포함하려면 여러 $ 문자로 보간된 원시 문자열 리터럴을 시작합니다. 이렇게 하면 $ 문자 수보다 짧은 { 또는 } 문자 시퀀스가 결과 문자열에 포함됩니다. 해당 문자열 내의 보간 식을 묶으려면 다음 예제와 같이 $ 문자 수와 동일한 수의 중괄호를 사용해야 합니다.

int X = 2;
int Y = 3;

var pointMessage = $$"""{The point {{{X}}, {{Y}}} is {{Math.Sqrt(X * X + Y * Y):F3}} from the origin}""";
Console.WriteLine(pointMessage);
// Output is:
// {The point {2, 3} is 3.606 from the origin}

앞의 예제에서 보간된 원시 문자열 리터럴은 두 개의 $ 문자로 시작합니다. 따라서 이중 중괄호, {{}} 사이에 모든 보간 식을 넣어야 합니다. 단일 중괄호가 결과 문자열에 포함됩니다. 반복된 { 또는 } 문자를 결과 문자열에 포함해야 하는 경우 적절하게 더 많은 수의 $ 문자를 사용하여 보간된 원시 문자열 리터럴을 지정합니다.

특수 문자

보간된 문자열로 생성된 문자에 중괄호("{" 또는 "}")를 포함하려면 두 개의 중괄호("{{" 또는 "}}")를 사용합니다. 자세한 내용은 복합 서식 지정 문서의 중괄호 이스케이프 섹션을 참조하세요.

콜론(“:”)은 보간 식 항목에서 특별한 의미가 있으므로, 보간 식에서 조건부 연산자를 사용하려면 해당 식을 괄호로 묶습니다.

다음 예제에서는 결과 문자열에 괄호를 포함하는 방법을 보여 줍니다. 조건부 연산자를 사용하는 방법도 보여 줍니다.

string name = "Horace";
int age = 34;
Console.WriteLine($"He asked, \"Is your name {name}?\", but didn't wait for a reply :-{{");
Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old.");
// Output is:
// He asked, "Is your name Horace?", but didn't wait for a reply :-{
// Horace is 34 years old.

보간된 축자 문자열은 $(와)과 @ 문자 모두로 시작합니다. $@(을)를 순서에 상관없이 사용할 수 있습니다. $@"..."@$"..."(은)는 모두 유효한 보간된 축자 문자열입니다. 축자 문자열에 관한 자세한 내용은 문자열축자 식별자 문서를 참조하세요.

문화권별 서식 지정

기본적으로는 보간된 문자열은 모든 서식 지정 작업에 대해 CultureInfo.CurrentCulture 속성에서 정의한 현재 문화권을 사용합니다.

보간된 문자열을 문화권별 결과 문자열로 확인하려면 .NET 6부터 사용할 수 있는 String.Create(IFormatProvider, DefaultInterpolatedStringHandler) 메서드를 사용합니다. 다음 예제에서는 해당 작업을 수행하는 방법을 보여줍니다.

double speedOfLight = 299792.458;

System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("nl-NL");
string messageInCurrentCulture = $"The speed of light is {speedOfLight:N3} km/s.";

var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = string.Create(
    specificCulture, $"The speed of light is {speedOfLight:N3} km/s.");

string messageInInvariantCulture = string.Create(
    System.Globalization.CultureInfo.InvariantCulture, $"The speed of light is {speedOfLight:N3} km/s.");

Console.WriteLine($"{System.Globalization.CultureInfo.CurrentCulture,-10} {messageInCurrentCulture}");
Console.WriteLine($"{specificCulture,-10} {messageInSpecificCulture}");
Console.WriteLine($"{"Invariant",-10} {messageInInvariantCulture}");
// Output is:
// nl-NL      The speed of light is 299.792,458 km/s.
// en-IN      The speed of light is 2,99,792.458 km/s.
// Invariant  The speed of light is 299,792.458 km/s.

.NET 5 및 이전 버전의 .NET에서는 보간된 문자열을 FormattableString 인스턴스로 암시적으로 변환합니다. 그런 다음 인스턴스 FormattableString.ToString(IFormatProvider) 메서드 또는 정적 FormattableString.Invariant 메서드를 사용하여 문화권별 결과 문자열을 생성할 수 있습니다. 다음 예제에서는 해당 작업을 수행하는 방법을 보여줍니다.

double speedOfLight = 299792.458;
FormattableString message = $"The speed of light is {speedOfLight:N3} km/s.";

var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = message.ToString(specificCulture);
Console.WriteLine(messageInSpecificCulture);
// Output:
// The speed of light is 2,99,792.458 km/s.

string messageInInvariantCulture = FormattableString.Invariant(message);
Console.WriteLine(messageInInvariantCulture);
// Output is:
// The speed of light is 299,792.458 km/s.

사용자 지정 서식 지정에 대한 자세한 내용은 .NET의 서식 지정 형식 문서의 ICustomFormatter를 사용한 사용자 지정 서식 지정 섹션을 참조하세요.

다른 리소스

문자열 보간을 처음 사용하는 경우 C#의 문자열 보간 대화형 자습서를 참조하세요. 또 다른 C#의 문자열 보간 자습서를 확인할 수도 있습니다. 해당 자습서에서는 보간된 문자열을 사용하여 형식이 지정된 문자열을 생성하는 방법을 보여 줍니다.

보간된 문자열의 컴파일

C# 10 및 .NET 6부터 컴파일러는 보간된 문자열이 보간된 문자열 처리기 패턴을 충족하는 형식에 할당되었는지 확인합니다. 보간된 문자열 처리기는 보간된 문자열을 결과 문자열로 변환하는 형식입니다. 보간된 문자열에 string 형식이 있으면 System.Runtime.CompilerServices.DefaultInterpolatedStringHandler에서 처리됩니다. 사용자 지정 보간된 문자열 처리기의 예제는 사용자 지정 문자열 보간 처리기 작성 자습서를 참조하세요. 보간된 문자열 처리기의 사용은 성능상의 이유로 일반적으로 필요한 고급 시나리오입니다.

참고 항목

보간된 문자열 처리기의 한 가지 부작용은 System.Runtime.CompilerServices.DefaultInterpolatedStringHandler(을)를 포함한 사용자 지정 처리기가 모든 조건에서 보간된 문자열 내의 모든 보간 식을 평가하지 않을 수 있다는 것입니다. 즉, 이러한 식의 부작용이 발생하지 않을 수 있습니다.

C# 10 이전에는 보간된 문자열에 string 형식이 있는 경우 일반적으로 String.Format 메서드 호출로 변환됩니다. 컴파일러는 분석된 동작이 연결에 해당하는 경우 String.FormatString.Concat으로 바꿀 수 있습니다.

보간된 문자열 형식이 IFormattable 또는 FormattableString이면 컴파일러가 FormattableStringFactory.Create 메서드에 대한 호출을 생성합니다.

C# 언어 사양

자세한 내용은 C# 언어 사양보간된 문자열 식 섹션 및 다음의 새로운 기능 사양을 참조하세요.

참고 항목