728x90

접근 제한자(Access Modifier) : 외부로부터 타입(class, struct, inteface, delegate )나 위 타입들의 멤버들(method, property, event, field)로의 접근을 제한할 때 사용한다.


클래스 멤버는 5가지의 접근 제한자를 (public, internal, private, protected, protected internal) 모두 가질 수 있지만, 구조체(struct) 멤버는 상속이 되지 않으므로 3가지의 접근 제한자만 (public, internal, private) 가질 수 있다.


접근 제한자

클래스 내부

외부 클래스

파생(자식) 클래스

프로젝트

 public





 protected


 


 

 internal



 

 private

 

 

 

 protected internal


 

 


어셈블리는 하나의 단일한 단위로 존재하는 .NET의 실행 가능한 프로그램 또는 실행 프로그램의 일부이며  실행 및 배포의 단위라고 할 수 있다. C# 응용 프로그램 작성의 결과로 생긴 .exe 파일, 클래스 라이브러리 작성의 결과인 DLL이 각각 하나의 어셈블리 이다.
하나의 단일한 어셈블리 안의 모든 코드는 하나의 단일한 단위로 빌드, 배포되며 버전 번호가 부여되는데 각 어셈블리는 다른 프로그램들이 사용 할 수 있는 pulic class, 속성, 메소드 등을 노출하고, private으로 선언된 것들은 모두 어셈블리 안에 은폐된다.


internal
동일한 어셈블리 내에 있는 다른 타입들이 접근할 수 있다.


protected
파생 클래스에서 이 클래스 멤버에 접근할 수 있다.

private
클래스 내부와 구조체 내에서만 멤버에 접근 가능하다.


using System;

namespace ClassModifier
{
    class BaseClass // 부모 클래스
    {
        int a; // 클래스의 멤버를 접근 제한자로 지정하지 않으면 멤버의 접근 수준은 무조건 private로 자동 지정됨
        int b;

        private void A() { }
        protected void B() { }

        public void C() { }

        public void ParentMethod() // 부모클래스의 ParentMethod 메소드
        {
            A();
            B();
            C();
        }
    }
    class DerivedClass : BaseClass // DerivedClass (파생) 클래스는 BaseClass(부모클래스)를 상속받는다
    {
        public void ChildMethod()
        {
            //A(); // private 접근 지시어로 선언된 메소드 접근은 같은 클래스 안에서만 접근 가능
            B(); // protected 접근 지시어로 선언되었고 자식 클래스는 부모 클래스의 파생 클래스 이므로 접근 가능
            C();
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            BaseClass parent = new BaseClass(); // Baseclass(부모) 클래스로 새 객체를 생성한다.
            parent.a = 1; // 보호수준 때문에 접근 불가
            DerivedClass child = new DerivedClass(); // DerivedClass(자식) 클래스로 새 객체를 생성한다.
            parent.ParentMethod();
            child.ChildMethod();
            child.C();
        }
    }
}



'C# > 문법 및 기능' 카테고리의 다른 글

C# 인터페이스  (0) 2019.08.18
C# 구조체(Struct)  (0) 2019.08.14
자바와 C#의 차이점  (0) 2016.12.27
C# NameValueCollection  (0) 2016.03.20
C# Dictionary 와 comboBox 연결  (0) 2016.02.08
블로그 이미지

Link2Me

,