를 사용한 문자열 보간 $
$
특수 문자는 문자열 리터럴을 보간된 문자열로 식별합니다. 보간된 문자열은 보간 식이 포함될 수 있는 문자열 리터럴입니다. 보간된 문자열이 결과 문자열로 해석되면 보간 식이 있는 항목이 식 결과의 문자열 표현으로 바뀝니다.
문자열 보간은 문자열 형식을 지정하는 더욱 읽기 쉽고 편리한 구문을 제공합니다. 문자열 복합 형식 지정보다 더 쉽게 읽을 수 있습니다. 두 기능을 모두 사용하여 동일한 출력을 생성하는 다음 예제를 비교합니다.
string 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>[,<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");
// Expected output is:
// |Left | Right|
// 3.14159265358979 - default formatting of the pi number
// 3.142 - display only three decimal digits of the pi number
C# 10부터 문자열 보간을 사용하여 상수 문자열을 초기화할 수 있습니다. 자리 표시자에 사용되는 모든 식은 상수 문자열이어야 합니다. 즉, 모든 ‘보간 식’은 문자열이어야 하며 컴파일 시간 상수여야 합니다.
C# 11부터 보간된 식에는 줄 바꿈이 포함될 수 있습니다. 와 }
사이의 {
텍스트는 유효한 C#이어야 하므로 가독성을 향상시키는 줄 바꿈을 포함할 수 있습니다. 다음 예제에서는 줄 바꿈이 패턴 일치와 관련된 식의 가독성을 개선하는 방법을 보여 줍니다.
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)} from the origin""";
Console.WriteLine(pointMessage);
// output: The point "2, 3" is 3.605551275463989 from the origin.
보간된 원시 문자열 리터럴에서 여러 $
문자를 사용하여 출력 문자열에 및 }
문자를 포함 {
할 수 있습니다.
int X = 2;
int Y = 3;
var pointMessage = $$"""The point {{{X}}, {{Y}}} is {{Math.Sqrt(X * X + Y * Y)}} from the origin""";
Console.WriteLine(pointMessage);
// output: The point {2, 3} is 3.605551275463989 from the origin.
출력 문자열에 반복 {
또는 }
문자가 포함되어야 하는 경우 를 더 $
추가하여 보간된 문자열을 지정할 수 있습니다. 의 {
개수 $
보다 짧거나 }
같은 시퀀스는 출력 문자열에 포함됩니다. 앞의 예제와 같이 문자 시퀀스보다 긴 시 $
퀀스는 출력에 추가 {
또는 }
문자를 포함합니다. 중괄호 문자 시퀀스가 문자 시퀀 $
스의 길이보다 크거나 같으면 컴파일러에서 오류를 발생합니다.
.NET 7 SDK를 사용하여 이러한 기능을 사용해 볼 수 있습니다. 또는 .NET SDK 6.00.200 이상이 있는 경우 csproj 파일preview
의 <LangVersion>
요소를 로 설정할 수 있습니다.
특수 문자
보간된 문자열로 생성된 문자에 중괄호("{" 또는 "}")를 포함하려면 두 개의 중괄호("{{" 또는 "}}")를 사용합니다. 자세한 내용은 중괄호 이스케이프를 참조하세요.
콜론(“:”)은 보간 식 항목에서 특별한 의미가 있으므로, 보간 식에서 조건부 연산자를 사용하려면 해당 식을 괄호로 묶습니다.
다음 예제에서는 결과 문자열에 괄호를 포함하는 방법을 보여 줍니다. 조건부 연산자를 사용하는 방법도 보여 줍니다.
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.");
// Expected output is:
// He asked, "Is your name Horace?", but didn't wait for a reply :-{
// Horace is 34 years old.
보간된 약어 문자열은 @
문자가 뒤에 오는 $
문자로 시작합니다. $
및 @
토큰을 순서에 관계없이 사용할 수 있습니다. $@"..."
및 @$"..."
는 모두 유효한 보간된 약어 문자열입니다. 축자 문자열에 관한 자세한 내용은 문자열 및 축자 식별자 문서를 참조하세요.
암시적 변환 및 IFormatProvider
구현 지정 방법
보간된 문자열에서 다음과 같은 세 가지 암시적 변환을 수행할 수 있습니다.
보간된 문자열을 String으로 변환. 문자열은 보간된 문자열 확인의 결과입니다. 모든 보간 식 항목은 결과의 형식이 올바르게 지정된 문자열 표현으로 바뀝니다. 이 변환에서는 CurrentCulture를 사용하여 식 결과의 형식을 지정합니다.
보간된 문자열을 서식을 지정할 식 결과와 함께 복합 서식 문자열을 나타내는 FormattableString 인스턴스로 변환. 이 변수를 사용하면 단일 FormattableString 인스턴스에서 문화권별 콘텐츠가 포함된 여러 결과 문자열을 만들 수 있습니다. 이렇게 하려면 다음 메서드 중 하나를 호출합니다.
- CurrentCulture에 대한 결과 문자열을 생성하는 ToString() 오버로드.
- InvariantCulture에 대한 결과 문자열을 생성하는 Invariant 메서드.
- 지정된 문화에 대한 결과 문자열을 생성하는 ToString(IFormatProvider) 메서드.
ToString(IFormatProvider)는 사용자 지정 형식을 지원하는 IFormatProvider 인터페이스의 사용자 정의 구현을 제공합니다. 자세한 내용은 .NET의 형식 서식 지정 문서의 ICustomFormatter를 사용하여 사용자 지정 형식 지정 섹션을 참조하세요.
보간된 문자열을 IFormattable 인스턴스로 변환. 또한 이 인스턴스를 사용하면 단일 IFormattable 인스턴스의 문화권별 콘텐츠로 여러 결과 문자열을 만들 수 있습니다.
다음 예제에서는 FormattableString에 대한 암시적 변환을 사용하여 문화권별 결과 문자열을 만듭니다.
double speedOfLight = 299792.458;
FormattableString message = $"The speed of light is {speedOfLight:N3} km/s.";
System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("nl-NL");
string messageInCurrentCulture = message.ToString();
var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = message.ToString(specificCulture);
string messageInInvariantCulture = FormattableString.Invariant(message);
Console.WriteLine($"{System.Globalization.CultureInfo.CurrentCulture,-10} {messageInCurrentCulture}");
Console.WriteLine($"{specificCulture,-10} {messageInSpecificCulture}");
Console.WriteLine($"{"Invariant",-10} {messageInInvariantCulture}");
// Expected 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.
기타 리소스
문자열 보간을 처음 사용하는 경우 C#의 문자열 보간 대화형 자습서를 참조하세요. 또 다른 C#의 문자열 보간 자습서를 확인할 수도 있습니다. 해당 자습서에서는 보간된 문자열을 사용하여 형식이 지정된 문자열을 생성하는 방법을 보여 줍니다.
보간된 문자열의 컴파일
보간된 문자열이 string
형식이면 일반적으로 String.Format 메서드 호출로 변환됩니다. 컴파일러는 분석된 동작이 연결에 해당하는 경우 String.Format을 String.Concat으로 바꿀 수 있습니다.
보간된 문자열 형식이 IFormattable 또는 FormattableString이면 컴파일러가 FormattableStringFactory.Create 메서드에 대한 호출을 생성합니다.
C# 10부터 보간된 문자열이 사용되는 경우 컴파일러는 보간된 문자열이 ‘보간된 문자열 처리기 패턴’을 충족하는 형식에 할당되었는지 확인합니다. ‘보간된 문자열 처리기’는 보간된 문자열을 문자열로 변환하는 사용자 지정 형식입니다. 보간된 문자열 처리기는 일반적으로 성능상 이유로 사용되는 고급 시나리오입니다. 보간된 문자열 향상된 기능에 대한 언어 사양에서 보간된 문자열 처리기를 빌드하기 위한 요구 사항에 관해 알아볼 수 있습니다. C#의 새로운 기능 섹션에서 보간된 문자열 처리기 자습서에 따라 빌드할 수 있습니다. .NET 6에서 string
형식의 인수에 보간된 문자열을 사용하는 경우 보간된 문자열은 System.Runtime.CompilerServices.DefaultInterpolatedStringHandler에 의해 처리됩니다.
참고
보간된 문자열 처리기의 한 가지 부작용은 System.Runtime.CompilerServices.DefaultInterpolatedStringHandler를 비롯한 사용자 지정 처리기가 모든 조건에서 보간된 문자열의 자리 표시자로 사용되는 모든 식을 계산하지 않을 수 있다는 것입니다. 즉, 해당 식의 부작용이 발생하지 않을 수 있습니다.
C# 언어 사양
자세한 내용은 C# 언어 사양의 보간된 문자열 섹션, C# 11 - 원시 문자열 리터럴 기능 사양 및 문자열 보간 기능 사양의 C# 11 - 줄 바꿈을 참조하세요.