![[C#] 1. 접근 제어자 1 접근 제어자](http://allhoneytip.com/wp-content/uploads/2023/08/제목을-입력해주세요_-001-11-1024x1024-optimized.png)
접근 제어자(제한자)란?
C#에서 접근 제어자는 클래스 내부의 멤버 또는 타입에 대한 외부 접근을 제한하는 데 사용되는 키워드입니다. 다른 코드에서 클래스의 멤버나 타입에 접근할 때, 이러한 접근 제어자를 사용하여 해당 멤버나 타입에 대한 접근 범위를 조절할 수 있습니다.
[기술 면접] 3. 스프링의 @Transactional 어노테이션에 대해서 아시나요?
접근 제어자의 종류
C#에서 다섯 가지 주요 접근 제어자가 있습니다.
![[C#] 1. 접근 제어자 2 접근 제어자](http://allhoneytip.com/wp-content/uploads/2023/08/rnpOQPj-1024x381-optimized.png)
- public: 이 접근 제어자를 사용하면 해당 멤버나 타입은 어디에서든지 접근할 수 있습니다. 클래스 외부에서도 접근 가능합니다.
- private: 이 접근 제어자를 사용하면 해당 멤버는 같은 클래스 내부에서만 접근할 수 있습니다. 클래스 외부에서는 접근할 수 없습니다.
- protected: 이 접근 제어자를 사용하면 해당 멤버는 같은 클래스 내부와 해당 클래스를 상속받은 파생 클래스에서 접근할 수 있습니다. 클래스 외부에서는 접근할 수 없습니다.
- internal: 이 접근 제어자를 사용하면 해당 멤버나 타입은 같은 어셈블리(어셈블리는 컴파일된 코드의 단위입니다) 내에서 접근할 수 있습니다. 다른 어셈블리에서는 접근할 수 없습니다.
- protected internal: 이 접근 제어자를 사용하면 해당 멤버나 타입은 같은 어셈블리 내에서 접근 가능하며, 또한 해당 클래스를 상속받은 파생 클래스에서도 접근할 수 있습니다.
기본 접근 제어자
클래스의 멤버에 적용되는 접근 제어자와 클래스 자체에 적용되는 접근 제어자인 “class default 접근자”는 다소 다른 의미를 가집니다.
- Class Member의 Default 접근 제어자: 클래스 멤버에 별도의 접근 제어자를 지정하지 않으면, 기본적으로
private
접근 제어자가 적용됩니다. 이는 해당 멤버가 클래스 내에서만 접근 가능하고 클래스 외부에서는 접근할 수 없음을 의미합니다. - Class의 Default 접근 제어자: 클래스의 경우 별도의 접근 제어자를 지정하지 않으면, 기본적으로
internal
접근 제어자가 적용됩니다. 이는 해당 클래스가 같은 어셈블리 내에서만 접근 가능하고 다른 어셈블리에서는 접근할 수 없음을 의미합니다.
예시
using System;
// 클래스 정의
class MyClass
{
// 멤버 변수 (private 접근 제어자가 기본)
int privateVar = 10;
// 멤버 메서드 (private 접근 제어자가 기본)
void PrintPrivateVar()
{
Console.WriteLine(privateVar);
}
// 내부에서 접근 가능한 멤버 메서드
internal void InternalMethod()
{
Console.WriteLine("Internal method");
}
// 내부에서 접근 가능하고 파생 클래스에서도 접근 가능한 멤버 메서드
protected internal void ProtectedInternalMethod()
{
Console.WriteLine("Protected Internal method");
}
}
// MyClass를 상속받은 파생 클래스
class DerivedClass : MyClass
{
void AccessBaseClassMembers()
{
// 상속을 받았기 때문에 ProtectedInternalMethod()에 접근 가능
ProtectedInternalMethod();
}
}
// Main 메서드 시작
class Program
{
static void Main()
{
MyClass myObj = new MyClass();
// privateVar는 MyClass 내에서만 접근 가능
// 컴파일 에러: 'MyClass.privateVar'는(은) 접근할 수 없습니다.
//Console.WriteLine(myObj.privateVar);
// PrintPrivateVar 메서드는 MyClass 내에서만 호출 가능
// 컴파일 에러: 'MyClass.PrintPrivateVar()'는(은) 접근할 수 없습니다.
//myObj.PrintPrivateVar();
// InternalMethod은 같은 어셈블리 내에서 접근 가능
myObj.InternalMethod();
// ProtectedInternalMethod은 같은 어셈블리 내에서 접근 가능
myObj.ProtectedInternalMethod();
// DerivedClass의 인스턴스 생성
DerivedClass derivedObj = new DerivedClass();
// 파생 클래스에서 상속받은 ProtectedInternalMethod에 접근
derivedObj.AccessBaseClassMembers();
}
}
마치며
접근 제어자를 올바르게 사용하여 클래스와 멤버의 접근 범위를 관리하면 캡슐화(encapsulation)를 통해 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다.
답글 남기기