SW 기능/C#

접근제한자

tacoyaggi 2024. 2. 1. 13:27

접근제한자(Access Modifier)

 

접근제한자 는 말그대로 접근을 제한하는 녀석임

 

대상은 클래스의 멤버(필드,메서드,속성)에 대한 접근 권한을 지정하는데 사용함

 

이녀석들의 목적은 클래스의 캡슐화를 관리하고 외부에서의 접근을 제어하여 코드의 유지보수성과 안정성을 증가 시킴

 

예를 들면 롯데 시그니엘 안에 뷔페가 있는데 시그니엘 주민들만 이 뷔페를 이용할 수 있는 것도 접근 제한자에 속함

 

시그니엘이란 클래스 안에 뷔페라는 멤버가 있고 뷔페 멤버에 접근하기 위해서는 시그니엘 클래스를 상속받는 주민이어야함

 

여기서 캡슐화를 적용해보면 시그니엘 주민이 아닌 나는 뷔페라는 존재가 있는지 알 수 없음. 이걸 캡슐화라 부름.

 

접근제한자 종류

public

다른 클래스에서 직접 접근 가능

 

모두에게 개방한다는 느낌이다. 올림픽 공원같이 어떤 사람이던 접근 가능한 것!

private

같은 클래스 내부에서만 접근 가능

 

private 이녀석이 위에서 말한 시그니엘 뷔페에 해당함. 시그니엘 클래스 안에 있는 주민들만 접근 가능함

 

protected

같은 클래스 및 파생 클래스에서 접근 가능

 

여기서 파생은 상속을 의미함. 상속 받은 클래스에서 사용 가능하다는 말

 

시그니엘 카페가 protected 접근제한자라고 가정하고 시그니엘 호텔 투숙객들이 시그니엘 카페 클래스를 상속 받는다고 하면 카페 이용이 가능함!

 

internal

internal 접근제한자는 해당 멤버가 정의된 같은 어셈블리 내에서만 접근 가능함

 

여기서 어셈블리 는 라이브러리를 의미함. 즉 같은 라이브러리 안에서만 접근이 가능하다는 것을 의미!

 

특정 어셈블리에서만 접근 가능하도록 하고 싶다면 아래와 같이 [assembly: InternalsVisibleTo("TestConsole") 접근 허용하려는 어셈블리를 문자열로 넣어주면 해당 라이브러리(TestConsole)에서 InternalClass 에 접근 가능함

 

using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("TestConsole")]

namespace Test2_Console
{
    
    internal class InternalClass
    {
        public int No { get; set; }
        public string? Name { get; set; }
    }

    public class PublicClass
    {
        public int No { get; set; }
        public string? Name { get; set; }
    }
}

 

protected internal


같은 라이브러리 안에서 또는 파생 클래스라는 조건에 적합하면 접근 가능함

 

protected or internal 이라고 생각하면 됨

 

아래에서 protected internal int PI 변수가 있는데 같은 라이브러리인 Bclass에서 internal 효과로 접근 가능

 

결과적으로 둘 중 하나만 만족하면 접근 가능함

 

public class Aclass
{
    protected internal int PI = 0;
    private protected int PP = 1;
}


public class Bclass
{
    void BMethod()
    {
        Aclass aclass = new Aclass();
        int value = aclass.PI;
    }
}

 

 

private protected

같은 클래스 안에서 그리고 파생 클래스라는 조건에 적합하면 접근 가능

 

 

결론


어느 상황에서 Abstract Interface 를 사용해야 하는지 궁금하지 않을 수 없다!

 

가장 큰 차이는 다중 상속에 있다. 다중 상속이 필요하면 무조건 Interface 

 

Abstract 클래스 안에는 일반 메서드 구현이 가능하다고 했다. 그러니 일반 메서드와 추상 메서드가 함께 공존해야하는 상황? 에서는 Abstract 

 

강한 결합을 피하고 싶을 때는 Interface를 사용 한다.