본문 바로가기
게임개발/Effective C#

[Effective C#] string.Format() vs 문자열 보간

by 개발도사(진) 2023. 11. 12.

string.Format() 대신 문자열 보간 기능을 사용한다.

 

int height = 175;
int age = 26;
//문자열 보간(string interpolation)
Console.WriteLine($"I'm {age} years old. I'm {height}cm tall");
//String.Format
Console.WriteLine(String.Format("I'm {0} years old. I'm {1} cm tall", age, height));

 

위 두 코드는 모두 같은 문자열, "I'm 26 years old. I'm 175cm tall" 이라는 결과를 출력한다. 그러나 String.Format() 함수를 사용하는 대신 문자열 보간 기능(string interpolation)을 사용하는 것이 더 좋은 까닭은 아래와 같다.

1. 가독성 향상

2. 정적 타입 검사로 인한 개발자 실수 방지

3. 문자열을 생성하기 위한 표현식이 풍성함

 

1번 가독성 향상은 위 간단한 예시로도 바로 와 닿을 수 있을 것이다. 3번의 경우에는 내가 공부한 책에 몇 가지 예문이 소개되어 있지만, 결국 여러 상황에서 직접 써 보면서 숙달해야 되는 부분이기 때문에 넘어가겠다.

 

결국 가장 중요한 이유는 2번이라고 생각한다. 문자열 보간 기능을 사용하는 것이 정적 타입 검사로 인해 개발자의 실수를 방지할 수 있는 까닭은, String.Format() 메서드가 필요한 인자 갯수와 실제 전달된 인자 갯수가 같은지 비교하지 않기 때문이다. 즉 인자를 n개 요구하면서 실제로 n-1 개 인자를 전달해도 실제 실행되기 전까지 오류가 안 난다.

int height = 175;
int age = 26;
//문자열 보간(string interpolation)
Console.WriteLine($"I'm {age} years old. I'm {height}cm tall");
//String.Format
Console.WriteLine(String.Format("I'm {0} years old. I'm {1} cm tall", age));

위 코드를 이렇게 써도 직접 실행하기 전까지는 아무런 문제가 없다. 그러나 이 코드는 막상 실행되면 runtime에 예외(System.FormatException)을 발생시킨다.

 

String.Format() 메서드가 이런 문제를 갖고 있는 이유는 이 메서드가 포맷 문자열과 인자 리스트를 분리 전달하는 구조이기 때문이다. 그렇기 때문에 위 예제처럼 인자를 누락시키는 경우 말고도, 아래와 같이 인자의 순서를 잘못 전달한 경우도 피곤한 일이 발생한다.

int height = 175;
int age = 26;

//문자열 보간(string interpolation)
Console.WriteLine($"I'm {age} years old. I'm {height}cm tall");
//String.Format
Console.WriteLine(String.Format("I'm {0} years old. I'm {1}cm tall", height, age));

 

runtime에 에러가 생기지는 않지만 175세에 키가 26cm인 꽤 작고 늙운 노인이 출력된다. 요컨대, String.Format()을 사용하면 문자열 보간을 사용하는 것에 비해 코드의 가독성, 안전함 측면에서 많은 것을 놓치게 된다.