아이템 4: String.Format()을 보간 문자열로 대체하라

C#은 C에서 사용되던 API를 그대로 수용하여 동일한 방법으로 문자열을 만들 수 있었다.

하지만 C# 6.0부터 지원하는 문자열 보간 기능을 사용해라..!

지금도 실제로 많이 사용하는 기능..

장점

이 기능의 좋은 점은 크게 몇가지가 있다.

먼저 코드의 가독성이 대폭 향상된다. (100번 공감)

또한 컴파일러 입장에서 정적 타입 검사를 수행할 수 있기 때문에 개발자의 실수를 미연에 방지할 수 있다.

마지막으로 기존 방식에 비해 문자열을 생성하기 위한 표현식이 더 풍성하다

단점

반면 그전까지 많이 사용되던 string.forma()은 문자열 변환 과정은 잘 수행하지만 눈으로 직접 보기 전까지 올바른 형태인지 알 수 없었다.

그 이유는 메서드가 포맷 문자열과 인자 리스트를 분리하여 전달하는 구조이기 때문이다.

또한 이 메서드는 포맷 문자열에 나타낸 인자의 개수와 실제로 전달되는 인자의 개수가 정확히 일치하는지를 확인하지 않는다.

따라서 실수하여 인자를 누락하면 런타임에 에러가 발생한다.

게다가 포맷 문자열과 출력할 내용을 담고 있는 배열을 나누어 전달하면 인자의 순서가 올바른지 확인하기도 어렵다.

보간 문자열

보간 문자열은 문자열 앞에 $만 붙이면 된다. (거의 IDE가 괄호까지 만들어주는 듯)

약간의 문법 설탕(Syntactic sugar)으로 아주 괜찮은 기능인 것 같다.

문법 설탕이란..? 읽는 사람 또는 작성하는 사람이 편하게 디자인 된 문법이라는 뜻

사실 대체 문자열에서 사용하는 코드를 표현식이라고 하는 것은 상당히 조심스러운데, 이는 if/else나 while과 같이 제어 흐름을 변경하는 코드는 쓸 수 없기 때문에 만일 이러한 제어 흐름이 필요하다면 다른 메서드를 정의하여 관련 기능을 구현하고, 대체 문자열에서 그 메서드를 호출하는 방법을 취해야 한다.

사용 예제

Console.WriteLine($"The Value of pi is {Math.PI}");

사용자가 문자열 보간 기능을 사용하더라도 실제 C# 컴파일러는 param을 이용하여 Object배열를 전달하는 기존 포매팅 함수를 호출하도록 코드를 생성한다.

여기서 Math.PI는 double이므로 값 타입이다.

따라서 이를 object 타입으로 박싱을 수행해야 하는데 이는 반복 루프에서 사용하게 되면 성능에 좋지않은 영향을 끼칠 수 있기 때문에 아래와 같이 사용하는 것이 좋다.

Console.WriteLine($"The Value of pi is {Math.PI.ToString()}");

만약 ToString이 유용하지 않다고 느낀다면 인자값으로 포맷팅을 넘기거나 ToString 메서드 자체를 오버로딩하여 작업할 수 있다.

Console.WriteLine($"The Custome's name is {c?.Name ?? "Unkown"}");

이런 표현식도 내부에 들어가는 것은 상당한 이점이기도 하지만 가독성을 떨어트리는 요소라고 생각이 들기도 한다.

이외에도 Linq와 사용도 가능하고 다양하지만 실제로는 사용하지 않을 것 같으니 패스..

정리하자면 문자열 보간 기능은 실수를 줄이고 더욱 강력한 기능과 활용도를 보장한다.

댓글남기기