프로그래밍

클래스의 접근 제어자(Access Modifiers)

maxboy 2025. 3. 18. 14:23

출처 : https://dotnethints.com/el/blogs/public-vs-protected-vs-private

 

  객체지향 프로그래밍(OOP)에서 클래스의 멤버(변수 및 메서드)에 대한 접근을 제어하는 키워드로, public, private, protected가 있습니다. 이를 통해 데이터 은닉(Encapsulation)을 구현하고, 객체 간의 의존성을 줄여 유지보수성을 높일 수 있습니다.

 


1. public(공개)

 

  • 어디서든 접근 가능 (같은 클래스, 같은 패키지, 상속받은 클래스, 다른 클래스에서도 접근 가능)
  • 클래스 외부에서도 멤버 변수 및 메서드를 호출할 수 있음
  • 객체의 인터페이스를 정의할 때 사용 (즉, 외부에서 접근해야 하는 메서드에 사용)
// C#

class Example {
    public int x = 10;
    
    public void Show() {
        Console.WriteLine("Hello, World!");
    }
}

class Program {
    static void Main() {
        Example obj = new Example();
        obj.x = 20;  // 외부에서 접근 가능
        obj.Show();  // 외부에서 접근 가능
    }
}

 

# python

class Example:
    def __init__(self):
        self.x = 10  # public 변수
    
    def show(self):
        print("Hello, World!")

obj = Example()
obj.x = 20  # 외부에서 접근 가능
obj.show()  # 외부에서 접근 가능

 

2. private (비공개)

  • 같은 클래스 내에서만 접근 가능 (외부에서는 접근 불가).
  • 객체의 내부 상태를 보호하기 위해 사용.
  • 다른 클래스에서 직접 접근할 수 없으며, 접근하려면 public 메서드를 통해 간접적으로 접근해야 함.
// C#

class Example {
    private int x;

    public void SetX(int value) { x = value; }
    public int GetX() { return x; }
}

class Program {
    static void Main() {
        Example obj = new Example();
        // obj.x = 10;  // 오류! private 변수 접근 불가
        obj.SetX(10);
        Console.WriteLine(obj.GetX()); // 10 출력
    }
}
#python

class Example:
    def __init__(self):
        self.__x = 10  # private 변수 (접근하려면 getter/setter 필요)

    def set_x(self, value):
        self.__x = value  # setter

    def get_x(self):
        return self.__x  # getter

obj = Example()
# obj.__x = 20  # 오류! private 변수 접근 불가
obj.set_x(20)
print(obj.get_x())  # 20 출력

 

python에서는 __변수명을 사용하면 private 변수로 취급되지만, 사실은 _클래스명__변수명으로 이름이 변환되는 것뿐이라 완전한 private은 아닙니다.

 

3. protected (보호)

  • 같은 클래스 + 상속받은 자식 클래스에서 접근 가능 (외부에서는 접근 불가).
  • 주로 부모 클래스에서 선언하고, 자식 클래스에서 활용하는 변수나 메서드에 사용됨.
// C#

class Parent {
    protected int x;
}

class Child : Parent {
    public void SetX(int value) { x = value; }
    public int GetX() { return x; }
}

class Program {
    static void Main() {
        Child obj = new Child();
        obj.SetX(10);
        Console.WriteLine(obj.GetX()); // 10 출력
    }
}
# python

class Parent:
    def __init__(self):
        self._x = 10  # protected 변수

class Child(Parent):
    def set_x(self, value):
        self._x = value

    def get_x(self):
        return self._x

obj = Child()
obj.set_x(20)
print(obj.get_x())  # 20 출력

 

python에서는 _변수명을 사용하면 protected로 취급되지만, 강제성은 없습니다. 그냥 "이 변수는 내부적으로만 써야 한다"는 관례적인 표현입니다.