다음을 통해 공유


네임스페이스 및 사용 지시문

팁 (조언)

소프트웨어 개발이 새로운가요? 먼저 시작하기 자습서부터 시작하세요. 첫 번째 프로그램을 작성할 때 네임스페이스 및 using 지시문을 소개합니다.

다른 언어로 경험하신 적 있나요? C#의 네임스페이스는 Java의 패키지 또는 Python의 모듈과 유사하게 작동합니다. 필요한 구문을 앞서 훑어보세요.

네임스페이스 선언 및 using 지시문은 관련 언어 기능입니다. 네임스페이스 선언은 형식을 구성된 구조로 만듭니다. 네임스페이스는 관련 형식을 함께 그룹화하고 명명 충돌을 방지합니다. using 지시문을 사용하면 프로그램에서 해당 형식을 간단한 이름으로 사용할 수 있습니다. 사용할 때마다 전체 네임스페이스 경로를 철자할 필요는 없습니다.

작성한 모든 C# 프로그램에서 네임스페이스를 이미 사용했습니다. 모든 .NET 형식은 네임스페이스에 속하며 파일 맨 위에 있는 모든 using 지시문은 네임스페이스를 참조합니다. 예를 들어 ConsoleMathSystem 네임스페이스에 속하므로 정규화된 전체 이름은 System.ConsoleSystem.Math입니다. 컬렉션 형식은 List<T>Dictionary<TKey, TValue>System.Collections.Generic에 속합니다. 이러한 네임스페이스에 대한 단일 using 지시문을 사용하면 모든 형식을 간단한 이름으로 참조할 수 있습니다. 당신은 사용하는 모든 곳에서 System.Collections.Generic.List<T> 대신 List<T>를 씁니다.

이 문서에서는 네임스페이스 및 using 지시문의 작동 방식에 대한 자세한 배경을 제공하고 .NET 라이브러리에서 이미 발생한 패턴의 예를 보여 줍니다.

네임스페이스에는 형식이 포함됩니다. 모든 .NET 형식은 네임스페이스에 속합니다. 예를 들어, System.Threading.Tasks.Task를 고려하십시오. Task 형식은 System.Threading.Tasks 네임스페이스에 속합니다.

동일한 네임스페이스에서 관련 형식 또는 유사한 형식을 그룹화하면 .NET에서 제공하는 형식을 사용하는 것이 좋습니다. 네임스페이스에는 System.Collections.Generic 컬렉션 관련 형식이 System.IO 포함되며 네임스페이스에는 파일, 디렉터리 및 데이터 읽기 및 쓰기와 관련된 형식이 포함됩니다. 네임스페이스에는 System, MathDateTime와 같은 기본 형식이 Console에 포함됩니다.

다음 예제에서는 네임스페이스가 일반적인 C# 파일의 지시문과 using 함께 작동하는 방법을 보여 줍니다.

using System.Globalization;

namespace MyApp.Services;

class Greeter
{
    public string Greet(string name)
    {
        var culture = CultureInfo.CurrentCulture;
        return $"Hello, {name}! Culture: {culture.Name}";
    }
}

앞의 샘플에서 using 지시문은 System.Globalization.CultureInfo의 전체 이름을 지정하지 않고 CultureInfo라는 이름으로 System.Globalization.CultureInfo을(를) 사용할 수 있음을 의미합니다. 지시문은 namespace 클래스가 Greeter 네임스페이스의 MyApp.Services 일부임을 선언합니다. 정규화된 이름은 MyApp.Services.Greeter입니다.

네임스페이스 선언

네임스페이스 선언은 명명된 그룹에 형식을 할당합니다. 작성하는 모든 형식은 네임스페이스에 속해야 합니다. 네임스페이스 이름은 일반적으로 프로젝트의 폴더 구조를 미러링합니다. 예를 들어, Services/Payments 폴더 내의 형식은 종종 MyApp.Services.Payments 네임스페이스에 속합니다.

네임스페이스는 연산자를 . 사용하여 다음과 같은 System.Collections.Generic계층 구조를 표현합니다. 네임스페이스 이름은 유효한 C# 식별자 이름이어야 합니다.

파일 범위의 네임스페이스

파일의 모든 형식이 동일한 네임스페이스에 속하는 경우 파일 범위 구문을 사용합니다. 네임스페이스 선언 다음에 세미콜론을 추가하면 전체 파일에 적용됩니다. 추가 중괄호 또는 들여쓰기가 필요하지 않습니다.

namespace MyApp.Models;

class Customer
{
    public required string Name { get; init; }
    public string? Email { get; init; }

    public override string ToString() => $"{Name} ({Email ?? "no email"})";
}

파일 범위 네임스페이스는 중첩을 줄이고 파일을 더 쉽게 읽을 수 있도록 합니다. 파일당 하나의 파일 범위 네임스페이스 선언만 가질 수 있습니다.

팁 (조언)

새 코드에서 파일 범위 네임스페이스를 사용합니다. 대부분의 .NET 템플릿 및 코드 분석기는 이 스타일을 권장합니다.

블록 스코프 네임스페이스

동일한 파일에서 둘 이상의 네임스페이스를 선언해야 하는 경우 블록 범위 구문을 사용합니다. 이 스타일은 들여쓰기의 추가 수준을 추가합니다.

중요합니다

동일한 파일에서 둘 이상의 네임스페이스를 선언하는 것은 잘못된 사례로 간주됩니다. 더 일반적인 시나리오는 파일 범위 네임스페이스를 사용하는 것입니다.

다음 코드 조각은 블록 범위 네임스페이스의 예입니다.

namespace MyApp.Models
{
    class Product
    {
        public required string Name { get; init; }
        public decimal Price { get; init; }

        public override string ToString() => $"{Name}: {Price:C}";
    }
}

사용 지시문

지시문이 using 없으면 모든 형식을 완전히 정규화된 이름, 즉 형식 이름과 전체 네임스페이스 경로로 참조해야 합니다.

static void ShowFullyQualified()
{
    // Without a using directive, use the fully qualified name:
    System.Console.WriteLine("Hello from fully qualified name!");
}

using 파일 맨 위에 있는 지시문은 네임스페이스를 가져오므로 해당 형식을 간단한 이름으로 사용할 수 있습니다.

static void ShowShortName()
{
    // With 'using System;' (or implicit usings enabled), use the short name:
    Console.WriteLine("Hello from short name!");
}

자세한 내용은 지시문을 참조하세요using.

전역 using 지시문

모든 파일에 동일한 using 지시문을 작성하는 경우 전역 using 지시문을 사용하면 전체 프로젝트에 대해 한 번 선언할 수 있습니다. 임의의 파일에 배치하세요. 많은 팀에서 전용 GlobalUsings.cs 파일을 만듭니다.

global using System.Text;
global using System.Text.Json;

전역 using을 선언한 후 프로젝트의 모든 파일은 추가 using 지시문 없이 간단한 이름을 사용하여 해당 네임스페이스의 형식을 참조할 수 있습니다.

암시적 사용

.NET SDK는 프로젝트의 형식에 기반하여 가장 일반적인 네임스페이스에 대한 using 지시문을 전역적으로 자동 생성합니다. 프로젝트 파일에서 <ImplicitUsings>enable</ImplicitUsings>을 설정하여 암시적 사용을 활성화합니다. 예를 들어 콘솔 앱 프로젝트는 자동으로 , System, System.Collections.GenericSystem.IOSystem.LinqSystem.Threading를 가져옵니다.System.Threading.Tasks 현재 SDK는 dotnet new를 사용하여 새 프로젝트를 만들 때 ImplicitUsings를 활성화합니다.

자세한 내용은 암시적 using 지시문을 참조하세요.

정적 using 지시문

static using 지시문은 형식 이름 접두사 없이 호출할 수 있도록 형식의 정적 멤버를 가져옵니다.

using static System.Math;

namespace MyApp.Utilities;

class CircleCalculator
{
    public static double CalculateArea(double radius) => PI * Pow(radius, 2);

    public static double CalculateCircumference(double radius) => 2 * PI * radius;
}

정적 사용은 자주 호출하는 것과 같은 MathConsole 유틸리티 클래스에 적합합니다.

형식 및 네임스페이스 별칭

using 별칭은 형식 또는 네임스페이스에 대한 약식 이름을 만듭니다. 별칭은 긴 제네릭 형식 처리, 명명 충돌 해결 및 가독성 개선을 위해 유용합니다.

using CustomerList = System.Collections.Generic.List<MyApp.Models.Customer>;

namespace MyApp.Services;

class CustomerService
{
    public CustomerList GetTopCustomers()
    {
        CustomerList customers = [new() { Name = "Alice" }, new() { Name = "Bob" }];
        return customers;
    }
}

C# 12부터 튜플 및 포인터 형식을 비롯한 모든 형식의 별칭을 지정할 수 있습니다.

using Point = (double X, double Y);

namespace MyApp.Geometry;

class Shape
{
    public static double Distance(Point a, Point b)
    {
        var dx = a.X - b.X;
        var dy = a.Y - b.Y;
        return Math.Sqrt(dx * dx + dy * dy);
    }
}

두 어셈블리가 동일한 정규화된 형식 이름을 정의하는 고급 시나리오의 경우 extern 별칭을 사용하여 두 어셈블리 간에 명확하게 구분합니다.