Home Full Site
C# 접근 제한자 (Access Modifier)

접근 제한자는 외부로부터 타입(클래스, 구조체, 인터페이스, 델리게이트 등) 혹은 그 타입 멤버들(메서드, 속성, 이벤트, 필드 등)로의 접근을 제한할 때 사용하는 것으로 다음과 같은 종류가 있다.

접근 제한자 설명
public 모든 외부(파생클래스 포함)에서 이 타입(Type: 클래스, 구조체, 인터페이스, 델리게이트 등)을 엑세스할 수 있다. (개별 타입 멤버의 엑세스 권한은 해당 멤버의 접근 제한자에 따라 별도로 제한될 수 있다)
internal 동일한 Assembly 내에 있는 다른 타입들이 엑세스 할 수 있다. 하지만, 다른 어셈블리에서는 접근이 불가하다.
protected 파생클래스에서 이 클래스 멤버를 엑세스할 수 있다.
private 동일 클래스/구조체 내의 멤버만 접근 가능하다.

접근 제한자는 public class A {} 와 같이 클래스, 구조체와 같은 Type 앞에 사용하거나 메서드, 속성, 필드 등의 클래스/구조체 멤버 앞에 사용하여 (예: protected int GetValue(); ) 접근을 제한하게 된다.

  • 클래스 멤버는 5가지의 접근 제한자를 (public, internal, private, protected, protected internal) 모두 가질 수 있지만, 구조체(struct) 멤버는 상속이 되지 않으므로 3가지의 접근 제한자만 (public, internal, private) 가질 수 있다.
  • 보통 클래스와 구조체는 네임스페이스 바로 밑에 선언하는데,이때 디폴트로 internal 접근 제한을 갖는다. 단, 클래스 내부에 Nested 클래스를 선언하는 것과 같이 Nested Type을 선언하면 디폴트로 private 접근 제한을 갖는다.
  • 인터페이스(interface)와 열거형(enum)의 멤버는 기본적으로 public 이며, 각 멤버에 별도의 접근 제한자를 사용하지 않는다.


접근 제한자 사용

클래스의 필드는 기본적으로 private으로 설정하여 외부로터의 접근을 완전히 제한하는 것이 일반적이다 (객체 지향 프로그래밍의 원칙에 따라). 메서드는 외부에서 호출해야 하는 것은 public으로 하고 내부에서만 사용되는 것은 private으로 설정한다. 메서드는 이외에도 어셈블리 내부에서만 사용 가능한 internal, 파생클래스에서 엑세스할 수 있는 protected 를 사용할 수 있다. 속성은 메서드와 동일한 방식으로 설정한다.

다음은 여러 접근 제한자를 사용한 예제이다.


예제

internal class MyClass
{
   private int _id = 0;

   public string Name { get; set; }

   public void Run(int id) {}

   protected void Execute() { }
}

  • MyClass는 internal 클래스로서 동일 어셈블리 내의 다른 타입만 이 클래스로 접근할 수 있다.
  • _id 는 private 필드로서 클래스 내부에서만 사용 가능하다 .
  • Name은 public 프로퍼티로서 클래스를 엑세스할 수 있는 모든 외부 객체에서 접근 가능하다.
  • Run()은 public 메서드로서 클래스를 엑세스할 수 있는 모든 객체에서 접근 가능하다.
  • Execute()는 protected 메서드로서 해당 MyClass와 이의 파생 클래스에서만 접근 가능하다.



© csharpstudy.com