Hamutaro
언어 좀 해라★彡/C#

[C#] 접근 제한자 / internal,protected internal,private protected

요미 ★ 2024. 12. 9.

 

접근제한자?

객체 지향 프로그래밍 언어에서 클래스, 메서드, 속성, 필드 등의 멤버가 어디에서 접근 가능한지

 

 

개발자라면 .. 다 알거라 생각이 듭니다 ㅎ

But, internal,protected internal,private protected 은 생소할거라 생각이 듭니당 (나만 그런건가)

 

일단 대략적인 설명을..

public 모든 곳에서 접근 가능 (동일 어셈블리 및 외부 어셈블리 모두)
private 선언된 클래스 내부에서만 접근 가능
protected 선언된 클래스 및 파생 클래스 내부에서만 접근 가능
internal 같은 어셈블리 내에서만 접근 가능 (외부 어셈블리에서 접근 불가)
protected internal 같은 어셈블리 내 또는 파생 클래스에서 접근 가능
private protected 선언된 클래스 내부, 또는 같은 어셈블리 내의 파생 클래스에서만 접근 가능

 

internal?

internal은 C#의 접근 제한자 중 하나로, 특정 클래스, 메서드, 속성 등이 동일한 어셈블리 내에서만 접근할 수 있도록 제한

여기서 "어셈블리"란 .NET 프로그램의 실행 단위를 의미   (dll & .exe)

  • 일반적으로 하나의 프로젝트가 하나의 어셈블리를 생성합니다.
  • 즉, 같은 프로젝트 내에서는 internal 멤버에 접근할 수 있지만, 다른 프로젝트에서는 접근할 수 없습니당!

접근 제한자사용 가능 범위

 

internal이 유용한 이유

  • 캡슐화와 보안
    • 라이브러리(또는 DLL)를 만들 때 내부 구현을 외부에서 보지 못하게 하고, 외부 사용자가 의도치 않게 내부 구현에 의존하지 않도록 할 수 있습니다.
  • API 설계
    • 외부 개발자에게 노출할 필요가 없는 기능은 internal로 숨길 수 있습니다. 공개 API는 public으로 설정하고 나머지 코드는 internal로 관리하면 API 설계가 더 명확해집니다.
  • 코드 관리
    • 프로젝트 내부에서만 사용해야 하는 유틸리티 클래스나 메서드를 internal로 선언하면, 다른 프로젝트가 이 기능을 잘못 사용하지 못하도록 방지할 수 있습니다.



protected internal?

공개 범위가 넓어도 괜찮은 경우 사용.

파생 클래스 외에도 같은 어셈블리의 다른 클래스들이 접근해야 할 때 유용

 

 

private protected?

제한적 접근이 필요한 경우 사용.

오직 같은 어셈블리파생 클래스만 해당 멤버를 사용할 수 있어야 할 때 적합

 

활용

  • internal:
    • 유틸리티 클래스, 데이터 처리 로직, 툴링 코드 등 외부에서 접근이 불필요한 코드를 숨길 때.
    • 유니티 프로젝트의 Editor 관련 클래스에 적합.
  • private protected:
    • 게임 캐릭터의 상태 관리, 데미지 처리, 이벤트 콜백 등 외부 접근을 막으면서도 상속을 허용할 때.
    • 게임 시스템의 핵심 메서드 보호에 유용.
  • protected internal:
    • 입력 시스템, 네트워크 처리 등 어셈블리 내부에서는 공유하고, 외부에서는 상속 가능하도록 설계할 때.
    • 유니티 플러그인 설계나 모듈화된 시스템에서 적합.
  • 접근 제한자같은 클래스같은 어셈블리같은 어셈블리 파생 클래스다른 어셈블리 파생 클래스다른 어셈블리 일반 클래스 
    접근 제한자 같은 클래스 같은 어셈블리 같은 어셈블리
    파생 클래스
    다른 어셈블리
    파생 클래스
    다른 어셈블리
    일반 클래스
    internal ✔️ ✔️ ✔️
    private protected ✔️ ✔️
    protected interna ✔️ ✔️ ✔️ ✔️