접근 제한자는 객체지향의 추상화와 은닉성을 돕는 문법이라고 생각한다. 접근제한자를 통해 구체적인 구조 자체는 숨기고, 사용하기 편한 인터페이스만을 공개하는 것으로 추상화를 돕고, 사용자가 직접 접근하면 데이터의 무결성이 깨질 수 있는 데이터를 보호하는 것을 통해 은닉성을 돕는다.
개념자체는, class에 접근제한자를 붙여 접근가능한 범위를 정하는 기능이다. 근데 C++에서는 없는 기능이다. 왜일까?
조금 생각해보니, C++은 일반적으로 분할구현을 통해 파일별로 클래스를 구현하고, #include를 통해 해당 파일을 참조하여 클래스를 사용한다. 즉, 내가 해당 파일을 명시적으로 참조하지 않으면, 해당 클래스에 접근하는 것은 불가능하다. C++에서는 개발자가 의식적으로 class에 대한 접근을 설정해주는 것과 다름이 없다.
하지만, C#에서는 솔루션 내 모든 파일은 참조가 되어있는 상태이다. 그렇기 때문에 오히려 class에 대한 접근을 제한할 수단이 필요했던 것이다.
- public: 모든 어셈블리의 코드가 이 형식이나 멤버에 액세스할 수 있습니다. 포함하는 형식의 접근성 수준은 해당 형식의 공용 멤버에 대한 접근성 수준을 제어합니다.
- private: 동일한 class 또는 struct에 선언된 코드만 이 멤버에 액세스할 수 있습니다.
- protected: 동일한 class 또는 파생된 class의 코드만 이 형식이나 멤버에 액세스할 수 있습니다.
- internal: 동일한 어셈블리의 코드만 이 형식이나 멤버에 액세스할 수 있습니다.
- protected internal: 동일한 어셈블리 또는 다른 어셈블리의 파생 클래스에 있는 코드만 이 형식이나 멤버에 액세스할 수 있습니다.
- private protected: 동일한 어셈블리 및 동일한 클래스 또는 파생 클래스의 코드만 형식이나 멤버에 액세스할 수 있습니다.
- file: 동일한 파일에 있는 코드만 형식이나 멤버에 액세스할 수 있습니다.
public, private, proteted는 C++과 똑같다.
생소한 녀석들만 알아보자.
- internal
동일한 어셈블리의 코드는 같은 프로젝트를 의미한다. 솔루션을 빌드하게되면, 프로젝트들은 개별적인 exe파일, dll파일로 만들어진다(새로운 사실을 알았는데 C#은 lib를 사용하지 못한다고 한다.). 각 파일 내부에서 쓰이는 기능들 간 접근을 허용하는 접근제한자라고 생각하면 될 것 같다.- protected internal
internal과 protected의 합집합이다. 어떤의도로 만들어진건지는 잘 모르겠다. 이렇게 쓸 일이 있나? 많이는 안쓸것 같다.- private protected
internal과 protected의 교집합이다. 이게 protected internal보다는 많이 쓸 거같은데. 개인적으로는 이름도 별로 직관적이지 않은 것 같다. 맘에안드네!- file
같은 파일 내에서만 접근이 가능한 접근제한자. 간단하고 좋네요.
- 클래스 및 구조체, 인터페이스 :
public, internal(기본 접근제한자)- 클래스 멤버(중첩 클래스 포함) :
public, protected internal, protected, internal, private protected, private(기본 접근제한자)- 구조체 멤버(중첩 클래스 및 구조체 포함) : public, internal, private(기본 접근제한자) //구조체는 상속을 지원하지 않기 때문에 protected 관련 접근제한지정자를 사용 못함
- 인터페이스 멤버 :
public(기본 접근제한자)