C# 강좌 11편. 접근 제한자(Access Modifier), this [최근 수정 2017.12.17]
1. 접근 제한자(Access Modifier)
오늘은 접근 범위를 결정하게 해주는 접근 제한자에 대해서 알아보려고 합니다. 접근 제한자에는 public, protected, internal, private가 있습니다. 이미 public라는 접근 제한자는 본적이 있죠? 이 네 가지의 접근 제한자에 대해 알아보려고 합니다. 아래는 4개의 접근 제한자를 정리해놓은 표입니다.
접근 제한자 |
설명 |
private |
클래스 내부에서만 접근이 가능합니다. |
public |
모든 곳에서 해당 멤버로 접근이 가능합니다. |
internal | 같은 어셈블리에서만 public으로 접근이 가능합니다. |
protected | 클래스 외부에서 접근할 수 없으나 파생 클래스에서는 접근이 가능합니다. |
protected internal | 같은 어셈블리에서만 protected으로 접근이 가능합니다. |
이해를 돕기위해 예를 하나 들겠습니다. 예를 들어, 다음과 같은 클래스가 있다고 가정해봅시다.
class A
{
int B;
int C;
...
}
클래스 A 내에 B와 C라는 멤버 변수가 존재합니다. 그럼 이제 한번, A 클래스에 기반을 둔 객체를 생성하고 이 객체로 접근을 해보도록 하겠습니다.
A a = new A();
a.B = 1; // 보호 수준 에러!
그런데, 컴파일을 하자마자 에러가 발생했습니다. 에러를 확인해보니, 다음과 같은 이유로 컴파일을 할 수 없다는 것이였습니다.
오류 1 보호 수준 때문에 'ConsoleApplication1.A.B'에 액세스할 수 없습니다. C:\Users\su6net\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs 20 15 ConsoleApplication1
class A
{
public int B;
public int C;
...
}
namespace ConsoleApplication1
{
class A
{
protected int x = 123;
}
class B : A
{
static void Main()
{
A a = new A();
B b = new B();
// 에러 CS1540 발생, 왜냐하면 X는 오직 A에서 파생된 클래스에서만 접근이 가능하기 때문
a.x = 10;
// A에서 파생된 클래스인 B에선 접근이 가능하다.
b.x = 10;
}
}
}
using System;
namespace ConsoleApplication1
{
class A
{
private int num;
public A(int num)
{
num = num;
}
public void Show()
{
Console.WriteLine("num: " + num);
}
}
class Program
{
static void Main(string[] args)
{
A a = new A(50);
a.Show();
}
}
}
...
public A(int num)
{
this.num = num;
}
...