본문 바로가기
C#

접근 제한자가 없는 struct, class 는 public 일까? private 일까?

by Oz Driver 2025. 5. 31.

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# 에서는 접근 제한자를 명확히 지정하는 것이 좋으며, 기본값을 알고 있으면 코드 작성 시 불필요한 오류를 줄일 수 있습니다.