IMCAT.DEV
로그인 가입
C# 입문 객체지향

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 등이 있습니다.
  • 캡슐화 원칙에 따라 클래스 내부 데이터 보호가 필요합니다.
  • 실생활 비유를 통해 접근 제한자의 개념을 이해할 수 있습니다.

다음에 학습하면 좋은 주제는 상속입니다. 상속을 통해 다형성과 코드 재사용성을 높일 수 있는 방법을 배워보세요.