using
지시문
using
지시문을 사용하면 네임스페이스에 정의된 형식을 해당 형식의 정규화된 네임스페이스를 지정하지 않고도 사용할 수 있습니다. using
지시문의 기본 형태는 아래의 예에서 볼 수 있듯이 단일 네임스페이스에서 모든 형식을 가져옵니다.
using System.Text;
using
지시문에 다음과 같은 두 개의 한정자를 적용할 수 있습니다.
global
한정자는 프로젝트에 있는 모든 소스 파일에 동일한using
지시문을 추가하는 것과 같은 효과가 있습니다. 이 한정자는 C# 10에서 도입되었습니다.static
수정자는 네임스페이스에 있는 모든 형식을 가져오는 대신 단일 형식에서static
멤버 및 중첩 형식을 가져옵니다.
두 한정자를 결합하여 형식의 정적 멤버를 프로젝트의 모든 원본 파일로 가져올 수 있습니다.
‘using 별칭 지시문’을 사용하여 네임스페이스 또는 형식의 별칭을 만들 수도 있습니다.
using Project = PC.MyCompany.Project;
‘using 별칭 지시문’에 global
한정자를 사용할 수 있습니다.
참고 항목
using
키워드는 파일 및 글꼴과 같은 IDisposable 개체가 제대로 처리될 수 있게 도와주는 using
문을 만드는 데도 사용됩니다. using
문에 대한 자세한 내용은 using
문을 참조하세요.
global
한정자가 없는 using
지시문의 범위는 해당 지시문이 나타나는 파일입니다.
지시문은 global using
모든 네임스페이스 및 형식 선언 앞에 나타나야 합니다. 모든 전역 using 지시문은 비글로벌 using
지시문 앞에 소스 파일에 표시되어야 합니다.
다른 using
지시문은 다음과 같이 표시할 수 있습니다.
- 소스 파일의 시작 부분, 네임스페이스 또는 형식 선언 앞에 나타날 수 있습니다.
- 차단된 범위 네임스페이스에서만 해당 네임스페이스에 선언된 네임스페이스 또는 형식 앞에 있습니다.
그렇지 않으면 컴파일러 오류가 생성됩니다.
using
지시문을 만들어서 네임스페이스를 지정할 필요 없이 네임스페이스에서 이 형식을 사용합니다. using
지시문은 지정한 네임스페이스 안에 중첩된 어떠한 네임스페이스에 대해서도 액세스 권한을 제공하지 않습니다. 네임스페이스는 두 가지 범주인 사용자 정의 및 시스템 정의로 구분됩니다. 사용자 정의 네임스페이스는 코드에서 정의된 네임스페이스입니다. 시스템 정의 네임스페이스 목록은 .NET API 브라우저를 참조하세요.
한 global
정자
using
지시문에 global
한정자를 추가하는 것은 컴파일(일반적으로 프로젝트)의 모든 파일에 using이 적용된다는 것을 의미합니다. global using
지시문은 C# 10에 추가되었습니다. 사용되는 구문은 다음과 같습니다.
global using <fully-qualified-namespace>;
여기서 정규화된 네임스페이스는 네임 스페이스를 지정하지 않고 형식을 참조할 수 있는 네임스페이스의 정규화된 이름입니다.
global using 지시문은 모든 소스 코드 파일의 시작 부분에 나타날 수 있습니다. 하나의 파일에서 모든 global using
지시문은 다음과 같은 항목 앞에 나타나야 합니다.
global
한정자가 없는 모든using
지시문- 해당 파일의 모든 네임스페이스와 형식 선언
모든 소스 파일에 지시문을 추가할 global using
수 있습니다. 일반적으로 단일 위치에 유지하려고 합니다. 하나의 파일 안에서 또는 파일 간에 global using
지시문의 순서는 중요하지 않습니다.
한 global
정자를 한정자와 static
결합할 수 있습니다. global
한정자는 using 별칭 지시문에 적용할 수 있습니다. 두 경우 모두 지시문의 범위는 현재 컴파일의 모든 파일입니다. 아래 예제에서는 프로젝트에 포함된 모든 파일의 System.Math에서 선언된 모든 메서드를 사용할 수 있도록 설정합니다.
global using static System.Math;
프로젝트 파일에 <Using>
항목을 추가하여 네임스페이스를 전역적으로 포함할 수도 있습니다(예: <Using Include="My.Awesome.Namespace" />
). 자세한 내용은 <Using>
항목을 참조하세요.
다른 위치에서 지시문을 사용하여 복제 global
하는 경우 분석기가 진단을 실행합니다. 이러한 동일한 분석기는 네임스페이스에 대한 지시문을 추가하거나 using 지시문이 이미 참조하는 global
형식을 추가하는 using
경우에도 알려줍니다. 프로젝트의 한 파일에 함께 보관하여 사용을 보다 쉽게 관리할 global
수 있습니다.
Important
.NET 6 용 C# 템플릿은 ‘최상위 문’을 사용합니다. .NET 6으로 이미 업그레이드한 경우 애플리케이션이 이 문서의 코드와 일치하지 않을 수 있습니다. 자세한 내용은 최상위 문을 생성하는 새 C# 템플릿을 참조하세요.
.NET 6 SDK는 또한 다음 SDK를 사용하는 프로젝트에 대해 ‘암시적’ global using
지시문 집합을 추가합니다.
- Microsoft.NET.Sdk
- Microsoft.NET.Sdk.Web
- Microsoft.NET.Sdk.Worker
이러한 암시적 global using
지시문에는 해당 프로젝트 형식의 가장 일반적인 네임스페이스가 포함됩니다.
자세한 내용은 암시적 using 지시문에 대한 문서를 참조하세요.
한 static
정자
using static
지시문은 형식 이름을 지정하지 않고 정적 멤버 및 중첩 형식에 액세스할 수 있는 형식의 이름을 지정합니다. 사용되는 구문은 다음과 같습니다.
using static <fully-qualified-type-name>;
<fully-qualified-type-name>
은 형식 이름을 지정하지 않고 정적 멤버 및 중첩 형식을 참조할 수 있는 형식의 이름입니다. 정규화된 형식 이름(전체 네임스페이스와 형식 이름)을 제공하지 않으면 C#은 컴파일러 오류 CS0246 “형식 또는 네임스페이스 이름 'type/namespace'를 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 누락되었는지 확인하세요.”를 생성합니다.
using static
지시문은 정적 멤버(또는 중첩 형식)가 있는 모든 형식에 적용됩니다(인스턴스 멤버가 있는 경우에도). 그러나 인스턴스 멤버는 형식 인스턴스를 통해서만 호출할 수 있습니다.
형식 이름을 사용하여 액세스를 한정할 필요 없이 형식의 정적 멤버에 액세스할 수 있습니다.
using static System.Console;
using static System.Math;
class Program
{
static void Main()
{
WriteLine(Sqrt(3*3 + 4*4));
}
}
일반적으로 정적 멤버를 호출할 때 멤버 이름과 함께 형식 이름을 제공합니다. 형식의 멤버를 호출하기 위해 동일한 형식 이름을 반복해서 입력하면 코드가 복잡하고 난해해질 수 있습니다. 예를 들어, Circle
클래스에 대한 다음 정의에서는 Math 클래스의 여러 멤버를 참조합니다.
using System;
public class Circle
{
public Circle(double radius)
{
Radius = radius;
}
public double Radius { get; set; }
public double Diameter
{
get { return 2 * Radius; }
}
public double Circumference
{
get { return 2 * Radius * Math.PI; }
}
public double Area
{
get { return Math.PI * Math.Pow(Radius, 2); }
}
}
멤버를 참조할 때마다 Math 클래스를 명시적으로 참조할 필요가 없으므로 using static
지시문은 보다 깔끔한 코드를 생성합니다.
using System;
using static System.Math;
public class Circle
{
public Circle(double radius)
{
Radius = radius;
}
public double Radius { get; set; }
public double Diameter
{
get { return 2 * Radius; }
}
public double Circumference
{
get { return 2 * Radius * PI; }
}
public double Area
{
get { return PI * Pow(Radius, 2); }
}
}
using static
은 액세스 가능한 정적 멤버와 지정된 형식에 선언된 중첩된 형식만 가져옵니다. 상속된 멤버는 가져오지 않습니다. Visual Basic 모듈을 포함하여 using static
지시문이 있는 모든 명명된 형식에서 가져올 수 있습니다. F# 최상위 함수가 메타데이터에서 이름이 유효한 C# 식별자인 명명된 형식의 정적 멤버로 나타나면 F# 함수를 가져올 수 있습니다.
using static
을 사용하면 지정된 형식에 선언된 확장 메서드를 확장 메서드 조회에 사용할 수 있습니다. 그러나 확장 메서드의 이름은 코드의 정규화되지 않은 참조에 대한 범위로 가져오지 않습니다.
같은 컴파일 단위 또는 네임스페이스에서 여러 using static
지시문을 통해 다양한 형식에서 가져온 같은 이름을 사용하는 메서드는 메서드 그룹을 구성합니다. 이들 메서드 그룹 내에서 오버로드 확인은 일반 C# 규칙을 따릅니다.
다음 예제에서는 형식 이름을 지정할 필요 없이 using static
지시문을 사용하여 Console, Math 및 String 클래스의 정적 멤버를 사용 가능하게 합니다.
using System;
using static System.Console;
using static System.Math;
using static System.String;
class Program
{
static void Main()
{
Write("Enter a circle's radius: ");
var input = ReadLine();
if (!IsNullOrEmpty(input) && double.TryParse(input, out var radius)) {
var c = new Circle(radius);
string s = "\nInformation about the circle:\n";
s = s + Format(" Radius: {0:N2}\n", c.Radius);
s = s + Format(" Diameter: {0:N2}\n", c.Diameter);
s = s + Format(" Circumference: {0:N2}\n", c.Circumference);
s = s + Format(" Area: {0:N2}\n", c.Area);
WriteLine(s);
}
else {
WriteLine("Invalid input...");
}
}
}
public class Circle
{
public Circle(double radius)
{
Radius = radius;
}
public double Radius { get; set; }
public double Diameter
{
get { return 2 * Radius; }
}
public double Circumference
{
get { return 2 * Radius * PI; }
}
public double Area
{
get { return PI * Pow(Radius, 2); }
}
}
// The example displays the following output:
// Enter a circle's radius: 12.45
//
// Information about the circle:
// Radius: 12.45
// Diameter: 24.90
// Circumference: 78.23
// Area: 486.95
이 예제 using static
에서는 지시문을 형식에 Double 적용할 수도 있습니다. 해당 지시문을 추가하면 형식 이름을 지정하지 않고 TryParse(String, Double) 멤버를 호출할 수 있습니다. 그러나 형식 이름 없이 TryParse
를 사용하면 어떤 숫자 형식의 TryParse
메서드가 호출되었는지 알아보기 위해 using static
지시문을 확인해야 하기 때문에 코드의 가독성이 떨어집니다.
using static
은 enum
형식에도 적용됩니다. 열거형을 사용하여 using static
을 추가하면 열거형 멤버를 사용하는 데 더 이상 형식이 필요하지 않습니다.
using static Color;
enum Color
{
Red,
Green,
Blue
}
class Program
{
public static void Main()
{
Color color = Green;
}
}
using
별칭
using
별칭 지시문을 만들면 네임스페이스 또는 형식에 대한 식별자를 더 쉽게 한정할 수 있습니다. 모든 using
지시문에서, 앞에 오는 using
지시문과 관계없이 정규화된 네임스페이스 또는 형식을 사용해야 합니다. using
별칭은 using
지시문 선언에 사용할 수 없습니다. 예를 들어, 다음 예제는 컴파일러 오류를 생성합니다.
using s = System.Text;
using s.RegularExpressions; // Generates a compiler error.
다음 예제에서는 using
네임스페이스에 대한 별칭을 정의 및 사용하는 방법을 보여 줍니다.
namespace PC
{
// Define an alias for the nested namespace.
using Project = PC.MyCompany.Project;
class A
{
void M()
{
// Use the alias
var mc = new Project.MyClass();
}
}
namespace MyCompany
{
namespace Project
{
public class MyClass { }
}
}
}
using 별칭 지시문은 오른쪽에 개방형 제네릭 형식을 가질 수 없습니다. 예를 들어, List<T>
에 대해서는 using 별칭을 만들 수 없지만 List<int>
에 대해서는 만들 수 있습니다.
다음 예제에서는 클래스에 대한 using
지시문 및 using
별칭을 정의하는 방법을 보여 줍니다.
using System;
// Using alias directive for a class.
using AliasToMyClass = NameSpace1.MyClass;
// Using alias directive for a generic class.
using UsingAlias = NameSpace2.MyClass<int>;
namespace NameSpace1
{
public class MyClass
{
public override string ToString()
{
return "You are in NameSpace1.MyClass.";
}
}
}
namespace NameSpace2
{
class MyClass<T>
{
public override string ToString()
{
return "You are in NameSpace2.MyClass.";
}
}
}
namespace NameSpace3
{
class MainClass
{
static void Main()
{
var instance1 = new AliasToMyClass();
Console.WriteLine(instance1);
var instance2 = new UsingAlias();
Console.WriteLine(instance2);
}
}
}
// Output:
// You are in NameSpace1.MyClass.
// You are in NameSpace2.MyClass.
C# 12부터 튜플 형식, 포인터 형식 및 기타 안전하지 않은 형식을 포함하여 이전에 제한되었던 형식에 대한 별칭을 만들 수 있습니다. 업데이트된 규칙에 대한 자세한 내용은 기능 사양을 참조하세요.
정규화된 별칭 멤버
네임스페이스 별칭 한정 ::
자는 다른 엔터티에서 숨겨질 수 있는 별칭을 사용하여 전역 네임스페이스 또는 기타 네임스페이스에 대한 명시적 액세스를 제공합니다.
global::
토큰 다음에 있는 네임스페이스에 대한 네임스페이스 조회가 ::
전역 네임스페이스를 기준으로 하는지 확인합니다. 그렇지 않은 경우 토큰은 사용 별칭으로 확인되어야 하며 다음 토큰은 ::
해당 별칭이 지정된 네임스페이스의 형식으로 확인되어야 합니다. 다음 예제에서는 두 가지 형식을 모두 보여줍니다.
using S = System.Net.Sockets;
class A
{
public static int x;
}
class C
{
public void F(int A, object S)
{
// Use global::A.x instead of A.x
global::A.x += A;
// Using ::, S must resolve to a namespace alias:
S::Socket s = S as S::Socket;
// In this form, if S were a class, it would be a compile-time error:
S.Socket s1 = S as S.Socket;
}
}
C# 언어 사양
자세한 내용은 C# 언어 사양의 Using 지시문을 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.
global using 한정자에 대한 자세한 내용은 global using 기능 사양 - C# 10을 참조하세요.
참고 항목
.NET