Quick Reference
값을 읽기 좋게 조합하면 $"...", 역슬래시를 그대로 쓰는 경로·정규식이면 @"...", 여러 줄 JSON·SQL·HTML처럼 따옴표와 줄바꿈이 많은 텍스트면 C# 11의 """..."""를 씁니다. 보간 항목은 {expression[,width][:format]} 형태입니다.
string name = "Mina";
decimal rate = 0.856m;
string label = $"{name,-8} {rate:P1}"; // "Mina 85.6%"
string path = @"C:\logs\app.txt";
string json = """
{ "name": "Mina" }
""";$@"..."과@$"..."는 보간과 축자 리터럴을 함께 사용합니다.- 보간의 기본 형식화는 현재 문화권을 사용합니다. 로그·프로토콜 값은 명시적인
IFormatProvider를 사용합니다. - 보간 원시 문자열에서 JSON 중괄호를 그대로 많이 써야 하면 `- 보간 원시 문자열에서 JSON 중괄호를 그대로 많이 써야 하면 의 개수를 늘려 보간 중괄호와 구분합니다.
보간 항목과 형식
중괄호 안에는 식, 최소 폭, 형식 문자열을 순서대로 넣습니다. 양수 폭은 오른쪽 정렬, 음수 폭은 왼쪽 정렬입니다. 값이 null이면 보간 결과에는 빈 문자열이 들어갑니다.
var now = new DateTime(2026, 8, 10, 9, 30, 0);
int score = 1200;
string row = $"|{"Mina",-10}|{score,8:N0}|{now:yyyy-MM-dd}|";
string state = $"status: {(score >= 1000 ? "pass" : "retry")}";통화, 날짜, 소수점은 현재 문화권에 따라 달라질 수 있습니다. 사람이 읽는 화면은 현재 문화권을 따르는 것이 자연스럽지만, 캐시 키·서명·CSV 교환·구조화 로그처럼 고정 형식이 필요한 문자열에는 invariant culture을 명시합니다.
using System.Globalization;
decimal amount = 1234.5m;
string wireValue = string.Create(
CultureInfo.InvariantCulture,
$"amount={amount:F2}"); // amount=1234.50컴파일러의 실제 lowering은 대상 형식과 런타임에 따라 string.Format, 연결, interpolated string handler 등으로 달라질 수 있습니다. 코드의 선택 기준은 내부 변환이 아니라 읽기 쉬운 형식과 필요한 문화권 계약입니다.
축자와 원시 리터럴
축자 리터럴 @"..."은 백슬래시를 이스케이프하지 않습니다. 문자열 안의 큰따옴표는 "" 두 개로 씁니다. 원시 문자열 리터럴은 세 개 이상 큰따옴표로 경계를 만들며, 여러 줄의 줄바꿈·따옴표·백슬래시를 그대로 담습니다.
string windowsPath = @"C:\temp\reports\daily.txt";
string quote = @"He said ""ready"".";
string template = """
SELECT id, name
FROM users
WHERE active = 1
""";여러 줄 원시 문자열은 닫는 구분자의 들여쓰기를 기준으로 공통 앞 공백을 제거합니다. 탭과 공백을 섞거나 닫는 구분자보다 덜 들여쓴 내용이 있으면 컴파일 오류가 날 수 있습니다. 내용에 """가 연속으로 필요하면 구분자 큰따옴표 개수를 더 늘립니다.
원시 문자열에 보간을 섞는 기본형은 $"""...{value}..."""입니다. JSON의 중괄호를 이스케이프하기보다 $"""처럼 원시 문자열에 보간을 섞는 기본형은 $"""...{value}..."""입니다. JSON의 중괄호를 이스케이프하기보다 $"""`처럼 를 두 개 쓰면, 한 쌍의 중괄호는 텍스트가 되고 두 쌍이 보간식 경계가 됩니다.
int id = 42;
string payload = $$"""
{ "id": {{id}} }
""";안전하고 읽기 좋은 조합
보간식 안에 긴 조건·조회·부작용을 넣으면 오류 위치와 실행 시점을 읽기 어렵습니다. 값은 먼저 계산하고 보간에는 표시할 값만 둡니다. 외부 입력을 SQL, shell command, HTML에 끼우기 위해 보간을 사용하지 않습니다. SQL은 parameter, HTML은 해당 렌더러의 escaping 규칙을 사용합니다.
string displayName = user?.DisplayName ?? "Guest";
string message = $"Welcome, {displayName}.";루프에서 많은 조각을 누적하는 문제는 보간 리터럴의 문제가 아니라 반복적인 문자열 생성의 문제입니다. 누적량이 크고 반복 횟수가 많으면 StringBuilder를 선택합니다.
자주 틀리는 부분
- 일반 문자열의
"C:\temp"에서\t는 탭입니다. 경로에는@"C:\temp"또는"C:\\temp"를 사용합니다. {와}를 일반 보간 문자열의 텍스트로 출력하려면{{와}}를 사용합니다.:C,:N,:P결과를 서버·사용자 문화권에 고정된 값으로 가정하지 않습니다.- raw string은 escaping을 줄일 뿐, SQL injection이나 HTML injection을 막아 주지 않습니다.
참고 링크
3 sources