이번 강의는 "접근 제한자" 에 대해서 알아보는 시간을 가져보겠습니다.
이에 앞서, 지난 강의의 소스를 일단 봅시다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Hello_World
{
class smartphone
{
public string phonename; //폰 이름 필드
public int version; // 폰의 버전을 나타내는 필드
public string ownername; // 폰 주인을 나타내는 필드
public void whosephone()
{
Console.WriteLine(" {0} : 꺼임 ", ownername);
}
}
class Program
{
static void Main(string[] args)
{
smartphone smart = new smartphone();
smart.ownername = "JOHNSON";
smart.version = 6;
smart.phonename = "iPhone";
smart.whosephone();
Console.WriteLine("{0} 님의 폰 이름은 {1} 이구 그 버전은 {2} 임", smart.ownername, smart.phonename, smart.version);
}
}
}
smartphone 클래스 내부의 필드(변수) 를 보시면, 앞에 "public" 이라는 단어가 붙어있습니다.
이러한 public 같은 것을 접근 제한자 라고 하는데요, 다음과 같은 종류가 있습니다.
1. private
2. public
3. protected
4. internal
5. protected internal
첫 번째로, private 는 클래스 내부에서만 사용 가능하며, 그 외부 클래스에서 불러올때는 오류가 납니다.
또한, 아무 제한자 없이 int a; 등으로 그냥 선언을 했을시에는 앞에 자동으로 private 형이 붙습니다.
예를 들어 보겠습니다.
class water
{
int value;
}
class Program
{
static void Main(string[] args)
{
water wat = new water();
wat.value = 1000;
}
}
이런식으로 코드를 짜면, 위 water class 내부에서는 int value 가 private int value; 가 되면서 외부 클래스에서는 사용을 못 하게 됩니다. 그래서 이런 오류가 발생하죠

그렇다면 어떤 식으로 짜야할까요? 답은 간단합니다. 두 번째로 적힌 public 제한자를 앞에 붙혀두면 됩니다.
public 은 "모든 곳" 에서 그 변수에 접근 가능합니다.
class water
{
public int value;
}
class Program
{
static void Main(string[] args)
{
water wat = new water();
wat.value = 1000;
}
}
이런 식으로 소스를 짜면 오류는 더이상 안나게 됩니다.
그래서 1강 소스 (맨 위의 소스코드) 에서 smartphone 내부의 필드를 public 으로 선언해준 것 입니다.
internal 은 동일한 프로젝트 내에서 사용 가능한 것 입니다. 즉, 동일한 프로그램(namespace) 내에서라면 public 과 동일한 역할을 합니다.
protected 는 "상속된 클래스 에서" 만 사용 가능한 한정자 입니다. 이 부분은 상속을 다루며 언급 하겠습니다.