본문 바로가기

.NET/C#

[C#] 문자열 보간 기능

C#에서 문자열을 사용하다 보면 아래와 같이 코드가 굉장히 지저분해지고 가독성도 떨어지는 경우가 꽤 있다.

// [학번] 이름 (나이) 주소 : 주소 형식으로 문자열을 생성해서 반환한다.
// ex) [00000001] 홍길동 (21) 주소 : 서울특별시 서초구
string makeString(string studentNumber, string name, int age, string address)
{
	return "[" + studentNumber + "] " + name + " (" + age + ") 주소 : " + address;
}

 

문자열과 데이터가 섞여야 하는 경우 문자열 보간 기능을 이용하면 아주 깔끔하게 코드를 작성할 수 있다.

// [학번] 이름 (나이) 주소 : 주소 형식으로 문자열을 생성해서 반환한다.
// ex) [00000001] 홍길동 (21) 주소 : 서울특별시 서초구
string makeString(string studentNumber, string name, int age, string address)
{
	return $"[{studentNumber}] {name} ({age}) 주소 : {address}";
}

위 코드는 처음 나온 코드를 문자열 보간 기능을 사용하도록 변경한 코드이다.

 

문자열 보간을 이용하려면 문자열을 시작하는 큰따옴표 앞에 $ 기호를 붙여서 시작한다. $ 기호가 붙은 문자열은 보간문자열로 인식되며, 문자열 내부에서는 중괄호({, })를 사용해 변수, 메서드, 수식 등을 문자열이 아닌 코드 취급을 받도록 할 수 있다.


{ } 안에 들어갈 수 있는 것들은 대표적으로 아래와 같은 것들이 있다.

 

1. 변수

보간문자열 안에 {변수명}이라는 내용이 포함되어 있다면 {변수명} 부분은 해당 변수가 가진 값으로 치환된다. {}에 들어갈 변수가 어떤 형식의 변수인지, 어떤 값을 가지고 있는지와 상관없이 암시적으로 ToString()을 호출해서 문자열로 변환해준다. (다만 null일 경우 빈 문자열 "" 이 됨)

 

2. 상수 or 수식

보간문자열 안에 {상수}가 들어간 경우 상수의 문자열 표현이 출력된다. 다만, {상수} 따위를 쓸 필요가 없다. 당연하게도 $"123"과 $"{123}" 은 같은 결과이기 때문이다.

수식이 들어가는 경우는 {1 + 2}나 {3.14 * radius * radius}와 같은 형태인데, 수식의 계산 결과값의 문자열 표현으로 치환된다. 수식에 변수를 포함할 수 있다.

 

3. 메서드

메서드 또한 사용이 가능한데, {myFunc()} 처럼 호출할 경우 메서드를 호출하고, 해당 메서드의 반환 값의 문자열 표현으로 치환된다. 당연히 반환형이 void인 메서드는 들어갈 수 없다.


 

만약 DateTime.Now.ToString("hh:mm:ss")처럼 ToString()에 별도의 형식을 지정할 수 있는 자료형의 경우 {DateTime.Now.ToString("hh:mm:ss")}도 물론 가능하지만, {DateTime.Now:hh:mm:ss}과 같이 데이터와 포맷을 콜론으로 구분해서 {데이터:포맷} 형식으로 간략화된 표현을 사용할 수 있다.

string str1 = $"{DateTime.Now.ToString("hh:mm:ss")}";	// OK!
string str2 = $"{DateTime.Now:hh:mm:ss}";		// 이것도 OK!

string str3 = $"{255:X2}";	// 255를 16진수 2자리로 표현
string str4 = $"{Math.PI:f5}";	// PI를 소수점 이하 5자리까지 표현

 

만약 문자열 보간을 사용하면서 문자열에 중괄호("{" 또는 "}")도 출력하고 싶다면 아래와 같이 '{'나 '}'를 두 번 적어서 이스케이프 할 수 있다.

string str = $"{{Game of the year is {GameName}!!}}";

 

마지막으로 문자열 보간을 경로문자열을 의미하는 @ 기호와 같이 사용할 때는, $@ 순으로 입력한다.

string path = $@"C:\Users\{userName}\Desktop\";