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

모든 형식과 형식 멤버에는 액세스 수준이 있습니다. 액세스 수준은 사용 중인 어셈블리나 다른 어셈블리에서 형식 또는 형식 멤버를 사용할 수 있는지 여부를 제어합니다. 어셈블리는 단일 컴파일에서 하나 이상의 .cs 파일을 컴파일하여 만들어진 .dll 또는 .exe입니다. 다음 액세스 한정자를 사용하여 형식 또는 멤버를 선언할 때 해당 항목의 액세스 수준을 지정할 수 있습니다.

  • public: 모든 어셈블리의 코드가 이 형식이나 멤버에 액세스할 수 있습니다. 포함하는 형식의 접근성 수준은 해당 형식의 공용 멤버에 대한 접근성 수준을 제어합니다.
  • private: 동일한 class 또는 struct에 선언된 코드만 이 멤버에 액세스할 수 있습니다.
  • protected: 동일한 class 또는 파생된 class의 코드만 이 형식이나 멤버에 액세스할 수 있습니다.
  • internal: 동일한 어셈블리의 코드만 이 형식이나 멤버에 액세스할 수 있습니다.
  • protected internal: 동일한 어셈블리 또는 다른 어셈블리의 파생 클래스에 있는 코드만 이 형식이나 멤버에 액세스할 수 있습니다.
  • private protected: 동일한 어셈블리 동일한 클래스 또는 파생 클래스의 코드만 형식이나 멤버에 액세스할 수 있습니다.
  • file: 동일한 파일에 있는 코드만 형식이나 멤버에 액세스할 수 있습니다.

형식의 record 한정자는 컴파일러가 추가 멤버를 합성하도록 합니다. record 한정자는 record class 또는 record struct의 기본 접근성에 영향을 주지 않습니다.

요약표

호출자의 위치 public protected internal protected internal private protected private file
파일 내 ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
클래스 내 ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️
파생 클래스(동일한 어셈블리) ✔️ ✔️ ✔️ ✔️ ✔️
비파생 클래스(동일한 어셈블리) ✔️ ✔️ ✔️
파생 클래스(다른 어셈블리) ✔️ ✔️ ✔️
비파생 클래스(다른 어셈블리) ✔️

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

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

모든 액세스 한정자를 모든 컨텍스트에서 모든 형식 또는 멤버에서 사용할 수 있는 것은 아닙니다. 경우에 따라 포함 형식의 접근성이 해당 멤버의 접근성을 제한합니다.

partial 클래스 또는 부분 메서드의 선언 중 하나가 접근성을 선언하지 않은 경우 다른 선언의 접근성을 갖습니다. partial 클래스 또는 메서드에 대한 여러 선언이 서로 다른 접근성을 선언하는 경우 컴파일러는 오류를 생성합니다.

클래스 및 구조체 액세스 수준

네임스페이스 내에서 직접 선언된 클래스 및 구조체(다른 클래스나 구조체 내에 중첩되지 않음)는 public 또는 internal일 수 있습니다. 액세스 한정자가 지정되지 않은 경우 기본값은 internal입니다.

구조체 멤버(중첩 클래스 및 구조체 포함)는 public, internal 또는 private으로 선언할 수 있습니다. 클래스 멤버(중첩 클래스 포함)는 public, protected internal, protected, internal, private protected 또는 private으로 선언할 수 있습니다. 클래스 멤버와 구조체 멤버(중첩 클래스 및 구조체 포함)의 액세스 수준은 기본적으로 private입니다.

파생 클래스는 기본 형식보다 높은 액세스 수준을 가질 수 없습니다. internal 클래스 A에서 파생된 public 클래스 B를 선언할 수 없습니다. 이것이 허용된다면 파생 클래스에서 A의 모든 protected 또는 internal 멤버에 액세스할 수 있게 되므로 결과적으로 A가 public이 되는 것과 같아집니다.

다른 특정 어셈블리에서 internal 형식에 액세스할 수 있도록 하려면 InternalsVisibleToAttribute를 시용하면 됩니다. 자세한 내용은 Friend 어셈블리를 참조하세요.

기타 형식

네임스페이스 내에서 직접 선언된 인터페이스는 public 또는 internal일 수 있고, 클래스 및 구조체와 마찬가지로 인터페이스도 기본적으로 internal 액세스로 설정됩니다. 인터페이스는 다른 형식이 클래스나 구조체에 액세스하는 데 사용되므로 인터페이스 멤버는 기본적으로 public입니다. 인터페이스 멤버 선언에는 액세스 한정자가 포함될 수 있습니다. 인터페이스의 모든 구현자에게 필요한 공통 구현을 제공하려면 interface 멤버에 대한 액세스 한정자를 사용합니다.

네임스페이스에 직접 선언된 delegate 형식에는 기본적으로 internal 액세스 권한이 있습니다.

액세스 한정자에 대한 자세한 내용은 접근성 수준 페이지를 참조하세요.

멤버 접근성

class 또는 struct(중첩 클래스 및 구조체 포함)의 멤버는 6가지 액세스 형식 중 하나로 선언될 수 있습니다. 구조체는 상속을 지원하지 않으므로 구조체 멤버는 protected, protected internal 또는 private protected로 선언할 수 없습니다.

일반적으로 멤버의 액세스 수준은 해당 멤버를 포함하는 형식의 액세스 수준보다 크지 않습니다. 그러나 멤버가 인터페이스 메서드를 구현하거나 public 기본 클래스에 정의된 가상 메서드를 재정의하는 경우에는 어셈블리 외부에서 internal 클래스의 public 멤버에 액세스할 수 있습니다.

멤버의 필드, 속성 또는 이벤트 형식은 멤버 자체의 액세스 수준 이상을 가져야 합니다. 마찬가지로, 메서드, 인덱서 또는 대리자의 반환 형식과 매개 변수 형식은 멤버 자체의 액세스 수준 이상을 가져야 합니다. 예를 들어 Cpublic이 아닌 이상 클래스 C를 반환하는 public 메서드 M이 있을 수 없습니다. 마찬가지로, Aprivate으로 선언되었다면 A 형식의 protected 속성이 있을 수 없습니다.

사용자 정의 연산자는 항상 publicstatic으로 선언해야 합니다. 자세한 내용은 연산자 오버로드를 참조하세요.

class 또는 struct 멤버의 액세스 수준을 설정하려면 다음 예제와 같이 멤버 선언에 해당 키워드를 추가하세요.

// 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; }
    }
}

종료자에는 접근성 한정자를 사용할 수 없습니다. enum 형식의 멤버는 항상 public이며 액세스 한정자를 적용할 수 없습니다.

C# 언어 사양

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

참고 항목