접근 지정자 (public, protected, private, extern, internal)

장장·2025년 9월 25일

class에서 접근 지정자에 대해 공부하다가 extern, internal이라는 특이한 지정자가 있어 정리했다.

1. public

어디서나 접근 가능한 지정자

2. protected

자신과 상속받은 자식만 사용할 수 있게하는 지정자

3. private

자신만 사용할 수 있게 하는 지정자

4. extern (C#기준 설명)

C#과 같은 managed code에서 C/C++ 같은 언어로 만들어진 unmaged code의 기능을 사용하는 수단

아래 예시는 user32.dllMessageBeep라는 메서드를 사용한다
(이름 정확해야함)

class Program
{
    [DllImport("user32.dll")]
    static extern int MessageBeep(uint uType);
    static void Main(string[] args)
    {
        MessageBeep(0); //시스템 소리가 난다
    }
}

5. internal (C#기준 설명)

  • 같은 어셈블리 내에서만 사용 가능하게 만드는 키워드
  • 다른 프로젝트가 사용하지 못하게 할 필드,메서드,클래스 등을 지정 가능

테스트 해보는 방법

비주얼스튜디오 안에 프로젝트2개만들고
하나는 라이브러리, 하나는 콘솔 프로젝트로 설정
콘솔 프로젝트에서 라이브러리 클래스를 참조하고, 테스트 진행

예) ConsoleApp1 이라는 클래스 라이브러리와 ConsoleApp2 라는 콘솔 프로젝트

1. ConsoleApp1 프로젝트 속성 → 출력 형식(Output type) → Class Library

ConsoleApp1 코드

using System;
namespace ConsoleApp1
{
    internal class BlockClass
    {
        public int count = 5;
        internal int number = 50;
        static public int staticNumber = 10;
        internal void SayHello()
        {
            Console.WriteLine("Hello");
        }
    }
    public class FreeClass
    {
        public int count = 10;
        public void SayBye()
        {
            Console.WriteLine("Bye");
        }
        internal void BlockHi()
		{
    		Console.WriteLine("접근불가");
		}
    }
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

2. ConsoleApp2에서 DLL 참조 추가 및 사용
프로젝트 참조에 마우스우클릭 - 참조추가- 프로젝트 - 체크후 확인
using ConsoleApp1; 추가 후 사용

코드

using System;
using ConsoleApp1;
namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            FreeClass freeClass = new FreeClass();
            freeClass.SayBye();
            
            //▼보호수준때문에 접근불가라고 뜸
            //BlockClass myClass = new BlockClass(); //에러.
            //freeClass.BlockHi(); //에러. 보호수준
            //int num = freeClass.number; //에러. 보호수준
        }
    }
}

후기

  • extern은 unmanaged DLL (C/C++ 등)에서 작성된 것을 호출 및 사용할때
  • internal은 다른 프로젝트가 참조했을때 사용하지 못하게 할 필드,메서드,클래스 등을 지정 가능하다.

internal 정리할때 다른 어셈블리에서 사용해야 internal이 동작한다는게
무슨 의미인지 몰라서 시간을 많이 소모했다.

프로젝트를 2개로 나누고 위 방법처럼 클래스라이브러리 + 콘솔라이브러리로 설정하니 해결되었다.

0개의 댓글