C#

[C#]접근 제한자(Access Modifier) - public, private, protected

DevStory 2022. 5. 8.

접근 제한자(Access Modifier)

C#의 접근 제한자(Access Modifier)는 접근 한정자라고 불리기도 하며, 타입(Class 및 Interface)의 범위뿐만 아니라 멤버(변수, 필드 및 메서드)의 접근 범위를 정의하는데 사용되는 기술입니다. 클래스 또는 클래스의 멤버를 접근 가능 여부는 접근 제한자에 의해 정의됩니다.


C#의 5가지 접근 제한자

  1. Private
  2. Public
  3. Protected
  4. Internal
  5. Protected Internal

C#에는 5가지 접근 제한자가 존재합니다. 다음은 5가지 접근 제한자를 설명하기 전에 위에서 말한 타입과 멤버가 무엇인지 설명합니다.

※ Private Protected라는 접근 제한자도 존재하지만, C# 7.2 버전부터 사용할 수 있으므로 이번 포스팅에서 설명하지 않습니다.

타입(Type)과 멤버(Member)

다음 예제에서 Person이라는 클래스는 타입이며, 변수(_name, _age), 프로퍼티(Name, Age) 및 GetPersonInfo() 메서드는 Person 타입의 멤버입니다.

// Person 클래스는 타입(Type)입니다.
public class Person
{
  // _name, _age는 Person 클래스의 필드(Field)입니다.
  private string _name;
  private int _age;
  
  // Name, Age는 Person 클래스의 프로퍼티(Property)입니다.
  public string Name
  {
    get { return _name; }
    set { _name = value; }
  }
  public int Age
  {
    get { return _age; }
    set { _age = value; }
  }

  // GetPersonInf() 메서드는 Person 클래스의 메서드입니다.
  public string GetPersonInfo()
  {
    return "Name: " + this._name + " / Age: " + this._age;
  }
}

따라서 클래스, 구조체, 열거형, 인터페이스, 대리자타입이라고 말하고 타입 내부에 있는 변수, 프로퍼티, 생성자, 메서드 등을 멤버라고 합니다. 멤버는 5가지 접근 제한자를 모두 사용할 수 있지만, 타입은 두 개(internal, public)의 접근 제한자를 사용합니다.


private 및 public 접근 제한자

private 멤버는 타입 내부에서만 사용할 수 있는 반면 public 멤버는 어디에서나 사용할 수 있습니다. 다음 예제의 Person 클래스를 통해 알아봅시다.

namespace ConsoleApp
{
  public class Person
  {
    private string _name;
    private int _age;
    
    // Person 타입 내부에서 private 멤버인 _name을 접근할 수 있습니다.
    public string Name
    {
      get { return _name; }
      set { _name = value; }
    }
    
    // Person 타입 내부에서 private 멤버인 _age를 접근할 수 있습니다.
    public int Age
    {
      get { return _age; }
      set { _age = value; }
    }

    public string GetPersonInfo()
    {
      return "Name: " + this._name + " / Age: " + this._age;
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      // Person 클래스는 public으로 선언되었으므로 객체를 생성할 수 있습니다.
      Person person = new Person();

      // Person 타입의 _age 필드는 private으로 선언되었으므로 접근할 수 없습니다.
      // '보호 수준 때문에 'Person._age'에 액세스할 수 없습니다.
      person._age = 10;

      // Person 타입의 Age 프로퍼티는 public으로 선언되었으므로 접근할 수 있습니다.
      person.Age = 20;
    }
  }
}

Person 클래스의 _age 변수는 private으로 선언되었습니다. 따라서 _age는 Person 클래스 내부에서만 사용할 수 있으며, Person 클래스의 Age 프로퍼티와 GetPersonInf() 메서드는 Person 클래스 내부이므로 _age 변수를 호출하는 것을 볼 수 있습니다.

 

Program 클래스는 Person 클래스의 외부이므로 _age를 접근하면 컴파일 에러가 발생합니다. 반면에 Age라는 프로퍼티는 public으로 선언되었습니다. public 멤버는 어디에서나 사용할 수 있으므로 Person 클래스의 외부인 Program 클래스에서 Age 프로퍼티를 호출할 수 있습니다.


protected 접근 제한자

protected 멤버는 클래스 외부에서는 접근할 수 없고, 타입 내부 또는 자식 클래스에서 접근할 수 있습니다. protected 접근 제한자를 이해하려면 상속이라는 내용을 알고 있어야합니다.

 

다음은 Person 클래스의 _name 변수를 protected로 선언하고 자식 클래스(Employee)에서 부모 클래스(Person)의 _name이라는 변수를 접근하는 예제입니다.

namespace ConsoleApp
{
  public class Person
  {
    // _name이라는 변수를 protected 접근 제한자로 선언합니다.
    protected string _name;
    
    public string Name
    {
      get { return _name; }
      set { _name = value; }
    }

    public string GetPersonInfo()
    {
      return "Name: " + this._name;
    }
  }

  public class Employee : Person
  {
    public Employee()
    {
      // 파생 클래스에서 부모 클래스의 prtoected 멤버 접근 방법 1.
      Employee employee = new Employee();
      employee._name = "Nick";

      // 파생 클래스에서 부모 클래스의 prtoected 멤버 접근 방법 2.
      Console.WriteLine(this._name);

      // 파생 클래스에서 부모 클래스의 prtoected 멤버 접근 방법 3.
      Console.WriteLine(base._name);
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      Person person = new Person();
      // 보호 수준 때문에 'Person._name'에 액세스할 수 없습니다.
      person._name = "Bob";

      Employee employee = new Employee();
      // 보호 수준 때문에 'Person._name'에 액세스할 수 없습니다.
      employee._name = "Tim";
    }
  }
}

자식 클래스(Employee)의 생성자에서 부모 클래스의 protected 멤버를 접근할 수 있습니다.

 

다음은 파생 클래스에서 protected 멤버 접근할 수 있는 세 가지 방법입니다.

▶ 파생 클래스 객체 사용

Employee employee = new Employee();
employee._name = "Nick";

this 키워드 사용

Console.WriteLine(this._name);

 base 키워드 사용

Console.WriteLine(this._name);

정리

  • 접근 제한자는 타입 및 멤버의 접근 범위를 정의하는데 사용되는 기술입니다.
  • 타입의 종류: 클래스, 구조체, 열거형, 인터페이스, 대리자
  • 멤버의 종류: 변수, 프로퍼티, 생성자, 메서드
  • 접근 제한자의 종류: public, private, protected, internal, protected internal
  • private: 타입 내부에서만 접근할 수 있습니다.
  • public: 어디에서나 접근할 수 있습니다.
  • protected: 타입 내부 또는 파생 클래스에서 접근할 수 있습니다.

이번 포스팅은 세 가지 접근 제한자(private, public, protected)에 대해 소개하였습니다. internal과 protected internal 접근 제한자는 설명해야 하는 내용이 많으므로 다음 포스팅에서 설명하겠습니다.

반응형

'C#' 카테고리의 다른 글

[C#]구조체(Struct)  (0) 2022.05.15
[C#]this 키워드  (0) 2022.05.09
[C#]정적 생성자(Static Constructor)  (0) 2022.05.05
[C#]복사 생성자(Copy Constructor)  (0) 2022.05.05
[C#]생성자(Constructor)  (0) 2022.05.05

댓글