반응형
internal 키워드는 C#에서 접근 제한자를 나타내며, 같은 어셈블리 내에서만 접근이 허용되는 멤버를 정의할 때 사용됩니다. internal 멤버는 동일한 프로젝트 내의 다른 클래스에서는 접근 가능하지만, 다른 프로젝트에서 이 어셈블리를 참조하는 경우에는 접근할 수 없습니다.
internal의 주요 특징
- 어셈블리 수준 접근 제어
- 같은 프로젝트 내에서는 자유롭게 접근 가능.
- 다른 프로젝트에서는 접근 불가.
- 사용 위치
- 클래스, 메서드, 속성, 필드 등 다양한 멤버에 적용 가능.
- 기본 접근 수준
- 네임스페이스 내에서 선언된 클래스의 기본 접근 수준은 internal입니다(명시하지 않을 경우).
internal 키워드 예제
1. 기본적인 사용
internal 키워드를 사용하여 클래스와 메서드의 접근 수준을 제한하는 예제입니다.
// AssemblyA
namespace MyNamespace
{
internal class InternalClass
{
internal void InternalMethod()
{
Console.WriteLine("InternalMethod 호출");
}
}
public class PublicClass
{
public void CallInternal()
{
InternalClass internalClass = new InternalClass();
internalClass.InternalMethod(); // 같은 어셈블리 내에서 접근 가능
}
}
}
- 같은 프로젝트(어셈블리) 내에서는 InternalClass와 InternalMethod를 자유롭게 사용할 수 있습니다.
- 하지만 이 프로젝트를 참조하는 다른 프로젝트에서는 InternalClass나 InternalMethod를 사용할 수 없습니다.
2. 다른 어셈블리에서 접근 시도
// AssemblyB (AssemblyA를 참조)
using MyNamespace;
class Program
{
static void Main()
{
PublicClass publicClass = new PublicClass();
publicClass.CallInternal(); // PublicClass는 접근 가능
// 아래는 오류 발생
// InternalClass internalClass = new InternalClass();
// internalClass.InternalMethod();
}
}
- PublicClass는 public이므로 접근 가능하지만, InternalClass와 InternalMethod는 internal이므로 접근 불가.
internal의 응용: internal과 protected 조합
protected internal 키워드를 사용하면 같은 어셈블리 내이거나 파생 클래스에서 접근할 수 있습니다.
public class BaseClass
{
protected internal void ProtectedInternalMethod()
{
Console.WriteLine("ProtectedInternalMethod 호출");
}
}
public class DerivedClass : BaseClass
{
public void CallBaseMethod()
{
ProtectedInternalMethod(); // 파생 클래스에서 접근 가능
}
}
class Program
{
static void Main()
{
BaseClass baseClass = new BaseClass();
// 오류 발생: 다른 클래스에서 직접 접근 불가
// baseClass.ProtectedInternalMethod();
}
}
internal을 사용하는 이유
- 캡슐화
- 외부에 노출하지 않고 내부에서만 사용해야 하는 멤버를 숨김.
- 모듈화
- 같은 어셈블리 안에서만 사용할 수 있는 기능을 제공하여 코드 구조를 간결하고 안전하게 유지.
- 보안 및 유지보수
- 외부에서 접근할 수 없으므로 무분별한 사용을 방지하고 유지보수하기 쉽게 만듦.
요약
- internal은 같은 어셈블리 내에서만 접근 가능.
- 다른 어셈블리에서 접근을 막아 캡슐화를 강화.
- protected internal로 파생 클래스에서도 사용할 수 있도록 확장 가능.
이 접근 제한자는 라이브러리 설계나 대규모 애플리케이션에서 특정 멤버를 외부에 노출하지 않으려 할 때 유용합니다.
반응형
'C#' 카테고리의 다른 글
ProcessorAffinity로 CPU 코어 활용 제어하기 (28) | 2025.01.14 |
---|---|
C# 람다식: 간결하고 강력한 익명 함수 이해하기 (0) | 2025.01.13 |
C# LINQ: 데이터 쿼리를 간결하고 강력하게 다루는 방법 (0) | 2025.01.13 |
SocketException: '각 소켓 주소는 하나만 사용할 수 있습니다' 에러 원인 및 해결법 (0) | 2025.01.10 |
C# Struct vs Class: 차이점과 최적 사용 사례 (0) | 2025.01.06 |
재미로 만드는 로또 번호 생성기 #2_로또 API를 이용해서 당첨 번호 조회하기. (2) | 2025.01.05 |
재미로 만드는 로또 번호 생성기 #1_중복 없는 번호 생성 (1) | 2025.01.04 |
C#의 Garbage Collection (GC) 개념 (5) | 2025.01.03 |