internal

internal (C# 참조)

internal 키워드는 형식과 형식 멤버에 쓰는 액세스 한정자예요. 여기서는 internal 액세스만 다룰게요. 이 키워드는 protected internal 액세스 한정자의 일부로도 쓰여요.

출처: internal (C# reference)

본문

internal로 선언한 형식이나 멤버는 같은 어셈블리 안에 있는 파일에서만 접근할 수 있어요. 아래 예시처럼 말이죠.

public class BaseClass
{
    // Only accessible within the same assembly.
    internal static int x = 0;
}

주석에도 적혀 있듯이, internal 멤버는 같은 어셈블리 안에서만 접근할 수 있어요. internal과 다른 액세스 한정자의 차이가 궁금하다면 Accessibility LevelsAccess Modifiers를 참고하세요.

여기서 잠깐, 어셈블리가 뭔지 짚고 갈게요. 어셈블리는 소스 파일 하나 이상을 컴파일해서 만들어낸 실행 파일 또는 DLL(동적 연결 라이브러리) 이에요. 어셈블리에 대한 자세한 내용은 Assemblies in .NET을 보세요.

internal 액세스는 특히 컴포넌트 기반 개발에서 자주 쓰여요. 컴포넌트 그룹이 애플리케이션의 나머지 코드에 노출되지 않는 방식으로 서로 협력할 수 있게 해주거든요. 예를 들어 GUI를 만드는 프레임워크가 Control 클래스와 Form 클래스를 제공한다고 해볼게요. 이 두 클래스는 internal 액세스 멤버로 협력할 수 있어요. 이 멤버들이 internal이라서, 프레임워크를 쓰는 코드에는 노출되지 않아요.

반대로 internal 액세스인 형식이나 멤버를 정의한 어셈블리 밖에서 참조하면 오류가 나요. 기억해 두세요.

예제

이 예시에는 Assembly1.csAssembly1_a.cs 두 파일이 있어요. 첫 번째 파일에는 internal 기본 클래스인 BaseClass가 들어 있어요. 두 번째 파일에서 BaseClass를 인스턴스화하려고 시도하면 오류가 발생해요.

// Assembly1.cs
// Compile with: /target:library
internal class BaseClass
{
   public static int intM = 0;
}
// Assembly1_a.cs
// Compile with: /reference:Assembly1.dll
class TestAccess
{
   static void Main()
   {
      var myBase = new BaseClass();   // CS0122
   }
}

new BaseClass()에서 CS0122 오류가 나는 게 보이죠? BaseClass가 internal이라 다른 어셈블리에서 인스턴스를 만들 수 없어요.

이번에는 아까 쓴 파일들을 그대로 쓰되, BaseClass의 액세스 수준을 public으로 바꿔볼게요. 그리고 멤버 intM의 액세스 수준은 internal로 바꿔요. 이 경우 클래스는 인스턴스화할 수 있지만, internal 멤버에는 접근할 수 없어요.

// Assembly2.cs
// Compile with: /target:library
public class BaseClass
{
   internal static int intM = 0;
}
// Assembly2_a.cs
// Compile with: /reference:Assembly2.dll
public class TestAccess
{
   static void Main()
   {
      var myBase = new BaseClass();   // Ok.
      BaseClass.intM = 444;    // CS0117
   }
}

이번에는 new BaseClass()는 문제없이 동작해요. 하지만 intM이 internal이라 BaseClass.intM = 444에서 CS0117 오류가 나요.

C# 언어 사양

더 자세한 내용은 C# Language SpecificationDeclared accessibility를 참고하세요. 언어 사양은 C# 구문과 사용법의 최종 권위 있는 출처예요.

더 알아보기