액세스 한정자(C# 프로그래밍 가이드)

업데이트: 2007년 11월

모든 형식 및 형식 멤버에는 현재 어셈블리나 다른 어셈블리에서 사용할 수 있는지 여부를 제어하는 액세스 수준이 있습니다. 형식이나 멤버를 선언할 때 다음 액세스 한정자 중 하나를 사용하여 액세스 수준을 지정합니다.

  • public
    동일한 어셈블리의 다른 코드나 해당 어셈블리를 참조하는 다른 어셈블리의 코드에서 형식이나 멤버에 액세스할 수 있습니다.

  • 전용
    동일한 클래스 또는 구조체의 코드에서만 형식이나 멤버에 액세스할 수 있습니다.

  • protected
    동일한 클래스나 구조체의 코드 또는 파생 클래스의 코드에서만 형식이나 멤버에 액세스할 수 있습니다.

  • internal
    동일한 어셈블리의 코드에서는 형식이나 멤버에 액세스할 수 있지만 다른 어셈블리의 코드에서는 액세스할 수 없습니다.

  • protected internal
    동일한 어셈블리의 코드 또는 다른 어셈블리의 파생 클래스에서 형식이나 멤버에 액세스할 수 있습니다.

다음 예제에서는 형식 및 멤버에 대한 액세스 한정자를 지정하는 방법을 보여 줍니다.

public class Bicycle
{
    public void Pedal() { }
}

모든 컨텍스트의 모든 형식 또는 멤버에서 모든 액세스 한정자를 사용할 수 있는 것은 아닙니다. 일부 경우에는 멤버를 포함하는 형식의 액세스 가능성에 의해 형식 멤버의 액세스 가능성이 제한됩니다. 다음 단원에서는 액세스 가능성에 대해 자세히 설명합니다.

클래스 및 구조체 액세스 가능성

네임스페이스 내부에서 직접 선언되어 다른 클래스나 구조체에 중첩되지 않은 클래스와 구조체는 public 또는 internal일 수 있습니다. 액세스 한정자가 지정되지 않으면 internal이 기본적으로 사용됩니다. 중첩된 클래스와 구조체도 private으로 선언할 수 있습니다. private으로 선언된 중첩된 형식은 포함하는 형식에서 액세스할 수 없습니다.

파생 클래스의 액세스 가능성이 해당 기본 형식보다 좋을 수 없습니다. 예를 들어 내부 클래스 A에서 공용 클래스 B를 파생시킬 수 없습니다. 이러한 선언이 허용되면 파생 클래스에서 A의 모든 protected 또는 internal 멤버에 액세스할 수 있으므로 A를 public으로 만드는 것이나 마찬가지입니다.

InternalsVisibleToAttribute를 사용하면 다른 특정 어셈블리에서 internal 형식에 액세스하도록 허용할 수 있습니다. 자세한 내용은 Friend 어셈블리(C# 프로그래밍 가이드)를 참조하십시오.

클래스 및 구조체 멤버 액세스 가능성

다섯 가지 액세스 형식 중 하나로 클래스 멤버(중첩된 클래스와 구조체 포함)를 선언할 수 있습니다. 구조체는 상속을 지원하지 않으므로 구조체 멤버는 protected로 선언할 수 없습니다.

멤버의 액세스 가능성이 멤버를 포함하는 형식의 액세스 가능성보다 좋을 수 없습니다. 예를 들어 internal 형식에 선언된 public 메서드의 액세스 가능성은 internal만 가능합니다.

클래스나 구조체의 멤버가 속성, 필드, 메서드, 이벤트 또는 대리자이며 해당 멤버가 형식이거나 매개 변수 또는 반환 값으로 형식을 갖는 경우 멤버의 액세스 가능성이 형식의 액세스 가능성보다 좋을 수 없습니다. 예를 들어 public 메서드 M에서 클래스 C를 반환하려면 C도 public이어야 합니다. 마찬가지로 형식 A가 private으로 선언된 경우 A의 protected 속성이 존재할 수 없습니다.

사용자 정의 연산자는 항상 public으로 선언되어야 합니다. 자세한 내용은 operator(C# 참조)를 참조하십시오.

소멸자에는 액세스 한정자를 사용할 수 없습니다.

클래스나 구조체 멤버의 액세스 수준을 설정하려면 멤버 선언에 적절한 키워드를 추가합니다. 예를 들면 다음과 같습니다.

// public class:
public class Tricycle
{
    // protected method:
    protected void Pedal() { }

    // private field:
    private int wheels = 3;

    // protected internal property:
    protected internal int Wheels
    {
        get { return wheels; }
    }
}
참고:

protectedinternal 액세스 가능성은 protected AND internal이 아니라 protected OR internal을 나타냅니다. 즉, protectedinternal 멤버에는 파생 클래스를 포함하여 동일한 어셈블리의 모든 클래스에서 액세스할 수 있습니다. 동일한 어셈블리의 파생 클래스에서만 액세스할 수 있도록 제한하려면 클래스 자체를 internal로 선언하고 클래스의 멤버를 protected로 선언합니다.

기타 형식

네임스페이스를 사용하여 직접 선언된 인터페이스는 public 또는 internal로 선언할 수 있으며, 클래스 및 구조체와 마찬가지로 인터페이스는 기본적으로 internal 액세스입니다. 인터페이스의 용도는 다른 형식이 클래스 또는 구조체에 액세스할 수 있게 하는 것이므로 인터페이스 멤버는 항상 public입니다. 인터페이스 멤버에는 액세스 한정자를 적용할 수 없습니다.

열거형 멤버는 항상 public이고 액세스 한정자를 적용할 수 없습니다.

대리자의 액세스 수준은 기본적으로 internal입니다.

C# 언어 사양

자세한 내용은 C# 언어 사양에서 다음 단원을 참조하십시오.

  • 3.5 멤버 액세스

  • 10.3.5 액세스 한정자

참고 항목

개념

C# 프로그래밍 가이드

참조

클래스 및 구조체(C# 프로그래밍 가이드)

인터페이스(C# 프로그래밍 가이드)

private(C# 참조)

public(C# 참조)

internal(C# 참조)

protected(C# 참조)

class(C# 참조)

struct(C# 참조)

interface(C# 참조)