1. 기본 특수문자와 이스케이프
프로그래밍에서 문자열은 그냥 글자만 있는 게 아니라, 따옴표, 줄바꿈, 탭 같은 특수문자도 들어가. 가끔은 \n이나 \t 같은 기호도 써야 하고. 근데 만약 문자열 안에 안녕, "user"! 이렇게 쓰고 싶으면, 컴파일러가 바로 물어볼 거야: "문자열 안의 따옴표, 이거 오류 아냐?" 이럴 때 이스케이프가 필요해.
C#에서 이스케이프란 문자열 안의 어떤 문자에 "특별한 의미"를 주는 방법이야. 이때 백슬래시 \ (backslash)를 써.
클래식 특수문자
| 시퀀스 | 설명 | 데모 |
|---|---|---|
| \n | 줄바꿈 | 엔터 누름 |
| \t | 탭 | 탭 |
| \\ | 그냥 "백슬래시" 문자 | \ |
| \" | 문자열 안의 따옴표 | " |
| \' | 작은따옴표 (문자열에선 거의 안 씀) | ' |
| \r | 캐리지 리턴 (옛날 줄바꿈, 거의 안 씀) | |
| \0 | Null 문자 | (안 보임) |
| \b | 백스페이스 (이전 문자 지움 — 콘솔에서 항상 되는 건 아님) |
어떻게 동작하냐면
이스케이프 문자 써서 문자열을 몇 개 써보면 바로 느낌 올 거야.
Console.WriteLine("안녕, \"사용자\"!");
// 출력: 안녕, "사용자"!
Console.WriteLine("C:\\Program Files\\MyApp");
// 출력: C:\Program Files\MyApp
Console.WriteLine("문자열 1\n문자열 2");
// 출력:
// 문자열 1
// 문자열 2
Console.WriteLine("나\t탭을\t좋아해!");
// 출력:
// 나 탭을 좋아해!
이렇게, 백슬래시(\) 하나만 있으면, 거의 모든 특수문자를 문자열에 "밀어넣을" 수 있어. 컴파일러나 팀원도 당황 안 하고!
2. 일반 문자열과 리터럴 문자열 (@-문자열)
근데 만약 파일 경로처럼 백슬래시를 여러 번 써야 한다면? 매번 \\ 이렇게 쓰는 거, 진짜 귀찮지. 다행히 C#엔 리터럴 문자열(verbatim string)이 있어서, @로 시작하면 돼.
어떻게 생겼냐면?
string path = "C:\\Users\\Ann\\Documents\\";
string verbatimPath = @"C:\Users\Ann\Documents\";
리터럴 문자열에선 이스케이프 필요 없어 — 백슬래시가 그냥 문자야. 근데 한 가지 주의: 따옴표를 쓰고 싶으면 두 번 써야 해!
string quote = @"이건 따옴표가 들어간 리터럴 문자열: ""Hello""!";
Console.WriteLine(quote);
// 출력: 이건 따옴표가 들어간 리터럴 문자열: "Hello"!
비주얼 비교
| 스타일 | 문법 | 동작 방식 |
|---|---|---|
| 일반 | "C:\\Folder\\File.txt" | 백슬래시(\)마다 두 번 써야 함 |
| 리터럴 (@) | @"C:\Folder\File.txt" | 백슬래시(\) 그냥 써도 됨 |
| 리터럴 + 따옴표 | @"Text에 ""따옴표"" 있음" | 따옴표는 두 번 써야 함 |
꿀팁: 파일 경로나 여러 줄 텍스트, 정규식 패턴 쓸 땐 리터럴 문자열이 최고야.
3. 줄바꿈과 여러 줄 문자열
여러 줄 메시지나 ASCII 아트 같은 거 쓸 때 많지? 제일 직관적인 방법은 일반 문자열에서 \n 쓰거나, 리터럴 문자열 쓰는 거야. 리터럴 문자열은 줄바꿈도, 탭도, 있는 그대로 다 살려줘. 예시:
Console.WriteLine("첫 번째 줄\n두 번째 줄");
Console.WriteLine(@"여러 줄 문자열.
줄바꿈 이스케이프 필요 없음
탭도 그대로 들어감.");
그리고 C#에 최근에 raw string literal (따옴표 세 개)도 생겼어. 이건 따옴표 중복 없이 여러 줄 텍스트 쓸 수 있어. 예시:
string json = """
{
"name": "Alice",
"age": 30,
"skills": ["C#", "SQL", "Azure"]
}
""";
Console.WriteLine(json);
4. Unicode — C#에서 전 세계 문자 다루기
요즘은 라틴 알파벳만 쓰는 게 아니라, 한글, 한자, 수학 기호, 이모지까지 다 써야 하잖아. 이게 가능한 건 Unicode 문자 인코딩 덕분이야.
Unicode가 뭐냐면?
Unicode는 국제 표준이야. 모든 문자에 고유한 번호(code point)를 부여해서, 언어나 플랫폼 상관없이 쓸 수 있게 해줘. 그래서 C#에서도 한글, 영어, 중국어, 특수문자까지 다 한 번에 쓸 수 있어.
여러 언어로 된 문자열 예시:
Console.WriteLine("Hello, 세계! 你好! مرحبا!");
문자열에서 Unicode 문자 쓰기
네가 쓰는 인코딩에서 지원하는 문자는 그냥 바로 써도 되고, 이스케이프 시퀀스 \uXXXX (여기서 XXXX는 4자리 16진수 코드)로도 쓸 수 있어.
Console.WriteLine("문자: \u263A"); // ☺ 출력됨
65535보다 큰 코드(이모지 등)는 \UXXXXXXXX (8자리)로 써야 해:
Console.WriteLine("이모지: \U0001F60A"); // 😊 출력됨
이게 왜 좋냐면?
- 아무 텍스트나 저장하고 처리할 수 있어.
- 언어 섞어서 쓰거나 특이한 문자 써도 걱정 ㄴㄴ — C#이랑 .NET은 Unicode 바로 지원해.
- 특히 해외 유저나 특수 알파벳 쓸 때 필수!
5. 이모지와 특수문자 문자열에 넣기
요즘 문자열은 그냥 글자만 있는 게 아니라 이모지도 들어가야지! 예를 들어, 유저한테 귀여운 "웃는 얼굴" 보내고 싶을 때.
이모지 문자열에 넣는 법?
그냥 이모지 복붙해서 써:
필요한 이모지(예: 😊, 🚀, 🐱)를 복사해서 문자열에 붙여넣으면 돼:
Console.WriteLine("안녕! 😊");
Unicode 코드 쓰기:
대부분 이모지는 \U랑 8자리 코드로 쓸 수 있어.
Console.WriteLine("여기 고양이: \U0001F431"); // 🐱
이모지 코드는 온라인 Unicode 표에서 찾을 수 있어.
이모지 쓸 때 주의할 점
이모지는 문자열에서 2글자 이상 차지할 수도 있어 (Unicode 코드가 16비트보다 크니까).
예를 들어 문자열 길이 구할 때 "어라?" 할 수도 있음:
string s = "😊";
Console.WriteLine(s.Length); // 2가 나올 수도 있어!
이건 이 이모지의 codepoint가 문자 2개로 인코딩되기 때문이야.
콘솔이나 웹에 출력할 땐, 시스템/폰트가 지원하면 이모지 잘 나와.
이모지 들어간 문자열 출력 예시
Console.WriteLine("성공 축하해! 🎉 멋지다! 🚀");
6. 헷갈리기 쉬운 부분과 자주 하는 실수
처음엔 따옴표나 백슬래시 이스케이프에서 많이 헷갈려. 이스케이프 안 하면, 컴파일러가 문자열이 끝났다고 착각할 수도 있어.
실수 예시:
Console.WriteLine("그가 말했다: "안녕!""); // 오류! 컴파일러 멘붕.
정답:
Console.WriteLine("그가 말했다: \"안녕!\"");
또, 파일 경로 출력할 때 이렇게 쓰면:
Console.WriteLine("C:\Temp\file.txt"); // 오류나거나, 예를 들어: C: emp ile.txt 이렇게 나옴
왜냐면 \t랑 \f가 특수문자(탭, 폼피드)이기 때문이야. 이럴 땐 두 가지 방법이 있어:
Console.WriteLine("C:\\Temp\\file.txt"); // 백슬래시 두 번
Console.WriteLine(@"C:\Temp\file.txt"); // 리터럴 문자열
중요: 리터럴 문자열에서도 따옴표 쓰려면 두 번 써야 해:
Console.WriteLine(@"파일 ""config.txt""을(를) 찾을 수 없습니다."); // 파일 "config.txt"을(를) 찾을 수 없습니다.
GO TO FULL VERSION