파이썬 클래스: 캡슐화와 속성 은닉의 기초

캡슐화

클래스의 인스턴스 객체가 생성되면, 클래스에 미리 정의된 함수는 해당 인스턴스 객체의 메서드가 되며, self에 바인딩된 클래스의 변수는 해당 인스턴스 객체의 데이터가 됩니다. 각 인스턴스 객체의 메서드와 데이터는 서로 독립적이며, 서로 간섭하지 않습니다.

클래스의 인스턴스 객체는 메서드를 호출할 수 있으며, 이를 통해 해당 인스턴스 객체의 데이터에 접근하거나 수정할 수 있습니다. 이것이 바로 캡슐화입니다. 데이터(속성)를 메서드 안에 감싸서 외부에 직접 노출시키지 않는 것입니다.

외부에서는 단순히 메서드를 호출하여 원하는 데이터를 수정하거나 접근할 수 있으며, 메서드의 내부 구현 방식에 대해서는 알 필요가 없습니다. 메서드 내부가 어떻게 구현되었는지에 대한 세부 사항은 숨겨져 있습니다.

class Person:

    def __init__(self, full_name):
        self.full_name = full_name
    
    def display_name(self):
        print(f'개인의 이름은: {self.full_name}')

person1 = Person('김철수')
person1.display_name()
person2 = Person('이영희')
person2.display_name()

위와 같이, 외부에서는 매개변수를 전달하여 인스턴스 객체를 생성하고 display_name 메서드를 호출하면 name 데이터가 출력됩니다. 구체적으로 어떻게 출력되는지에 대한 내부 구현은 외부에서 알 필요가 없습니다.

속성 은닉

캡슐화의 개념에 따르면, 속성에 접근하거나 수정하려면 메서드를 통해 해야 합니다. 하지만 다음 예제에서 볼 수 있듯이, 이를 우회하는 방법이 존재합니다.

class Employee:

    def __init__(self, employee_name):
        self.employee_name = employee_name
    
    def show_name(self):
        print(f'직원의 이름은: {self.employee_name}')

emp1 = Employee('박민준')
print(f'이름: {emp1.employee_name}')
emp1.employee_name = '박민준2'
print(f'이름: {emp1.employee_name}')

위 예제에서는 인스턴스 변수를 직접 호출하여 속성 데이터를 얻거나 수정했습니다.

사실 파이썬은 외부에서 직접 접근하는 것을 명확히 금지하는 방법을 제공하지 않습니다. 캡슐화는 객체 지향 프로그래밍의 핵심 개념이므로, 데이터에 접근할 때는 캡슐화의 원칙을 따르는 것이 좋습니다.

예를 들어, 만약 show_name 메서드에 print 전에 다른 로직 코드가 있다면(다른 함수 호출이나 이름을 대문자로 변환 등), 외부에서 직접 속성에 접근하면 얻는 데이터 결과는 완전히 달라질 수 있습니다.

메서드나 속성이 외부에서 직접 접근되지 않도록 하려면, 해당 이름 앞에 밑줄 두 개(__)를 붙이면 됩니다. 이렇게 하면 비공개 메서드 또는 속성이 됩니다.

class BankAccount:

    def __init__(self, balance):
        self.__balance = balance
    
    def get_balance(self):
        return self.__balance

account = BankAccount(1000000)
print(account.get_balance())  # 1000000 출력
# print(account.__balance)  # AttributeError 발생

하지만 밑줄 두 개를 추가해도 외부에서 접근할 방법은 여전히 존재합니다. 파이썬이 밑줄 두 개로 시작하는 이름을 변환하기 때문입니다. 변환 규칙은 앞에 밑줄 하나와 클래스 이름을 추가하는 것입니다. 위 예제에서 외부에서 접근하려면 다음과 같이 할 수 있습니다.

print(account._BankAccount__balance)  # 1000000 출력

또 다른 방법은 밑줄 하나로 시작하는 속성이나 메서드입니다. 이는 외부에서 직접 접근할 수는 있지만, 그렇게 하지 말아야 한다는 의미로, 비공개처럼 취급해야 한다는 암시입니다.

결론적으로 파이썬은 외부에서 직접 접근하는 것을 명확히 금지하는 구체적인 방법을 제공하지는 않습니다. 단지 밑줄을 사용하여 그렇게 하지 말아야 한다는 것을 암시할 뿐입니다.

참고로 밑줄 두 개로 시작하고 끝나는 변수나 메서드는 특별한 변수 또는 메서드를 의미하며, 앞서 설명한 단일 또는 이중 밑줄로 시작하는 것과는 다릅니다.

태그: 파이썬 클래스 캡슐화 속성 은닉 객체 지향 프로그래밍

7월 22일 05:30에 게시됨