학습
C# 접근 제한자
C# 접근 제한자 — 초급
접근 제한자
1. 도입 (왜 배워야 하는가)
C#에서 접근 제한자는 클래스와 클래스의 멤버(필드, 메서드, 프로퍼티 등)에 대한 접근을 제어하는 중요한 개념입니다. 이는 객체 지향 프로그래밍의 핵심 원칙 중 하나인 캡슐화를 구현하는 데 필수적입니다.
실무에서는 여러 개발자가 동시에 코드 작업을 하게 되는데, 이때 접근 제한자를 통해 각 클래스의 내부 구현을 보호하고 의도하지 않은 데이터 변경이나 오용을 방지할 수 있습니다. 만약 접근 제한자를 제대로 이해하지 못한다면, 의도치 않게 중요한 데이터를 외부에서 수정할 수 있는 상황이 발생할 수 있으며, 이는 프로그램의 안정성을 해치는 원인이 됩니다.
2. 핵심 개념 설명
접근 제한자는 클래스 멤버에 대한 접근 수준을 정의합니다. C#에서는 다음과 같은 접근 제한자를 사용합니다:
| 접근 제한자 | 설명 |
|---|---|
| public | 모든 코드에서 접근 가능 |
| private | 동일 클래스 내에서만 접근 가능 |
| protected | 동일 클래스 및 파생 클래스에서 접근 가능 |
| internal | 동일 어셈블리 내에서만 접근 가능 |
| protected internal | 동일 어셈블리 내 및 파생 클래스에서 접근 가능 |
비유
접근 제한자를 이해하기 쉽게 설명하자면, 집의 방과 같이 생각할 수 있습니다. 집의 외부(공용 공간)는 누구나 들어올 수 있지만, 개인 방(프라이빗 공간)은 집주인만 들어갈 수 있는 것과 유사합니다. 이처럼 접근 제한자는 클래스의 '방'을 설정하여 외부에서의 접근을 조절합니다.
3. 기본 코드 예제
다음은 각 접근 제한자를 사용한 간단한 코드 예제입니다.
public class Person
{
public string Name; // 어떤 클래스에서나 접근 가능
private int age; // 이 클래스 내에서만 접근 가능
protected string address; // 동일 클래스 및 상속 클래스에서 접근 가능
internal string email; // 같은 어셈블리 내에서 접근 가능
public void SetAge(int value)
{
age = value; // private 멤버이므로 이 클래스 내에서만 접근
}
public int GetAge()
{
return age; // age를 반환
}
}
실행 결과
아래와 같은 방식으로 Person 클래스를 사용할 수 있습니다.
Person person = new Person();
person.Name = "John"; // public 멤버에 접근
person.SetAge(30); // private 멤버는 메서드를 통해 접근
int age = person.GetAge(); // private 멤버를 통해 나이를 가져옴
코드 한 줄씩 동작 설명
public class Person:Person이라는 클래스를 정의합니다. 이 클래스는 외부에서 접근 가능합니다.public string Name;: 모든 코드에서Name필드에 접근할 수 있습니다.private int age;: 이 필드는Person클래스 내부에서만 접근할 수 있습니다.protected string address;: 이 필드는Person클래스와 이를 상속한 클래스에서 접근 가능합니다.internal string email;: 같은 어셈블리 내에서 이 필드에 접근할 수 있습니다.public void SetAge(int value):age필드에 값을 설정하는 메서드입니다. 외부에서 호출할 수 있습니다.public int GetAge():age필드의 값을 반환하는 메서드입니다.
4. 실전 활용 예제
쇼핑몰에서 장바구니 구현
장바구니 클래스에서 사용자의 장바구니 아이템을 관리할 때, 고객이 직접 장바구니의 아이템 수량을 조작하지 못하도록 private 접근 제한자를 사용하여 보호할 수 있습니다.
public class ShoppingCart
{
private List<string> items = new List<string>();
public void AddItem(string item)
{
items.Add(item); // 아이템 추가
}
public List<string> GetItems()
{
return items; // 아이템 목록 반환
}
}
게임 캐릭터 구현
게임 캐릭터 클래스에서 체력(HP)와 같은 중요한 데이터를 private로 설정하여 외부에서 직접 수정할 수 없도록 보호하는 예입니다.
public class Character
{
private int health;
public void TakeDamage(int damage)
{
health -= damage; // 피해를 받아 체력 감소
}
public int GetHealth()
{
return health; // 현재 체력 반환
}
}
5. 흔한 실수와 주의사항
1. public과 private의 혼동
public class Example
{
private int number;
public void ShowNumber()
{
Console.WriteLine(number); // 올바른 접근
}
}
// 잘못된 접근
Console.WriteLine(new Example().number); // 오류 발생
number는 private이므로 외부에서 접근할 수 없습니다.2. 접근 제한자의 필요성을 간과
접근 제한자를 설정하지 않으면 예상치 못한 데이터 손실이나 오류가 발생할 수 있습니다. 예를 들어:
public class Data
{
public int Value;
}
public class Test
{
public void ModifyData(Data data)
{
data.Value = 10; // 외부에서 직접 수정 가능
}
}
Value가 수정되어 프로그램의 비즈니스 로직이 깨질 수 있습니다.6. 정리
public, private, protected, internal, protected internal 등이 있습니다.다음에 학습하면 좋은 주제는 상속입니다. 상속을 통해 다형성과 코드 재사용성을 높일 수 있는 방법을 배워보세요.