본문 바로가기

프로그래밍 언어/파이썬

파이썬(Python) 캡슐화, 접근 제어와 정보 은닉

파이썬 캡슐화 시작하기: 접근 제어와 정보 은닉

캡슐화는 객체 지향 프로그래밍의 핵심 개념 중 하나로, 데이터와 메서드를 하나로 묶고 외부로부터의 직접적인 접근을 제한하는 방법입니다. 파이썬에서의 캡슐화는 접근 제어자를 통해 이루어지며, 이를 통해 정보 은닉과 데이터 보호를 실현할 수 있습니다. 이번 글에서는 파이썬의 캡슐화 개념과 이를 활용하는 방법을 살펴보겠습니다.

 

 

 

1. 캡슐화란?

캡슐화는 객체 지향 프로그래밍에서 데이터와 이를 처리하는 메서드를 하나의 단위로 묶고, 외부에서 직접 접근하지 못하도록 보호하는 개념입니다. 이를 통해 데이터의 무결성을 유지하고, 코드의 재사용성과 유지보수성을 높일 수 있습니다.

 

 

2. 파이썬에서의 접근 제어자

파이썬은 명시적인 접근 제어자를 제공하지 않지만, 변수와 메서드 이름에 밑줄(_)을 붙여 접근 수준을 나타낼 수 있습니다.

  • 단일 밑줄(_variable): 내부 사용을 권장하지만, 외부에서 접근 가능
  • 이중 밑줄(__variable): 네임 맹글링(Name Mangling)을 통해 클래스 외부에서 접근 불가

 

 

3. 정보 은닉의 중요성

정보 은닉은 객체의 내부 상태를 숨기고, 이를 조작하는 방법을 제한하여 데이터 무결성을 유지합니다. 이를 통해 예기치 않은 수정이나 사용으로부터 객체를 보호할 수 있으며, 객체 간의 결합도를 낮추어 코드의 유연성과 확장성을 높입니다.

 

 

4. 캡슐화 구현 예제

아래는 파이썬에서 캡슐화를 구현한 간단한 예제입니다.

class Person:
    def __init__(self, name, age):
        self.__name = name  # Private attribute
        self.__age = age    # Private attribute

    def get_name(self):
        return self.__name

    def get_age(self):
        return self.__age

    def set_age(self, age):
        if 0 < age < 120:
            self.__age = age
        else:
            raise ValueError("Invalid age")

위 예제에서 __name__age는 비공개 속성으로 외부에서 직접 접근할 수 없으며, get_nameget_age 메서드를 통해서만 접근 가능합니다.

 

 

 

 

5. 프로퍼티를 사용한 접근 제어

파이썬의 @property 데코레이터를 사용하면, 메서드를 통해 속성에 접근할 수 있습니다. 이를 통해 속성 값을 읽고 쓸 때 추가적인 로직을 쉽게 구현할 수 있습니다.

class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    @property
    def name(self):
        return self.__name

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, age):
        if 0 < age < 120:
            self.__age = age
        else:
            raise ValueError("Invalid age")

위 예제에서 @property@age.setter를 사용하여 __age 속성에 대한 접근과 설정을 제어합니다.

 

 

6. 실전 예제: 은행 계좌 클래스

다음은 은행 계좌를 나타내는 클래스를 통해 캡슐화를 구현한 예제입니다.

class BankAccount:
    def __init__(self, owner, balance=0):
        self.__owner = owner
        self.__balance = balance

    @property
    def balance(self):
        return self.__balance

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
        else:
            raise ValueError("Deposit amount must be positive")

    def withdraw(self, amount):
        if 0 < amount <= self.__balance:
            self.__balance -= amount
        else:
            raise ValueError("Insufficient funds or invalid amount")

위 예제에서는 BankAccount 클래스의 __balance 속성을 비공개로 설정하고, 입금과 출금을 위한 메서드를 통해 접근을 제어합니다.