HOWTO · Csharp

C#에서 typedef의 대안

using 별칭을 사용해 C#에서 typedef와 같은 이름을 만드는 방법과 C# 12 튜플 별칭 및 일반 제네릭 형식 별칭 예제를 설명합니다.

이 페이지의 내용

C#에는 typedef 키워드가 없습니다. 가장 가까운 기능은 using 별칭이며, 기존 네임스페이스나 형식에 파일 범위의 다른 이름을 지정합니다.

별칭은 가독성을 높이지만 런타임에 새 형식을 만들지는 않습니다. 동작이나 유효성 검사를 가진 별도 형식이 필요하면 클래스, record 또는 구조체를 정의합니다.

기존 형식에 using 별칭 사용

별칭을 파일 위쪽의 다른 using 지시문과 함께 배치하고 완전한 형식 이름을 대상에 사용합니다. 그러면 다른 using 지시문에 의존하지 않습니다.

예를 들어 using RouteTable = System.Collections.Generic.Dictionary<string, System.Collections.Generic.List<int>>;는 이미 존재하는 닫힌 제네릭 형식에 이름을 붙입니다.

RouteTable은 Dictionary<string, List<int>>의 짧은 표기일 뿐입니다. 형식 안전성이나 새 선언을 추가하지 않으며, 일반 별칭은 선언된 소스 파일에서만 사용할 수 있습니다.

using의 각 형태는 역할이 다릅니다. using System.Text;는 네임스페이스를 가져오고, using static System.Math;는 정적 멤버를 가져오며, using RouteTable = ...;는 별칭을 만듭니다.

C# 12 튜플 별칭과 제네릭 형식 별칭

C# 12에서는 튜플처럼 이전에는 이름을 지정할 수 없었던 형식도 using 별칭의 대상으로 사용할 수 있습니다. 이름 있는 형식과 구성된 제네릭 형식의 일반 별칭은 C# 12 이전부터 지원되었습니다. 다음 예제는 두 형태를 모두 사용합니다.

using RouteTable = System.Collections.Generic.Dictionary<string, System.Collections.Generic.List<int>>;
using Coordinate = (double Latitude, double Longitude);

RouteTable routes = new() { ["home"] = [1, 2] };
Coordinate point = (52.37, 4.90);

System.Console.WriteLine($"{routes["home"].Count}:{point.Latitude:F2}");
2:52.37

이 성공 사례는 네트워크를 사용하지 않는 격리된 .NET 10.0.401 환경에서 복원하고 빌드했습니다. 프로젝트를 컨테이너의 임시 저장소에 복사하고 --ignore-failed-sources로 복원한 뒤 실행했으며 fixture와 이미지는 변경하지 않았습니다.

프로젝트가 C# 11 이하를 대상으로 한다면 임의의 형식에 대한 별칭이 컴파일된다고 가정하지 마세요. 도구 체인을 업데이트하거나 전체 형식 이름을 사용합니다. 이름 있는 형식의 별칭은 C# 12보다 이전부터 지원되었습니다.

별칭이 하지 않는 일

별칭은 typedef처럼 독립적인 형식이 아닙니다. RouteTable과 전체 Dictionary 형식은 컴파일 시 서로 바꿔 사용할 수 있습니다. 값을 다른 값과 혼동하지 않게 하려면 record나 구조체 같은 실제 도메인 형식을 사용합니다.

튜플 별칭도 튜플 모양에 읽기 좋은 이름을 붙일 뿐이며 이름 있는 클래스로 바꾸지 않습니다. 요소 이름은 접근과 문서화에 도움을 주지만 독립적인 형식 정체성을 제공하지 않습니다.

nullable 참조 별칭 대상의 경계

확장된 별칭 문법에도 제한이 있습니다. 최상위 nullable 참조 형식은 별칭 대상이 될 수 없습니다. 따라서 using MaybeName = string?;는 의도적으로 잘못된 선언입니다.

컴파일러는 string?가 이 위치에서 허용된 별칭 대상이 아니라 nullable 참조 주석이므로 선언을 거부합니다. 경계 fixture는 컴파일에 실패해야 하며 실행 가능한 해결책으로 제시하면 안 됩니다.

실제 형식을 정의할 때

이름이 별도의 개념을 나타내야 한다면 클래스, record 또는 구조체를 선택합니다. 불변 조건, 검증, 메서드, 제어된 생성, 같음 의미 또는 공개 API가 필요할 때 실제 형식이 적합합니다. 파일 안에서 긴 형식의 표기만 줄이려면 별칭을 사용합니다.

자세한 내용은 Microsoft의 using 지시문, C# 12, using alias 제안을 참조하세요.

FAQ

  1. C#은 typedef를 지원하나요? 아니요. using 별칭이나 실제 형식을 사용합니다.
  2. 튜플에 별칭을 지정할 수 있나요? C# 12부터 가능합니다.
  3. 모든 파일에서 별칭을 사용할 수 있나요? 아니요. 선언한 파일에서만 유효합니다.
  4. 새 형식을 만드나요? 아니요. 기존 형식을 가리킵니다.
  5. using MaybeName = string?;가 실패하는 이유는 무엇인가요? 최상위 nullable 참조 형식은 별칭 대상으로 금지되어 있습니다.