Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# internal과 private 접근 한정자의 차이점 완벽 정리

C#에서는 클래스 멤버(변수, 메서드 등)에 대한 접근 범위를 제어하기 위해 다양한 접근 한정자(Access Modifier)를 제공합니다. 그중 internalprivate은 가장 자주 사용되면서도 초보자에게 혼란을 주는 키워드입니다. 이 글에서는 두 한정자의 차이점을 예제 코드와 함께 명확하게 살펴보겠습니다.

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();
        }
    }
}

위 예제에서 lengthwidthinternal로 선언되었기 때문에, 동일한 어셈블리에 속한 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();
        }
    }
}

이 예제에서 lengthwidthprivate으로 선언되었으므로, Main 메서드에서 r.length = 10;처럼 직접 접근하면 컴파일 오류가 발생합니다. 대신 Acceptdetails()라는 public 메서드를 통해 간접적으로 값을 설정해야 합니다.

internal vs private 핵심 차이점 비교

구분internalprivate
접근 범위동일 어셈블리(프로젝트) 전체선언된 클래스 내부만
외부 클래스 접근같은 어셈블리라면 가능불가능
다른 어셈블리 접근불가능불가능
주요 용도프로젝트 내부 모듈 간 협업데이터 은닉 및 캡슐화
기본 접근 수준클래스 멤버의 기본값 아님클래스 멤버의 기본값

정리

internal어셈블리 단위의 공개 범위를, private클래스 단위의 공개 범위를 의미합니다. 같은 프로젝트 내 여러 클래스가 데이터를 공유해야 한다면 internal을, 특정 클래스의 내부 상태를 외부로부터 보호하고 싶다면 private을 사용하는 것이 좋습니다. 참고로 C#에서 클래스 멤버에 접근 한정자를 명시하지 않으면 기본적으로 private으로 지정됩니다.