문자열 보간식
$
문자는 문자열 리터럴을 보간 문자열로 식별합니다. 보간된 문자열은 보간 식을 포함할 수 있는 문자열 리터럴입니다. 보간된 문자열이 결과 문자열로 확인되면 컴파일러는 식 결과의 문자열 표현에 따라 항목을 보간 식으로 바꿉니다.
문자열 보간은 문자열의 서식을 지정하는 보다 읽기 능하고 편리한 구문을 제공합니다. 문자열 복합 서식보다 읽기가 더 쉽습니다. 다음 예제에서는 두 기능을 모두 사용하여 동일한 출력을 생성합니다.
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.
보간된 문자열을 사용하여 상수 문자열을 초기화할 수 있습니다. 보간된 문자열 내의 모든 보간 식이 상수 문자열인 경우에만 이 작업을 수행할 수 있습니다.
보간된 문자열의 구조
문자열 리터럴을 보간된 문자열로 식별하려면 $
기호를 앞에 붙이십시오. 문자열 리터럴을 시작할 때 $
와 "
사이에 공백이 있으면 안 됩니다.
보간 표현식을 사용하는 항목의 구조는 다음과 같습니다.
{<interpolationExpression>[,<width>][:<formatString>]}
대괄호 안의 요소는 선택 사항입니다. 다음 표에서는 각 요소에 대해 설명합니다.
요소 | 설명 |
---|---|
interpolationExpression |
서식을 지정할 결과를 생성하는 식입니다. 식이면 null 출력은 빈 문자열(String.Empty)입니다. |
width |
값이 식 결과의 문자열 표현에서 최소 문자 수를 정의하는 상수 식입니다. 양수이면 문자열 표현이 오른쪽에 맞춰집니다. 음수이면 왼쪽 맞춤입니다. 자세한 내용은 복합 서식 문서의Width 구성 요소 섹션을 참조하세요. |
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}
앞의 예제에서 보간된 원시 문자열 리터럴은 두 $
문자로 시작합니다. 모든 보간 식을 이중 중괄호 ({{
및 }}
) 사이에 넣어야 합니다. 단일 중괄호가 결과 문자열에 포함됩니다. 반복 {
또는 }
문자를 결과 문자열에 포함해야 하는 경우 적절하게 더 많은 수의 $
문자를 사용하여 보간된 원시 문자열 리터럴을 지정합니다. 문자열 리터럴에 중괄호가 문자 $
수보다 많이 반복되는 경우, 문자 {
와 }
는 내부에서 외부로 그룹화됩니다. 앞의 예제에서 리터럴 The point {{{X}}, {{Y}}}
는 {{X}}
와 {{Y}}
를 보간된 식으로 해석합니다. 외부 {
와 }
는 출력 문자열에 있는 그대로 포함됩니다.
특수 문자
보간된 문자열로 생성된 텍스트에 중괄호 "{" 또는 "}"를 포함하려면 두 개의 중괄호인 "{{" 또는 "}}"를 사용합니다. 자세한 내용은 복합 서식 문서의이스케이프 중괄호 섹션을 참조하세요.
콜론(":")은 보간 식 항목에 특별한 의미가 있으므로 보간 식에서 조건부 연산 자를 사용합니다. 해당 식을 괄호로 묶습니다.
다음 예제에서는 결과 문자열에 중괄호를 포함하는 방법을 보여줍니다. 또한 조건부 연산자를 사용하는 방법도 보여줍니다.
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# 대화형 자습서 에서 문자열 보간을 참조하세요. 이 자습서는 문자열 보간을 사용하여 형식이 지정된 문자열을 생성하는 방법을 보여줍니다.
보간된 문자열 집합화
컴파일러는 보간된 문자열이 보간된 문자열 처리기 패턴충족하는 형식에 할당되는지 확인합니다.
보간된 문자열 처리기는 보간된 문자열을 결과 문자열로 변환하는 형식입니다. 보간된 문자열에 자료형 string
이 있으면, System.Runtime.CompilerServices.DefaultInterpolatedStringHandler에 의해 처리됩니다. 사용자 지정 보간된 문자열 처리기의 예제는 사용자 지정 문자열 보간 처리기 작성 자습서를 참조하세요. 인터폴레이션된 문자열 처리기의 사용은 성능을 개선하기 위한 고급 시나리오에서 주로 필요합니다.
비고
보간된 문자열 처리기의 한 가지 부작용은 사용자 지정 처리기(포함 System.Runtime.CompilerServices.DefaultInterpolatedStringHandler)가 모든 조건에서 보간된 문자열 내의 모든 보간 식을 평가하지 않을 수 있다는 것입니다. 즉, 이러한 식의 부작용이 발생하지 않을 수 있습니다.
보간된 문자열에 string
형식이 있는 경우 일반적으로 String.Format 메서드 호출로 변환됩니다. 컴파일러는 분석된 동작이 연결과 동일한 경우 String.Format을 String.Concat으로 대체할 수 있습니다.
보간된 문자열에 형식 IFormattable 또는 FormattableString이 있을 경우, 컴파일러가 FormattableStringFactory.Create 메서드 호출을 생성합니다.
C# 언어 사양
자세한 내용은 C# 언어 사양의 보간된 문자열 식 섹션과 다음과 같은 새로운 기능 사양을 참조하세요.
참고하십시오
.NET