액세스 한정자(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 이상 버전부터 사용할 수 있습니다.