본문 바로가기
C#

C# internal: 어셈블리 내 접근 제한자

by 공부봇 2025. 1. 10.
반응형

internal 키워드는 C#에서 접근 제한자를 나타내며, 같은 어셈블리 내에서만 접근이 허용되는 멤버를 정의할 때 사용됩니다. internal 멤버는 동일한 프로젝트 내의 다른 클래스에서는 접근 가능하지만, 다른 프로젝트에서 이 어셈블리를 참조하는 경우에는 접근할 수 없습니다.


internal의 주요 특징

  1. 어셈블리 수준 접근 제어
    • 같은 프로젝트 내에서는 자유롭게 접근 가능.
    • 다른 프로젝트에서는 접근 불가.
  2. 사용 위치
    • 클래스, 메서드, 속성, 필드 등 다양한 멤버에 적용 가능.
  3. 기본 접근 수준
    • 네임스페이스 내에서 선언된 클래스의 기본 접근 수준은 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을 사용하는 이유

  1. 캡슐화
    • 외부에 노출하지 않고 내부에서만 사용해야 하는 멤버를 숨김.
  2. 모듈화
    • 같은 어셈블리 안에서만 사용할 수 있는 기능을 제공하여 코드 구조를 간결하고 안전하게 유지.
  3. 보안 및 유지보수
    • 외부에서 접근할 수 없으므로 무분별한 사용을 방지하고 유지보수하기 쉽게 만듦.

요약

  • internal은 같은 어셈블리 내에서만 접근 가능.
  • 다른 어셈블리에서 접근을 막아 캡슐화를 강화.
  • protected internal로 파생 클래스에서도 사용할 수 있도록 확장 가능.

이 접근 제한자는 라이브러리 설계나 대규모 애플리케이션에서 특정 멤버를 외부에 노출하지 않으려 할 때 유용합니다.

반응형