비주얼 스튜디오를 사용하면서 궁금증이 생겼다.
새 스크립트를 생성하면
Program 클래스가 다음과 같이 internal class 로 생성이 된다.
직접 코드를 작성할 때엔 public이나 private로 선언하여 쓰는데
internal class로 그냥 써도 되는건지? 어떤 경우에 쓰이는지 궁금했다.
접근제한자
클래스, 필드, 메서드 등의 접근 가능한 범위를 지정.
지금까지 내가 알던 접근 제한자는 public, private, protected 세가지이다
public은 어디서든 접근 가능
private는 클래스나 구조체 내에서만 접근 가능
protected는 클래스나 구조체 & 상속받은 자식 클래스에서만 접근 가능
그러나 접근제한자에는 internal이라는 제한자도 존재한다고 한다!
Internal Class
- 하나의 어셈블리 단위 내에서만 접근을 허용
- 어셈블리란 프로그램의 기본 단위로 빌드시 생성되는 dll & .exe 파일이라고 생각하면 된다.
(예를 들어, 지난주에 내가 개발한 snakegame 프로젝트와 blackjack 프로젝트는 다른 어셈블리이다)
- Internal의 접근 권한을 가진 멤버는 같은 어셈블리 코드에서만 사용할 수 있다
- 즉 동일한 어셈블리 내에선 public, 다른 어셈블리에선 private로 취급!
(ex)
Project1 어셈블리에 myProject라는 internal class 존재할 때
// Project1 어셈블리
namespace Project1
{
internal class myProject
{
public string age;
}
}
같은 어셈블리 내에서는 myProject internal class에 접근 가능
// Project1 어셈블리
namespace Project1
{
public class IsPossible
{
myProject p1 = new myProject();
}
}
그러나 다른 Project2 어셈블리에서는 Project1 어셈블리에 존재하는 myProject class에 접근할 수 없음
// Project2 어셈블리
namespace Project2
{
internal class myProject2
{
// 다른 어셈블리에 있는 internal 클래스를 불러오므로 에러!
myProject p1 = new myProject();
}
}
표로 정리
public | protected | internal | private | |
파일 내 | ✔️️ | ✔️️ | ✔️️ | ✔️️ |
클래스 내 | ✔️️ | ✔️️ | ✔️️ | ✔️️ |
자식 클래스 (동일한 어셈블리) |
✔️️ | ✔️️ | ✔️️ | ❌ |
비파생 클래스 - 상속 X (동일한 어셈블리) |
✔️️ | ❌ | ✔️️ | ❌ |
자식 클래스 (다른 어셈블리) |
✔️️ | ✔️️ | ❌ | ❌ |
비파생 클래스 - 상속 X (다른 어셈블리) |
✔️️ | ❌ | ❌ | ❌ |
이 표를 보면 하나의 어셈블리 안에서 internal은 public과 같은 역할임을 알 수 있었다.
따라서 내가 그동안 진행한 프로젝트들에 internal class를 사용한 건 아무 문제 없었다!
(다른 어셈블리에서의 접근을 제한해주므로 오히려 더 좋은 접근 제한자였다.)
'Study > C#' 카테고리의 다른 글
[C#] 데이터 저장 (2) | 2024.04.25 |
---|---|
[C#] 인터페이스 (2) | 2024.04.24 |
[C#] 구조체, 클래스, 상속, 제너릭 (0) | 2024.04.23 |
[C#] Random, Collection, 메서드 (0) | 2024.04.22 |