C# 에서 접근 제한자의 기본값 이해하기
C# 에서는 클래스나 구조체, 필드 등의 접근 제한자를 명시하지 않으면 컴파일러가 기본값을 적용합니다. 이 기본 접근 제한자는 상황에 따라 달라지며, 이를 정확히 이해하는 것은 코드의 가시성과 캡슐화를 설계하는 데 매우 중요합니다.
클래스와 구조체의 기본 접근 제한자 : internal
C# 에서 클래스(class)나 구조체(struct)를 선언할 때 접근 제한자를 따로 명시하지 않으면, 기본적으로 internal 로 간주됩니다.
// 기본적으로 internal로 간주됨
struct MyStruct { }
class MyClass { }
즉, 이런 선언은 해당 타입이 같은 프로젝트 내에서만 접근 가능하다는 뜻입니다. 다른 프로젝트(다른 어셈블리)에서는 접근할 수 없습니다.
같은 어셈블리란?
C# 에서 어셈블리는 .dll 또는 .exe 단위로 생성된 결과물이며, 일반적으로 하나의 프로젝트가 하나의 어셈블리를 만듭니다.
• 같은 프로젝트 내에서는 internal 타입과 멤버에 접근 가능
• 같은 솔루션이라도 프로젝트가 다르면 접근 불가
다음과 같은 구조를 가진 솔루션을 생각해봅시다
MySolution/
├── ProjectA ← 여기서 internal struct 선언
└── ProjectB ← 여기서 ProjectA를 참조함
// ProjectA
struct MyStruct { } // internal로 간주됨
위 구조에서는 ProjectA 안에서는 MyStruct에 접근할 수 있지만, ProjectB에서는 접근할 수 없습니다. 이는 MyStruct가 internal이기 때문입니다.
필드의 기본 접근 제한자 : private
클래스나 구조체 안에 선언된 **필드(field)**는 접근 제한자를 생략하면 기본적으로 private으로 간주됩니다.
struct MyStruct
{
int x; // private 필드
int y; // 이것도 private 필드
}
즉, 해당 필드는 구조체 외부에서는 접근할 수 없으며, 구조체 내부에서만 사용할 수 있습니다. 필드는 기본적으로 private 이다라는 점을 기억하면 좋습니다.
정리
• 구조체나 클래스는 접근 제한자를 생략하면 기본적으로 internal
• 내부 필드는 접근 제한자를 생략하면 기본적으로 private
• internal은 같은 프로젝트 내에서만 접근 가능, 다른 프로젝트에서는 접근 불가
C# 에서는 접근 제한자를 명확히 지정하는 것이 좋으며, 기본값을 알고 있으면 코드 작성 시 불필요한 오류를 줄일 수 있습니다.
'C#' 카테고리의 다른 글
구조체를 초기화하는 몇 가지 방법들 (0) | 2025.06.03 |
---|---|
new() 의 완벽한 이해 (0) | 2025.05.20 |
정렬 알고리즘의 기초 2편 : 선택 정렬 (Selection Sort) (0) | 2025.05.04 |
정렬 알고리즘의 기초 1편 : 버블 정렬 (Bubble Sort) (0) | 2025.05.04 |
C# 에서 temp 없이 값 교환하는 법, 이렇게 간단해도 될까요? (0) | 2025.05.04 |