액세스 가능성 수준

액세스 가능성 수준 (C# 참조)

접근 한정자 public, protected, internal, private를 사용하면 멤버의 선언된 액세스 가능성 수준을 다음 중 하나로 지정할 수 있어요.

  • public: 액세스에 제한이 없어요.
  • protected: 포함하는 클래스 또는 그 클래스에서 파생된 타입으로 액세스가 제한돼요.
  • internal: 현재 어셈블리로 액세스가 제한돼요.
  • protected internal: 현재 어셈블리 또는 포함하는 클래스에서 파생된 타입으로 액세스가 제한돼요.
  • private: 포함하는 타입으로 액세스가 제한돼요.
  • private protected: 현재 어셈블리 내에서 포함하는 클래스 또는 그 클래스에서 파생된 타입으로 액세스가 제한돼요.

C# 11부터 최상위(중첩되지 않은) 타입은 file 한정자를 사용할 수 있어요. file 한정자는 액세스를 같은 소스 파일 안의 코드로 제한하죠. file 한정자는 어떤 액세스 한정자와도 함께 쓸 수 없어요.

멤버나 타입에는 액세스 한정자를 하나만 사용해요. 단, protected internal 또는 private protected 조합은 예외예요.

네임스페이스에는 액세스 한정자를 쓰지 않아요. 네임스페이스에는 액세스 제한이 없거든요.

멤버 선언이 어떤 문맥에서 일어나느냐에 따라 허용되는 선언 액세스 가능성도 정해져요. 멤버 선언에서 액세스 한정자를 지정하지 않으면 기본 액세스 가능성이 적용돼요.

다른 타입에 중첩되지 않은 최상위 타입은 internal 또는 public 액세스 가능성만 가질 수 있어요. 이 타입들의 기본 액세스 가능성은 internal이에요.

다른 타입의 멤버인 중첩 타입은 아래 표에 나온 대로 선언 액세스 가능성을 가질 수 있어요.

멤버 기본 멤버 액세스 가능성 허용되는 선언 액세스 가능성
enum public 없음
class private public

protected

internal

private

protected internal

private protected
interface public public

protected

internal

private*

protected internal

private protected
struct private public

internal

private

* private 액세스 가능성을 가진 interface 멤버는 기본 구현을 가져야 해요.

[!NOTE] 클래스나 구조체를 record 키워드 한정자로 수정할 때는 동일한 액세스 한정자를 사용해요. record 한정자를 쓰면 클래스든 구조체든 기본 멤버 액세스 가능성은 여전히 private이에요.

중첩 타입의 액세스 가능성은 해당 액세스 가능성 도메인에 따라 달라져요. 이 도메인은 멤버의 선언 액세스 가능성과 바로 바깥에서 포함하는 타입의 액세스 가능성 도메인이 결정하죠. 다만 중첩 타입의 액세스 가능성 도메인은 포함하는 타입의 도메인을 넘어설 수 없어요.

더 알아보기

출처: Accessibility levels (C# reference) - Microsoft Learn