문자열 보간은 리터럴 텍스트와 식으로 문자열을 만듭니다. 리터럴 앞에 $를 붙이고 중괄호 안에 아무 C# 식이나 넣으면, 그 값이 텍스트로 변환되어 삽입됩니다:
출력:
Hello, Maya!
3 items at 4.5 = 13.5
Name has 4 letters, upper: MAYA
Free shipping: yes
보간은 C# 6에서 도입되었습니다. 컴파일러가 이를 string.Format이나 string.Concat 호출로(C# 10부터는 더 효율적인 핸들러 코드로) 바꾸므로, 직접 문자열을 만드는 것보다 느리지 않습니다.
마지막 줄의 조건 식에는 괄호가 필요합니다. 보간 구멍 안에서 콜론은 서식 지정자를 시작하므로, 괄호 없는 {x > 10 ? "yes" : "no"}는 컴파일 오류입니다.
서식 지정자
식 뒤에 콜론과 서식 문자열을 붙이면 값을 쓰는 방식을 정할 수 있습니다. 같은 서식 문자열이 ToString("...")과 string.Format에도 동작합니다.
출력:
1234567.89
1,234,567.89
1,234,568
00042
FF
00ff
1.23E+006
0.813
81.3%
1,234,567.89
007.5
3.1
표준 코드이며, 각각 뒤에 정밀도 숫자를 붙일 수 있습니다:
| 코드 | 이름 | 예 | 결과 |
|---|---|---|---|
F 또는 F2 | 고정 소수점 | {3.14159:F2} | 3.14 |
N 또는 N0 | 그룹 구분 기호가 있는 숫자 | {1234.56:N0} | 1,235 |
C | 통화(문화권의 기호와 패턴) | en-US에서 {9.5:C} | $9.50 |
D5 | 0으로 채운 정수 | {42:D5} | 00042 |
X, x | 16진수 | {255:X} | FF |
E2 | 지수 표기 | {1234.5:E2} | 1.23E+003 |
P1 | 백분율(100을 곱함) | en-US에서 {0.256:P1} | 25.6% |
G | 일반(가장 짧은 형태) | {2.50m:G} | 2.50 |
R | 왕복(double) | {0.1:R} | 0.1 |
사용자 지정 패턴은 자리 표시자로 서식을 만듭니다. 0은 항상 표시되는 숫자, #은 의미가 있을 때만 표시되는 숫자, .은 소수점, 숫자 안의 ,는 그룹 구분 기호를 켜고, %는 100을 곱합니다. "0.##"는 소수를 최대 두 자리까지 표시하고 끝의 0을 버립니다. "#,##0.00"은 전형적인 회계 서식입니다.
모든 숫자 서식은 표시되는 값을 반올림하며 변수 자체는 바뀌지 않습니다. 값이 정확히 중간(2.25를 소수 한 자리로 표시)에 있으면 런타임과 타입에 따라 반올림 방향이 다를 수 있으므로, 규칙이 중요하다면 먼저 Math.Round(value, 1, MidpointRounding.AwayFromZero)로 명시적으로 반올림한 뒤 서식화하세요.
보간 안의 날짜
DateTime 값도 같은 방식으로 날짜 서식 문자열을 받습니다:
출력:
2026-09-24
24/09/2026 16:05
Thu, Sep 24
Shipped at 16:05 on Thursday
ETA 02:10
2.2 hours
TimeSpan 사용자 지정 서식에서는 리터럴 문자를 백슬래시로 이스케이프해야 하며, 일반 문자열 리터럴에서는 \\:로 씁니다. 날짜 코드의 전체 목록(yyyy, MM, HH, tt...)과 흔한 실수(mm은 분, MM은 월)는 DateTime 서식에 있습니다.
정렬과 패딩
식 뒤의 쉼표는 최소 필드 너비를 정합니다. 양수는 오른쪽 정렬, 음수는 왼쪽 정렬입니다. 서식과 함께 쓰면 일반 텍스트로 표를 맞출 수 있습니다:
출력:
Item | Price| Sold
----------------------------
Espresso | 2.40| 118
Latte | 3.60| 64
Hot chocolate | 4.25| 9
문법은 {expression,alignment:format}으로, 정렬이 먼저이고 서식이 다음입니다. 너비보다 긴 값은 잘리지 않고 줄의 나머지를 밀어냅니다. 보간 밖에서는 PadLeft와 PadRight가 같은 패딩을 합니다.
중괄호 이스케이프
중괄호 문자 자체를 출력하려면 두 번 씁니다: {{와 }}. 출력이 JSON, CSS, 코드일 때 필요합니다:
출력:
{ "id": 42, "name": "Ana" }
Set literal: {1, 2, 3}
{42}
이렇게 JSON을 직접 만드는 것은 간단한 로그 한 줄에는 괜찮지만, 실제 JSON에는 name 안의 따옴표와 특수 문자를 제대로 처리하는 직렬 변환기를 쓰세요.
string.Format과 복합 서식
C# 6 이전에는 번호 붙은 자리 표시자와 인수 목록을 받는 string.Format으로 서식화했습니다. 같은 복합 서식 문법을 Console.WriteLine, StringBuilder.AppendFormat, TextWriter.Write도 받습니다:
출력:
Notebook x4: 14.00
Notebook | 3.50
echo echo !
Dear Leo, your order #000731 has shipped.
코드에서는 보간을 우선 쓰세요. 값이 나타나는 자리에 있으므로 자리 표시자가 엉뚱한 인수를 가리킬 수 없습니다. 리소스 파일에서 불러온 번역 메시지처럼 템플릿이 데이터일 때는 string.Format이 여전히 맞는 도구입니다. 대응하는 인수가 없는 자리 표시자 인덱스(인수가 두 개인데 {2})는 실행 시점에 FormatException을 던집니다.
문화권: 구분 기호와 통화 제어
보간, ToString, string.Format은 모두 기본적으로 스레드의 현재 문화권을 씁니다. 독일어로 설정된 컴퓨터에서 {1234.5:N2}는 1.234,50을, 미국에서는 1,234.50을 만듭니다. 통화 서식 C는 문화권의 기호를 씁니다. 문화권을 명시적으로 고르려면 보간 문자열을 FormattableString으로 받아 공급자와 함께 서식화하세요:
출력:
Total: 1,234.50
Total: 1.234,50
$1,234.50
1.234,50
1234.5,0.75
사람이 읽는 텍스트에는 사용자의 문화권을, 다른 프로그램이 읽는 모든 것에는 CultureInfo.InvariantCulture를 쓰세요. 독일어 컴퓨터에서 현재 문화권으로 쓴 CSV는 숫자 안에 쉼표가 들어가서 다른 곳에서 읽을 수 없습니다. .NET 6 이상에서는 string.Create(CultureInfo.InvariantCulture, $"...")가 중간 객체 없이 FormattableString.Invariant와 같은 일을 합니다.
축자 보간 문자열과 원시 보간 문자열
$와 @를 함께 쓰면 축자 보간 문자열이 됩니다. 백슬래시는 그대로이고 여러 줄에 걸칠 수 있습니다. C# 8 이상은 어느 순서($@ 또는 @$)든 받고, C# 6과 7은 $@만 받습니다:
출력:
C:\Users\ana\Reports\2026\summary.txt
Report for ana
Year: 2026
C# 11은 원시 보간 문자열을 추가했습니다. $ 하나면 중괄호가 평소처럼 식을 표시합니다. $$이면 한 겹 중괄호는 그대로의 문자이고 식에는 두 겹 중괄호가 필요해서, JSON과 코드 템플릿을 읽기 쉽게 만듭니다:
// C# 11 and later
int id = 42;
string name = "Ana";
string json = $$"""
{
"id": {{id}},
"name": "{{name}}"
}
""";
C# 11은 보간 구멍 안의 줄바꿈도 허용하므로, 긴 식이나 switch 식을 여러 줄로 나눌 수 있습니다.
흔한 실수
$를 빠뜨리기."Total: {total}"은 중괄호를 그대로 출력합니다. 컴파일러는 경고하지 않습니다.- 중괄호 안에서 괄호 없는 삼항 연산자: 콜론이 서식 구분자로 읽힙니다.
- 기계가 읽을 출력을 현재 문화권으로 서식화하기. 소수점 쉼표는 CSV, JSON, SQL을 망가뜨립니다. 고정 문화권을 쓰세요.
- 금액에 서식 없이
ToString()쓰기.2.5m은2.50이 아니라2.5로 출력됩니다.F2,N2,C를 쓰세요. - 루프에서 보간으로 큰 문자열 만들기. 반복마다 새 문자열이 생깁니다. StringBuilder나
string.Join을 쓰세요.
자주 묻는 질문
C#의 문자열 보간이란 무엇인가요?
$를 앞에 붙인 문자열 리터럴로, 중괄호 안의 식이 평가되어 삽입됩니다: $"Total: {price * qty}". C# 6에서 추가되었고 string.Format과 + 이어 붙이기의 대부분을 대체합니다. 메서드 호출과 속성 접근을 포함해 어떤 식이든 중괄호 안에 쓸 수 있습니다.
C#에서 숫자를 소수점 둘째 자리까지 표시하려면 어떻게 하나요?
콜론 뒤에 서식 지정자를 붙입니다. $"{price:F2}"는 소수점 아래 2자리를 출력하고, $"{price:N2}"는 천 단위 구분 기호까지 붙여 같은 일을 합니다. 보간 밖에서는 price.ToString("F2")로 같은 코드를 씁니다. 둘 다 값 자체는 바꾸지 않고 표시할 때만 반올림합니다.
C# 보간 문자열에서 중괄호는 어떻게 이스케이프하나요?
두 번 씁니다. {{는 {를, }}는 }를 출력합니다. 예를 들어 $"{{ \"id\": {id} }}"는 { "id": 42 }를 출력합니다. C# 11의 원시 보간 문자열에서는 대신 리터럴을 $$로 시작해 한 겹 중괄호를 그대로의 문자로 만들고 {{expr}}로 식을 표시할 수 있습니다.
string.Format과 문자열 보간의 차이는 무엇인가요?
같은 서식 코드로 같은 결과를 냅니다. string.Format("{0} costs {1:F2}", name, price)는 위치로 인수를 가리키고, $"{name} costs {price:F2}"는 식을 그 자리에 넣으므로 읽기 쉽고 인수 순서를 틀릴 수 없습니다. 서식 문자열 자체가 리소스 파일이나 데이터베이스에서 올 때는 여전히 string.Format이 필요합니다.
보간한 숫자에 마침표 대신 쉼표가 나오는 이유는 무엇인가요?
보간은 스레드의 현재 문화권으로 서식화하고, 많은 문화권이 소수점 구분 기호로 쉼표를 쓰기 때문입니다. 기계가 읽는 출력(파일, JSON, URL)은 고정 문화권으로 서식화하세요: FormattableString.Invariant($"{value:F2}"), 또는 .NET 6 이상에서는 string.Create(CultureInfo.InvariantCulture, $"...").