F.R.I.D.A.Y.

C# - 접근제한자 본문

DEV/.Net

C# - 접근제한자

F.R.I.D.A.Y. 2021. 5. 30. 20:58
반응형

 메서드, 필드, 클래스의 사용 범위를 지정할 수 있는 접근제한자


 접근제한의 필요

 굳이 멀리 가지 않더라도, 우리 집에 다른 사람이 무단으로 침입한다고 하면 불쾌할 것이다. 프로그램에서도 외부에서 접근하면 기능에 이상이 생기거나 잠재적인 오류를 만들 위협이 있을 때, 혹은 구태여 외부에 노출할 필요가 없을 때 접근을 차단할 필요가 있다.

 

 이런 이유로 여러 언어에서 접근제한자를 두어 필요에 따라 사용할 수 있도록 했다.

 

접근제한자 종류

 C#에서는 총 다섯 개의 접근제한자가 존재한다.

  • public
  • protected
  • private
  • internal
  • protected internal

 이중, internal과 protected internal은 외부 어셈블리와 관련된 접근제한자로 따로 다룬다.

 

public

 의미대로 외부에서 얼마든지 접근이 가능하도록 허용하는 접근제한자이다. 이 제한자를 사용하면 다른 어셈블리[# internal 제한자를 설명하며 함께 설명한다.]에서도 접근이 가능하다.

 

protected

 해당 제한자를 사용하면 외부에선 접근이 불가능하고, 해당 제한자를 상속한 대상만 접근이 가능하다. 테스트로 아래의 클래스가 존재한다고 가정한다.

class TestA{
	protected int value1;
    
    public TestA(int val){
		this.value1 = val;
        
    }

}

 해당 클래스의 value1 필드를 외부에서 접근하려고 하면 오류가 발생한다. protected로 접근제한자를 설정해 외부에서의 접근을 차단했기 때문이다. 그러나 TestA 클래스를 상속한 TestB 클래스에서는 접근이 가능하다.

 

 파생클래스에서 상위 부모 클래스 필드에 접근할 때는 base란 키워드를 이용해 접근이 가능하다.

    class TestB: TestA
    {
        public TestB(int a) : base(a)
        {
            base.value1 = 5;
        }
    }

 C++에선 this 포인터면 다 됐는데 왜 이렇게 바뀌었을까 생각해보면, 아마도 특정 필드가 상속으로 받은 내용임을 더 명확히 하기 위해서가 아닐까 생각해본다. this와 base를 작성함으로써 해당 필드가 부모로부터 받은것인지 직접 작성한 것인지 알기 쉽도록.

 

 참고로 struct 타입의 경우에는 애초에 상속이 불가하기 때문에 이 제한자는 사용할 수 없다.

 

private

 이 제한자는 상속이고 뭐고 아무것도 없다. 무조건 선언한 그 영역 안에서만 사용이 가능하다.

 


어셈블리 접근제한자

 <접근제한자 종류>에서 internal과 protected internal을 설명했는데, 이건 아래처럼 생각하면 될 것 같다.

 

 C#을 포함한 .NET 기반 프로그램은 어셈블리란 단위로 실행이 된다. 즉, 어셈블리가 독립적으로 기능을 수행하는 한 개의 단위라는 소리. exe와 같은 실행파일이나 dll과 같은 동적 연결 라이브러리의 형태로 존재한다고[# https://docs.microsoft.com/ko-kr/dotnet/standard/assembly/]

 

 예컨데 A라는 exe 파일을 B라는 프로그램에서 임포트해서 요소를 사용한다고 하면 public으로 선언된 모든 구성요소를 사용할 수 있다. 그러나 public이라고 해서 모든 구성요소를 사용하도록 두어서는 안되는 경우도 있다. 그런 경우에는 다른 어셈블리에서 현 어셈블리 안의 데이터에 접근할 수 없도록 internal을 사용한다고. 

 

internal

 선언된 어셈블리 안에서는 얼마든지 접근이 가능하지만 선언된 어셈블리의 외부, 즉 다른 어셈블리에서는 접근 자체가 불가능하도록 제한.

 

protected internal

 경우에 따라 외부 어셈블리에서 어셈블리 내부의 클래스를 상속해 사용하는 경우가 있을 수 있다. 이때 제한자를 internal로 설정해버리면 상속이 불가능하기 때문에 internal을 사용할 수 없다. 이 경우 public 제한자를 사용하고 싶지 않을때는 protected internal을 사용해 외부 어셈블리에서 접근을 제한하되, 상속을 한경우 접근을 허용하도록 만들 수 있다.

 protected와의 차이는 protected는 외부 어셈블리에서도 상속이 가능한가 정도로 생각하면 될 것 같다.

 

 

private protected

 C# 7.2 버전부터 추가된 제한자라고 한다. 


 public이나 protected, private, internal은 그렇다 치는데 protected internal과 private protected는 대체가 어떤식인지 제대로 모르겠다. 요 두개 때문에 protected도 애매해져버려서 자세한건 코드로 직접 짜서 확인해봐야 할듯.

 

# index

728x90
반응형

'DEV > .Net' 카테고리의 다른 글

C#에서 WinAPI 호출 시 유의할 점  (0) 2022.04.29
WinAPI 보호된 메모리를 읽거나 쓰려고 했습니다.  (0) 2022.04.06
C# - 연산자 오버로딩  (0) 2021.05.29
C# - 메서드에 대해서  (0) 2021.05.29
C# - 구조체와 클래스  (0) 2021.05.28
Comments