푸터 콘텐츠로 바로가기
Iron Academy Logo
C# 및 .NET의 새로운 기능

C# 10 및 .NET 6에서 상수 보간을 10분 안에 익히는 방법

Tim Corey
6분 14초

C#은 새로운 버전이 출시될 때마다 강력함과 우아함 면에서 지속적으로 발전하여 개발자에게 더욱 깔끔하고 효율적인 코드 작성 방법을 제공합니다. C# 10에서 도입된 추가 기능 중 하나는 상수 보간 문자열입니다. 이 기능을 통해 개발자는 상수 내에서 문자열 보간을 사용할 수 있습니다.

이 기능이 추가되기 전에는 보간을 사용하여 상수 문자열(예: $"{companyName} Products")을 생성하려고 하면 컴파일러에서 오류가 발생했습니다. 상수 값에는 일반 문자열 리터럴만 할당할 수 있었기 때문에 상수 메시지나 속성 문자열을 만들 때 반복적이거나 어색한 코드가 발생하는 경우가 많았습니다.

C# 10 및 .NET 6 이상 버전에서는 컴파일 시점에 직접 보간된 문자열을 사용하여 상수를 결합할 수 있습니다. 이 개선 사항은 코드를 더 깔끔하게 만들 뿐만 아니라 프로그램 실행 전에 모든 값이 평가되므로 효율성도 향상시킵니다.

이 기능이 어떻게 작동하는지 더 명확하게 이해하려면 Tim Corey가 자신의 비디오 " C# 10 및 .NET 6에서 10분 안에 배우는 상수 보간 "에서 개념을 단계별로 설명합니다. Tim은 특유의 간결하고 실용적인 교육 스타일로 이 새로운 기능이 무엇을 하는지, 기존 문자열 연결과 어떻게 다른지, 그리고 특히 속성에서 어떻게 유용하게 사용될 수 있는지 설명합니다.

그럼 Tim의 설명을 통해 C#에서 상수 보간 문자열이 정확히 어떻게 작동하는지, 그리고 개발자에게 왜 유용한 기능인지 알아보겠습니다.

소개

이 영상에서 Tim은 익숙한 달러 기호($) 구문을 사용하는 보간 문자열을 이제 상수 표현식에서 사용할 수 있게 되었다고 설명합니다. 이전에는 불가능했던 기능입니다. 이 작은 변화 덕분에 연속적인 현 구성이 더 쉽고 깔끔하며 유지 관리가 용이해졌습니다.

.NET 6에서 상수 살펴보기

Tim은 .NET 6 콘솔 애플리케이션을 열고 상용구 코드를 제거하여 상수 정의에만 집중합니다.

그는 가장 기본적인 상수 문자열 선언부터 시작합니다.

const string companyName = "Acme";
const string companyName = "Acme";

이것은 상수 문자열에 할당된 간단한 문자열 리터럴입니다. 이러한 상수들은 컴파일 시점에 평가되므로, 그 값은 고정되어 컴파일된 프로그램에 포함됩니다.

하지만 팀은 곧바로 핵심 질문으로 넘어갑니다. 상수 문자열을 병합하거나 보간을 사용하여 다른 문자열 안에 값을 직접 삽입하려면 어떻게 해야 할까요?

C# 9 이전 버전에서는 이렇게 할 수 없었습니다.

const string productName = $"{companyName} Anvils"; // Not allowed before C# 10
const string productName = $"{companyName} Anvils"; // Not allowed before C# 10

이 줄은 상수 표현식에 대해 문자열 보간이 지원되지 않으므로 컴파일 오류를 발생시킵니다.

C# 10에서 상수 보간 문자열

Tim이 보여주는 것처럼 C# 10에서는 컴파일러가 이제 상수 보간 문자열을 지원합니다. 단, 내부의 모든 보간 표현식 자체가 상수여야 합니다.

이제 다음 예제는 완벽하게 작동합니다.

const string productName = $"{companyName} Anvils";
const string productName = $"{companyName} Anvils";

이는 상수 보간 문자열입니다. 즉, 컴파일러는 런타임이 아닌 컴파일 타임에 보간 문자열을 평가합니다. 프로그램 실행 시 추가적인 문자열 연결이나 문자열 서식 지정은 발생하지 않으며, 컴파일러는 "Acme Anvils"와 같은 단일 상수 문자열 리터럴을 생성합니다.

팀은 companyName 값을 "Acme"에서 "ABC"로 변경하면 컴파일러가 productName에 대해 자동으로 "ABC Anvils"를 생성한다고 설명합니다. 이는 런타임 보간이 아니라 컴파일 타임 문자열 생성입니다.

이 개선 사항 덕분에 + 연산자를 사용하거나 값을 수동으로 반복 입력하지 않고도 상수 문자열을 훨씬 쉽게 병합할 수 있습니다.

중첩 상수 보간

팀은 또 다른 상수 정의를 통해 한 단계 더 나아갑니다.

const string productDescription = $"{productName} are the best way to crush unsuspecting roadrunners.";
const string productDescription = $"{productName} are the best way to crush unsuspecting roadrunners.";

이는 중첩 보간의 예로, 하나의 상수 보간 문자열(productName)이 다른 상수 보간 문자열 내부에 사용됩니다.

컴파일러는 이 모든 것을 상수 표현식으로 처리하여 컴파일 시점에 단일하고 변경 불가능한 문자열 표현을 생성합니다.

Tim이 프로그램을 실행하면 다음과 같은 출력이 나타납니다.

Acme Anvils are the best way to crush unsuspecting roadrunners.
Acme Anvils are the best way to crush unsuspecting roadrunners.

이는 상수 보간법이 여러 상수에 걸쳐서도 원활하게 작동함을 확인시켜 줍니다.

상수가 중요한 이유

이 시점에서 Tim은 잠시 멈춰 상수, 그리고 이제는 상수 보간 문자열이 유익한지 설명합니다.

그는 상수의 값이 컴파일된 코드에 직접 저장되고 메모리에 별도의 인스턴스로 저장되지 않기 때문에 메모리 효율성이 매우 높다고 지적합니다.

반면, 개발자들이 이전에 비슷한 기능을 필요로 했을 때는 읽기 전용 필드를 사용하는 경우가 많았습니다.

readonly string companyName = "Acme";
readonly string companyName = "Acme";

하지만 Tim은 읽기 전용 필드가 상수 필드와는 다르다고 지적합니다. 읽기 전용 필드는 런타임에 평가되므로 더 많은 메모리를 소비하고 컴파일 시간 최적화를 방해합니다.

상수 보간 문자열을 사용하면 컴파일 시간 상수로 유지되는 표현력이 풍부하고 재사용 가능한 형식의 문자열을 작성할 수 있으므로 가독성과 성능이 모두 향상됩니다.

실제 예시 - 속성에 상수 사용하기

이어서 팀은 이 새로운 기능인 속성이 빛을 발하는 실제 시나리오를 소개합니다.

그는 Main() 함수 내부에 간단한 로컬 메서드를 정의합니다.

void SayHi() { }
void SayHi() { }

그런 다음 그는 변수를 참조하는 문자열 메시지와 함께 [Obsolete] 속성을 적용하려고 시도합니다.

string myCompany = "Tim's Company";
[Obsolete($"This is no longer used for {myCompany}")]
string myCompany = "Tim's Company";
[Obsolete($"This is no longer used for {myCompany}")]

속성은 매개변수로 상수 표현식만 허용하기 때문에 이 방법은 실패합니다. 컴파일러는 myCompany가 상수가 아닌 변수이기 때문에 오류를 발생시킵니다.

팀은 해당 속성의 메시지가 컴파일 타임에 일정해야 하며, 런타임 값이나 인스턴스 변수에 의존해서는 안 된다고 설명합니다.

하지만 C# 10의 상수 보간 문자열 덕분에 이제 이 작업을 안전하게 수행할 수 있습니다.

const string productName = $"{companyName} Anvils";
[Obsolete($"This is no longer used for {productName}")]
const string productName = $"{companyName} Anvils";
[Obsolete($"This is no longer used for {productName}")]

여기서 컴파일러는 companyName과 productName이 모두 상수임을 인식하므로, 보간된 전체 문자열은 상수 표현식이 됩니다.

컴파일러는 컴파일 시점에 형식화된 문자열을 생성하여 속성 내에서 유효한 문자열이 되도록 합니다.

이 예시는 상수 보간이 단순히 구문적 편의 기능에 그치는 것이 아니라, 컴파일 타임에 형식화된 문자열을 속성이나 메타데이터에 직접 사용하는 것과 같은 새로운 시나리오를 가능하게 한다는 점을 완벽하게 보여줍니다.

비하인드 스토리 — 컴파일러는 어떻게 처리할까요?

Tim은 영상에서 컴파일러의 내부 작동 방식에 대해 자세히 설명하지는 않지만, 이 개념은 C# 10에서 문자열 보간 처리기가 작동하는 방식과 밀접한 관련이 있습니다.

일반적으로 컴파일러는 보간된 문자열을 만나면 형식 문자열 작업과 유사한 코드를 생성하여 내부적으로 AppendLiteral() 및 AppendFormatted()와 같은 함수를 호출합니다.

하지만 상수 보간 문자열을 처리할 때는 컴파일러가 모든 것을 컴파일 시간에 평가하므로 생성된 IL 코드에는 보간 문자열 핸들러나 메서드 호출이 포함되지 않습니다.

즉, 결과 값은 일반 문자열 리터럴처럼 동작하지만, 다른 상수의 표현식을 포함하여 구성할 수도 있습니다.

이는 표현력과 효율성 사이의 우아한 균형입니다. 컴파일러가 문자열 생성을 정적으로 처리하므로 런타임 비용이 전혀 발생하지 않습니다.

상수 보간 문자열은 언제 사용해야 할까요?

팀은 모든 사람이 이 기능을 매일 사용하지는 않을 것이라는 점을 인정합니다. 상수나 속성을 거의 정의하지 않는 개발자는 당장 효과를 보지 못할 수도 있습니다.

하지만 컴파일 타임 정의, 상수 메시지 또는 속성 메타데이터를 많이 생성하는 사용자에게는 이 기능이 코드를 단순화하고 문자열 연결로 인한 혼란을 방지합니다.

또한 상수는 불변이며 컴파일러에 의해 검사되므로 더 안전합니다. 동적으로 연결된 문자열이나 잘못 관리된 변수로 인한 오류를 제거할 수 있습니다.

이렇게 하면 코드가 더욱 견고해지고, ​​읽기 쉬워지며, 유지 관리가 간편해집니다.

결론

팀은 영상 말미에서 개발자들에게 자신들의 프로젝트에서 상수 보간 문자열을 사용할지 여부를 생각해 보라고 권유합니다. 어떤 사람들은 컴파일 시 더 깔끔한 형식의 문자열을 얻기 위해 이러한 기능이 필수적이라고 생각할 수 있지만, 다른 사람들은 이를 사소한 편의 기능으로 여길 수도 있습니다.

어쨌든, 팀의 시연은 이 기능을 효과적으로 구현하고 적용하는 방법을 정확하게 보여줍니다.

요약하자면:

  • 상수 보간 문자열을 사용하면 상수 내에 보간 표현식을 사용할 수 있습니다.

  • 컴파일 시점에 평가되어 효율적인 문자열 리터럴을 생성합니다.

  • 반복적인 문자열 연결을 더 깔끔한 구문으로 대체합니다.

  • 이러한 기능은 속성, 상수 기반 구성 및 메타데이터 메시지에서 특히 유용합니다.

C# 10의 상수 보간은 가독성과 컴파일 시간 안전성을 결합하여 표현력이 풍부하고 효율적인 C# 프로그래밍을 향한 또 다른 발걸음을 내딛는 것입니다. 팀 코리의 예제가 이를 명확하게 보여줍니다.

Hero Worlddot related to C# 10 및 .NET 6에서 상수 보간을 10분 안에 익히는 방법
Hero Affiliate related to C# 10 및 .NET 6에서 상수 보간을 10분 안에 익히는 방법

사랑하는 것을 공유하여 더 많은 수익을 얻으세요

당신은 .NET, C#, Java, Python, 또는 Node.js를 다루는 개발자를 위한 콘텐츠를 만드나요? 당신의 전문성을 추가 수입으로 전환하세요!

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해