C#에서는 클래스 멤버(변수, 메서드 등)에 대한 접근 범위를 제어하기 위해 다양한 접근 한정자(Access Modifier)를 제공합니다. 그중 internal과 private은 가장 자주 사용되면서도 초보자에게 혼란을 주는 키워드입니다. 이 글에서는 두 한정자의 차이점을 예제 코드와 함께 명확하게 살펴보겠습니다.
internal 접근 한정자란?
internal 접근 한정자는 멤버 변수와 멤버 함수를 현재 어셈블리(Assembly) 내부의 다른 함수와 객체에 공개할 수 있도록 허용합니다.
즉, 같은 프로젝트(어셈블리) 안에 정의된 어떤 클래스나 메서드라도 해당 멤버에 자유롭게 접근할 수 있습니다. 반면, 어셈블리 외부에서는 접근이 불가능합니다. 주로 하나의 라이브러리나 애플리케이션 내부에서 여러 클래스가 서로 협력해야 할 때 유용합니다.
internal 예제 코드
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());
}
}//end class Rectangle
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.length = 4.5; // 같은 어셈블리 내부이므로 접근 가능
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}
위 예제에서 length와 width는 internal로 선언되었기 때문에, 동일한 어셈블리에 속한 ExecuteRectangle 클래스의 Main 메서드에서 직접 값을 할당할 수 있습니다.
private 접근 한정자란?
private 접근 한정자는 멤버 변수와 멤버 함수를 외부의 다른 함수와 객체로부터 완전히 숨기는 가장 제한적인 접근 수준입니다.
private으로 선언된 멤버는 같은 클래스 내부의 함수만 접근할 수 있습니다. 클래스 외부에서는 어떠한 방법으로도 직접 접근할 수 없으며, 이를 통해 데이터 은닉(Data Hiding)과 캡슐화(Encapsulation)를 실현할 수 있습니다.
private 예제 코드
using System;
namespace RectangleApplication {
class Rectangle {
private double length;
private double width;
// private 멤버에 접근하려면 public 메서드를 통해서만 가능
public void Acceptdetails() {
length = 10;
width = 15;
}
public double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.Acceptdetails(); // public 메서드를 통해 간접적으로 값 설정
r.Display();
Console.ReadLine();
}
}
}
이 예제에서 length와 width는 private으로 선언되었으므로, Main 메서드에서 r.length = 10;처럼 직접 접근하면 컴파일 오류가 발생합니다. 대신 Acceptdetails()라는 public 메서드를 통해 간접적으로 값을 설정해야 합니다.
internal vs private 핵심 차이점 비교
| 구분 | internal | private |
|---|---|---|
| 접근 범위 | 동일 어셈블리(프로젝트) 전체 | 선언된 클래스 내부만 |
| 외부 클래스 접근 | 같은 어셈블리라면 가능 | 불가능 |
| 다른 어셈블리 접근 | 불가능 | 불가능 |
| 주요 용도 | 프로젝트 내부 모듈 간 협업 | 데이터 은닉 및 캡슐화 |
| 기본 접근 수준 | 클래스 멤버의 기본값 아님 | 클래스 멤버의 기본값 |
정리
internal은 어셈블리 단위의 공개 범위를, private은 클래스 단위의 공개 범위를 의미합니다. 같은 프로젝트 내 여러 클래스가 데이터를 공유해야 한다면 internal을, 특정 클래스의 내부 상태를 외부로부터 보호하고 싶다면 private을 사용하는 것이 좋습니다. 참고로 C#에서 클래스 멤버에 접근 한정자를 명시하지 않으면 기본적으로 private으로 지정됩니다.