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

C# 액세스 한정자(Access Modifier)의 6가지 종류와 사용법 총정리

액세스 한정자(Access Modifier)는 클래스 멤버나 클래스 자체에 접근할 수 있는 범위를 지정하는 데 사용되는 키워드입니다. C#에서는 총 여섯 가지의 액세스 한정자를 제공하며, 각각의 접근 가능 범위가 다릅니다.

  • public
  • private
  • protected
  • internal
  • protected internal
  • private protected

1. public 한정자

public으로 선언된 멤버는 프로젝트 내 어디에서든 제한 없이 접근할 수 있습니다. 가장 개방적인 접근 수준입니다.

예제

using System;
namespace MyApplication{
    public class Program{
        public static void Main(){
            Person person = new Person();
            Console.WriteLine(person.Name);
            // Name이 public이므로 외부에서 접근 가능
        }
    }
    public class Person{
        public string Name = "Mark";
    }
}

2. private 한정자

private으로 선언된 멤버는 동일한 클래스나 구조체 내부에서만 접근할 수 있습니다. 따라서 해당 멤버가 선언된 클래스 외부에서는 접근할 수 없습니다.

예제

using System;
namespace MyApplication{
    public class Program{
        public static void Main(){
            Person person = new Person();
            Console.WriteLine(person.Name);
            // Name이 private이므로 Program 클래스에서 접근 불가
            // 오류: 'Person.Name'은(는) 보호 수준 때문에 액세스할 수 없습니다.
        }
    }
    public class Person{
        private string Name = "Mark";
    }
}

3. protected 한정자

protected로 선언된 멤버는 해당 클래스 내부와 그 클래스를 상속받은 모든 파생 클래스 내부에서 접근할 수 있습니다.

예제

using System;
namespace MyApplication{
    public class Program{
        public static void Main(){
            Employee employee = new Employee();
            employee.Print(); // 출력: Mark
            Person person = new Person();
            Console.WriteLine(person.Name);
            // 오류: 'Person.Name'은(는) 보호 수준 때문에 액세스할 수 없습니다.
        }
    }
    public class Person{
        protected string Name = "Mark";
    }
    public class Employee : Person{
        public void Print(){
            Console.WriteLine(Name); // 상속받은 클래스에서는 접근 가능
        }
    }
}

4. internal 한정자

internal로 선언된 멤버는 현재 프로젝트(어셈블리) 내부에 정의된 클래스에서만 접근할 수 있습니다. 같은 어셈블리 안이라면 자유롭게 사용할 수 있지만, 다른 어셈블리에서는 접근이 차단됩니다.

예제

프로젝트 1

using System;
namespace MyApplication{
    public class Program{
        public static void Main(){
            Person person = new Person();
            Console.WriteLine(person.Name); // 출력: Mark
        }
    }
    public class Person{
        internal string Name = "Mark";
    }
}

출력 결과

Mark

프로젝트 2

using MyApplication;
using System;
namespace Project2{
    public class Project2Class{
        public void Print(){
            Person person = new Person();
            Console.WriteLine(person.Name);
            // 오류: 'Person.Name'은(는) 보호 수준 때문에 액세스할 수 없습니다.
        }
    }
}

5. protected internal 한정자

protected internal은 protected와 internal을 결합한 한정자입니다. 동일한 어셈블리 내의 모든 코드에서 접근할 수 있으며, 다른 어셈블리에 있더라도 해당 클래스를 상속받은 파생 클래스라면 접근이 가능합니다.

예제

프로젝트 1

using System;
namespace MyApplication{
    public class Program{
        public static void Main(){
            Person person = new Person();
            Console.WriteLine(person.Name); // 출력: Mark
        }
    }
    public class Person{
        protected internal string Name = "Mark";
    }
}

출력 결과

Mark

프로젝트 2

using MyApplication;
using System;
namespace Project2{
    public class Project2Class : Person{
        public void Print(){
            Console.WriteLine(Name); // 출력: Mark (상속 관계이므로 접근 가능)
        }
    }
}

6. private protected 한정자

private protected는 private과 protected 키워드를 결합한 한정자로, 가장 제한적인 접근 수준을 제공합니다. 포함하는 클래스 내부 또는 해당 클래스를 상속받은 파생 클래스에서만 접근할 수 있으며, 반드시 동일한 어셈블리(프로젝트) 안에 있어야 합니다. 따라서 다른 어셈블리에서 접근하려고 하면 오류가 발생합니다. 이 한정자는 C# 7.2 이상 버전부터 사용할 수 있습니다.