C#에서 internal 키워드는 멤버의 접근 범위를 같은 어셈블리(assembly) 내부로 제한하는 내부 접근 한정자(internal access specifier)를 지정할 때 사용합니다.
internal로 선언된 클래스나 멤버는 동일한 어셈블리 안에 있는 다른 클래스와 객체라면 자유롭게 접근할 수 있지만, 어셈블리 외부에서는 접근이 불가능합니다.
internal 접근 한정자의 특징
- 같은 프로젝트(어셈블리) 내에서는 public처럼 자유롭게 접근 가능합니다.
- 다른 어셈블리에서는 해당 멤버에 접근할 수 없으므로 라이브러리의 내부 구현을 숨기는 데 유용합니다.
- 클래스, 필드, 메서드 등 다양한 멤버에 적용할 수 있습니다.
즉, internal이 지정된 멤버는 그 멤버가 정의된 응용 프로그램(어셈블리) 내부에 있는 어떤 클래스나 메서드에서든 접근할 수 있습니다.
예제 코드
아래 예제에서 Rectangle 클래스의 length와 width 필드는 internal로 선언되었습니다. 따라서 같은 어셈블리 안에 있는 Demo 클래스의 Main 메서드에서 직접 값을 할당할 수 있습니다.
using System;
namespace RectangleApplication {
class Rectangle {
internal double length;
internal double width;
double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
class Demo {
static void Main(string[] args) {
Rectangle rc = new Rectangle();
rc.length = 10.35;
rc.width = 8.3;
rc.Display();
Console.ReadLine();
}
}
}실행 결과
Length: 10.35 Width: 8.3 Area: 85.905
internal 키워드를 사용하는 이유
internal은 주로 다음과 같은 상황에서 활용됩니다.
- 캡슐화 강화: 라이브러리나 프레임워크를 배포할 때 외부에 공개할 필요가 없는 내부 구현 세부 사항을 숨길 수 있습니다.
- 안전성 확보: 어셈블리 외부 코드가 내부 로직에 의존하거나 임의로 변경하는 것을 방지하여 유지보수성을 높입니다.
- 협업 개발: 하나의 큰 프로젝트 내에서 여러 모듈이 서로의 기능을 공유하되, 외부에는 필요한 API만 노출하고 싶을 때 적합합니다.
이처럼 internal 키워드는 접근 범위를 어셈블리 단위로 관리함으로써 코드의 보안성과 구조적 완결성을 함께 얻을 수 있게 해주는 중요한 도구입니다.