Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 인터페이스 멤버에 액세스 한정자를 지정할 수 없는 이유는 무엇일까?

C# 인터페이스와 액세스 한정자의 관계

인터페이스의 메서드는 외부 세계와 맺는 일종의 계약(contract)입니다. 즉, 해당 인터페이스를 구현하는 클래스가 반드시 특정 기능들을 수행하겠다고 약속하는 것이죠.

그렇기 때문에 인터페이스 멤버는 항상 public으로 취급됩니다. 인터페이스의 존재 목적 자체가 다른 형식(타입)들이 클래스나 구조체에 접근할 수 있도록 통로를 열어주는 데 있기 때문입니다.

다만 인터페이스 자체에는 protected, internal 같은 액세스 한정자를 붙일 수 있습니다. 이 경우 '외부 세계 전체'가 아닌 '외부 세계의 일부'로만 접근 범위를 제한하게 됩니다.

기본 예제

interface IInterface{
    void Save();
}
class Program{
    static void Main(){
        Console.ReadLine();
    }
}

위 예제는 아무 오류 없이 정상적으로 컴파일됩니다. 인터페이스 멤버에 별도의 한정자를 명시하지 않아도 자동으로 public처럼 동작하기 때문입니다.

C# 8.0 이전과 이후의 차이

C# 8.0 이전에는 인터페이스 멤버가 기본적으로 public이었으며, 멤버에 public을 포함한 어떠한 액세스 한정자라도 명시적으로 붙이면 컴파일 오류가 발생했습니다.

interface IInterface{
    public void Save(); // C# 7.0에서는 컴파일 오류
}
class Program{
    static void Main(){
        Console.ReadLine();
    }
}

위 코드는 C# 7.0에서는 컴파일 타임 오류를 발생시키지만, C# 8.0부터는 기본 인터페이스 구현(Default Interface Implementation) 기능이 도입되면서 오류 없이 정상적으로 컴파일됩니다.

정리

  • 인터페이스 멤버는 본질적으로 외부 노출을 위한 것이므로 항상 public으로 간주됩니다.
  • C# 8.0 미만에서는 멤버에 한정자를 붙이면 컴파일 오류가 발생합니다.
  • C# 8.0부터는 기본 구현과 함께 멤버 수준의 액세스 한정자 사용이 허용됩니다.