.NET의 모든 타입에는 네임스페이스와 타입 이름으로 이루어진 전체 이름이 있습니다: System.Console, System.Collections.Generic.List<T>, System.Text.StringBuilder. 네임스페이스는 관련 타입을 묶고 이름 충돌을 막아 주므로, 직접 만든 Order나 Timer 클래스가 라이브러리의 같은 이름 클래스와 함께 존재할 수 있습니다. 파일 맨 위의 using 지시문은 네임스페이스를 가져와 짧은 이름을 쓸 수 있게 합니다.
출력:
Cart: tea, honey
1
using 지시문은 컴파일 시점의 이름에만 영향을 줍니다. 라이브러리를 로드하거나 프로그램에 코드를 추가하지 않습니다. 어떤 라이브러리를 쓸 수 있는지는 프로젝트 참조와 NuGet 패키지가 정합니다. 컴파일러가 타입이나 네임스페이스를 "could not be found (are you missing a using directive or an assembly reference?)"라고 보고하면(CS0246 오류), using 줄이 빠졌거나 패키지가 참조되지 않은 것입니다.
네임스페이스 직접 선언하기
타입을 namespace 블록 안에 넣습니다. 네임스페이스는 점으로 이어 중첩할 수 있고, 같은 네임스페이스를 여러 파일에 나눠 둘 수 있습니다.
출력:
120.00 via DHL
Shop.Billing.Invoice
namespace Shop.Billing { }은 namespace Shop { namespace Billing { } }의 축약형입니다. 이름은 둘러싼 네임스페이스에서 먼저 찾으므로 Shop 안의 코드는 Shop. 접두사 없이 Billing.Invoice라고 쓸 수 있습니다.
관례: 회사나 제품 이름(Contoso.Payments)으로 시작하고, 그다음 기능이나 계층을 붙이며, 폴더 구조와 맞춥니다(Contoso.Payments/Refunds/RefundService.cs에는 Contoso.Payments.Refunds가 들어갑니다). 클래스 이름을 네임스페이스와 같게 짓지 마세요(Shop.Shop). 어디서나 어색하게 한정해야 합니다.
별칭
using Name = Namespace.Type;은 타입(또는 네임스페이스)에 지역 이름을 붙입니다. 긴 제네릭 타입을 줄일 때와 충돌을 해결할 때, 두 가지 상황에 씁니다.
출력:
latte: 3.60
order 17
별칭은 선언된 파일에만 적용됩니다(아래의 global이 아니라면). C# 12 이상에서는 별칭이 튜플과 배열을 포함한 모든 타입을 가리킬 수 있습니다: using Point = (int X, int Y);.
모호한 참조(CS0104)
가져온 두 네임스페이스에 같은 이름의 타입이 있으면 짧은 이름을 쓰는 것이 오류가 됩니다. 대표적인 예가 Timer로, System.Threading, System.Timers, 그리고 (데스크톱 앱에서는) System.Windows.Forms에 있습니다:
using System.Threading;
using System.Timers;
var t = new Timer(1000);
// error CS0104: 'Timer' is an ambiguous reference between
// 'System.Timers.Timer' and 'System.Threading.Timer'
가장 국소적인 것부터 세 가지 해결책이 있습니다. 정규화된 이름(new System.Timers.Timer(1000))을 쓰거나, 어느 쪽인지 밝히는 별칭을 추가하거나, 필요 없는 지시문을 지웁니다.
출력:
250
System.Timers.Timer
System.Threading.Timer
내 네임스페이스에 System이나 Console이라는 타입이 있으면, 접두사 global::로 루트부터 찾게 할 수 있습니다: global::System.Console.WriteLine("hi");. 생성된 코드가 어디서나 이 접두사를 쓰는 이유입니다.
using static
using static은 한 타입의 정적 멤버를 가져와 타입 이름 없이 호출할 수 있게 합니다. Math처럼 같은 클래스를 계속 호출하는 코드에 어울립니다:
출력:
Area: 28.27
Hypotenuse: 5
42
using static은 열거형(using static System.DayOfWeek;이면 Monday라고 쓸 수 있습니다)과 직접 만든 정적 클래스에도 쓸 수 있습니다. 짧은 이름이 모호하지 않은 곳에서 쓰세요. 큰 파일에서 WriteLine만 덩그러니 있으면 읽는 사람이 어느 writer인지 헷갈릴 수 있습니다.
global using과 파일 범위 네임스페이스(C# 10)
C# 10의 두 기능이 파일 맨 위의 반복 코드를 줄여 줍니다. global using은 프로젝트의 모든 파일에 적용되며, 보통 GlobalUsings.cs 같은 한 파일에 모아 둡니다:
// GlobalUsings.cs, C# 10 and later
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using Money = System.Decimal;
.NET 6 이상의 SDK 프로젝트는 이를 자동으로 생성할 수 있습니다. .csproj에 <ImplicitUsings>enable</ImplicitUsings>가 있으면(새 템플릿의 기본값) 콘솔 프로젝트는 System, System.Collections.Generic, System.IO, System.Linq, System.Net.Http, System.Threading, System.Threading.Tasks를 받고, 웹 프로젝트는 ASP.NET Core 네임스페이스도 받습니다. 최신 Program.cs 파일이 바로 코드로 시작하는 이유입니다.
파일 범위 네임스페이스는 블록 대신 세미콜론으로 파일 전체의 네임스페이스를 선언해 들여쓰기 한 단계를 줄여 줍니다:
// C# 10 and later
namespace Shop.Billing;
public class Invoice
{
public decimal Amount { get; set; }
}
한 파일에는 파일 범위 네임스페이스를 하나만 둘 수 있고, 같은 파일에서 블록 네임스페이스와 섞을 수 없습니다. 예전 프로젝트, Unity 스크립트, .NET Framework를 대상으로 하는 코드는 앞에서 본 블록 형태를 씁니다.
using 지시문의 위치, 그리고 using 문
using 지시문은 파일에서 모든 네임스페이스나 타입 선언보다 앞에 와야 합니다(global using은 그보다도 앞). 네임스페이스 블록 안에 둘 수도 있는데, 이 경우 그 안에만 적용됩니다. 스타일 가이드마다 다르지만 대부분의 .NET 코드는 맨 위에 둡니다.
using 키워드에는 메서드 안에서 쓰는 관련 없는 두 번째 역할이 있습니다. using 문 using (var file = File.OpenRead(path)) { ... }은 블록이 끝날 때 객체의 Dispose를 호출해 파일과 연결을 닫습니다. 키워드만 같고 나머지는 전혀 다릅니다. using 문 페이지를 참고하세요.
자주 묻는 질문
C#에서 using은 무엇을 하나요?
파일 맨 위의 using System.Text;는 네임스페이스를 가져오는 지시문이라서 System.Text.StringBuilder 대신 StringBuilder라고 쓸 수 있습니다. 코드를 추가하거나 무언가를 로드하지 않고 이름만 줄여 줍니다. 메서드 안의 using (var f = ...)는 다른 기능인 using 문으로, 블록이 끝날 때 객체를 dispose합니다.
C#에서 네임스페이스란 무엇인가요?
네임스페이스는 System.Collections.Generic이나 MyShop.Billing처럼 이름이 붙은 타입 묶음으로, 이름 충돌을 막고 코드를 정리합니다. 두 클래스는 서로 다른 네임스페이스에 있으면 같은 이름을 가질 수 있습니다. 관례상 네임스페이스는 폴더 구조를 따르고 회사나 제품 이름으로 시작합니다.
C#의 using static은 무엇인가요?
using static System.Math;는 한 타입의 정적 멤버를 가져오므로 Math. 접두사 없이 Sqrt(16)을 호출하고 PI를 읽을 수 있습니다. 직접 만든 클래스와 열거형을 포함해 어떤 클래스에도 쓸 수 있습니다. 수학 계산이 많은 코드처럼 짧은 이름이 계속 명확한 곳에서 쓰세요.
C#에서 "is an ambiguous reference" 오류는 어떻게 해결하나요?
CS0104 오류는 가져온 두 네임스페이스에 같은 이름의 타입이 있다는 뜻입니다. 예를 들어 Timer는 System.Threading과 System.Timers에 모두 있습니다. 정규화된 이름(System.Timers.Timer)을 쓰거나, using 지시문 하나를 지우거나, 별칭을 추가하세요: using Timer = System.Timers.Timer;.
C#의 global using은 무엇인가요?
global using System.Text;(C# 10)는 그 줄이 있는 파일만이 아니라 프로젝트의 모든 파일에 네임스페이스를 가져옵니다. .NET 6 이상 SDK 프로젝트는 <ImplicitUsings>enable</ImplicitUsings>가 설정되어 있으면 global using 집합을 자동으로 생성하며, 그래서 새 Program.cs 파일에는 using 줄이 없습니다.