액세스 한정자(Access Modifier)는 C#에서 변수와 함수(메서드)에 대한 접근 범위(scope), 즉 어디서부터 접근할 수 있는지를 지정하는 키워드입니다. 적절한 한정자를 사용하면 클래스 내부 구현을 보호하고, 코드의 안정성과 유지보수성을 높일 수 있습니다.
C#에서 제공하는 액세스 한정자 종류
1. public
public 한정자는 멤버 접근에 아무런 제한을 두지 않습니다. 동일 어셈블리뿐 아니라 외부 어셈블리의 모든 코드에서 자유롭게 접근할 수 있습니다.
2. protected
protected 한정자는 해당 클래스 자신과 이를 상속받은 파생 클래스 내부에서만 접근할 수 있습니다.
3. internal
internal 한정자는 멤버가 선언된 동일한 프로그램(어셈블리) 내부에서만 접근이 허용됩니다. 외부 프로젝트에서는 접근할 수 없습니다.
4. protected internal
protected internal은 protected와 internal 두 한정자의 특성을 모두 결합한 것으로, 같은 어셈블리 내의 모든 코드와 다른 어셈블리의 파생 클래스에서도 접근할 수 있습니다.
5. private
private 한정자는 선언된 클래스 내부에서만 접근이 제한됩니다. private으로 지정된 멤버는 클래스 외부에서는 전혀 접근할 수 없으며, 정보 은닉(information hiding)의 기본 수단으로 활용됩니다.
액세스 한정자 비교 요약
| 한정자 | 같은 클래스 | 파생 클래스 | 같은 어셈블리 | 외부 어셈블리 |
|---|---|---|---|---|
| public | O | O | O | O |
| protected | O | O | X | X |
| internal | O | O | O | X |
| protected internal | O | O | O | X* |
| private | O | X | X | X |
* 단, 외부 어셈블리라도 해당 클래스를 상속한 파생 클래스에서는 접근 가능합니다.
예제: protected 한정자로 멤버 접근하기
다음은 protected 액세스 한정자를 사용하여 부모 클래스의 protected 멤버를 파생 클래스에서 접근하는 예제입니다.
using System;
namespace MySpecifiers {
class Demo {
protected string name = "Website";
protected void Display(string str) {
Console.WriteLine("Tabs: " + str);
}
}
class Test : Demo {
static void Main(string[] args) {
Test t = new Test();
Console.WriteLine("Details: " + t.name);
t.Display("Product");
t.Display("Services");
t.Display("Tools");
t.Display("Plugins");
}
}
}
실행 결과
Details: Website Tabs: Product Tabs: Services Tabs: Tools Tabs: Plugins
위 예제에서 Test 클래스는 Demo 클래스를 상속했기 때문에, protected로 선언된 name 필드와 Display() 메서드에 문제없이 접근할 수 있습니다. 만약 두 클래스가 상속 관계가 아니었다면 컴파일 오류가 발생합니다.