정리가 필요한 카테고리(추후 정리)/C#,Unity

C#] 접근 수정자(Acces Modifier)

TwinParadox 2017. 7. 22. 00:00
728x90



캡슐화를 강화하는 목적으로 형식이나 형식의 멤버의 접근성(accessibility)을 설정할 수 있으며, 그 형식이나 멤버에 다른 어떤 형식이나 어셈블리가 접근할 수 있는지 결정함.

접근성을 설정하기 위해 형식이나 멤버 선언 시 적용하는 다섯 가지 접근자가 존재함.



- public

모든 형식과 어셈블리가 접근 가능한 공용.

열거형이나 인터페이스의 모든 멤버에는 암묵적으로 이 수준이 적용됨.


- internal

형식이 속한 어셈블리나 그 어셈블리와 friend 관계인 어셈블리에서만 접근 가능함.

비내포 형식(non-nested type; 다른 형식에 내포된 것이 아닌 형식)의 기본 접근성


- private

멤버가 속한 형식 안에서만 접근 가능한 전용.

이는 클래스나 구조체 멤버들의 기본 접근성.


- protected

멤버가 속한 형식 또는 그 형식의 파생 형식들에서만 접근 가능.


- protected internal

portected와 internal의 접근성의 합집합에 해당함.

CLR에는 protected와 internal의 교집합에 해당하는 접근성이 있으나, C#은 이를 지원하지 않음.



class Class1 {} // 기본적으로 internal
public class Class2 {} 

class ClassA { int x; } // x는 기본적으로 private
class ClassB { internal int x ; }

class BaseClass
{
	void Function1() {} // 기본적으로 private
	protected void Function2() {}
}

class SubClass : BaseClass
{
	void Test1() { Function1(); } // 접근 불가
	void Test2() { Function2(); } // 접근 가능
}



## friend assembly


고급 응용에서는 internal 멤버들을 다른 friend assembly에게 노출하면 좋을 상황이 생길 수 있음.

그런 경우 아래 예처럼, Assembly 특성 System.Runtime.CompilerService.InternalVisibleTo를 이용해 friend assembly의 이름을 지정하면 됨.


friend assembly에 강력한 이름(strong name)이 있으면, 반드시 160bytes의 전체 공개 키(full public key)를 지정해야 함.

강력한 이름이 지정된 assembly에서 전체 공개 키를 얻을 때 LINQ 질의를 이용하면 됨.




## 접근성 제한


형식은 자신이 선언한 멤버들의 접근성 상한을 제한함.

이러한 제한의 가장 흔한 일례는 public 멤버들이 있는 형식의 접근성을 internal로 두는 것임.




## 접근 수정자에 대한 제약


기반 클래스의 함수 멤버를 재정의하는 경우, 접근성을 원래 함수와 동일하게 설정함.


class BaseClass
{
	protected virtual void Function1() {}
}
class SubClass1 : BaseClass
{
	protected override void Function1() {} // 가능
}
class SubClass2 : BaseClass
{
	public overrid void Function1() {} // 오류
}


단, protected internal 메서드를 다른 어셈블리에서 재정의하는 경우는 예외이며, 그런 경우 재정의하는 함수는 그냥 protected여야 함.

파생 클래스의 접근성이 기반 클래스보다 더 제한적일 수는 있으나 관대할 수 없는 경우처럼 컴파일러는 접근 수정자가 일관성 없이 적용된 사례를 검출해 컴파일 오류를 발생시킴.

728x90