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 지시문의 범위는 해당 지시문이 나타나는 파일입니다.

using 지시문이 나타날 수 있습니다.

  • 소스 파일의 시작 부분, 네임스페이스 또는 형식 선언 앞에 나타날 수 있습니다.
  • 모든 네임스페이스에 나타날 수 있지만 global 한정자가 사용되지 않는 한 해당 네임스페이스에 선언된 네임스페이스 또는 형식 앞에 나타날 수 있습니다. 이 경우 지시문은 모든 네임스페이스 및 형식 선언 앞에 나타나야 합니다.

이렇게 하지 않으면 컴파일러 오류 CS1529가 생성됩니다.

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> 항목을 참조하세요.

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, MathString 클래스의 정적 멤버를 사용 가능하게 합니다.

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 staticenum 형식에도 적용됩니다. 열거형을 사용하여 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부터 튜플 형식, 포인터 형식 및 기타 안전하지 않은 형식을 포함하여 이전에 제한되었던 형식에 대한 별칭을 만들 수 있습니다. 업데이트된 규칙에 대한 자세한 내용은 기능 사양을 참조하세요.

Visual Basic My 네임스페이스를 사용하는 방법

Microsoft.VisualBasic.MyServices 네임스페이스(Visual Basic의 My)는 여러 .NET 클래스에 대한 쉽고 직관적인 액세스를 제공하여 컴퓨터, 애플리케이션, 설정, 리소스 등을 조작하는 코드를 작성할 수 있게 해줍니다. 원래 Visual Basic에서 사용하도록 설계되었지만 MyServices 네임스페이스는 C# 애플리케이션에서 사용할 수 있습니다.

Visual Basic에서 MyServices 네임스페이스를 사용하는 방법에 대한 자세한 내용은 My를 사용한 개발을 참조하세요.

프로젝트에서 Microsoft.VisualBasic.dll 어셈블리에 대한 참조를 추가해야 합니다. MyServices 네임스페이스의 모든 클래스를 C# 애플리케이션에서 호출할 수 있는 것은 아닙니다. 예를 들어 FileSystemProxy 클래스는 호환되지 않습니다. 이 특정한 경우에는 FileSystem의 일부이고 VisualBasic.dll에도 포함된 정적 메서드를 대신 사용할 수 있습니다. 예를 들어 이러한 메서드 중 하나를 사용하여 디렉터리를 복제하는 방법은 다음과 같습니다.

// Duplicate a directory
Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(
    @"C:\original_directory",
    @"C:\copy_of_original_directory");

C# 언어 사양

자세한 내용은 C# 언어 사양Using 지시문을 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.

global using 한정자에 대한 자세한 내용은 global using 기능 사양 - C# 10을 참조하세요.

참고 항목