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\";
'.NET > C#' 카테고리의 다른 글
[C#] using 구문 사용법 (0) | 2021.07.23 |
---|---|
[C#] delegate와 delegate 체인 (0) | 2021.07.20 |
[C#] 소켓 연결 시도에 타임아웃 넣기 (0) | 2021.07.14 |
[C#] as, is 키워드 사용법 (0) | 2021.07.14 |
[C#] 확장 메서드를 사용해 메서드 호출을 간결하게 하기 (0) | 2021.07.09 |