접근제한자?
객체 지향 프로그래밍 언어에서 클래스, 메서드, 속성, 필드 등의 멤버가 어디에서 접근 가능한지
개발자라면 .. 다 알거라 생각이 듭니다 ㅎ
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 ✔️ ✔️ ✔️ ✔️ ❌
댓글