인스턴스 프라이빗 변수는 클래스 내부에서만 접근할 수 있도록 설계된 변수로, 외부에서 직접 접근할 수 없도록 보호된 변수이다. 이러한 변수는 변수 이름 앞에 밑줄 두 개(__
)를 붙여 정의된다. 이를 통해 변수의 이름이 변경(name mangling)되어 외부에서의 접근이 제한된다.
프라이빗 변수 정의 및 사용
프라이빗 변수는 클래스 내부에서 정의되며, 클래스 내부의 메서드를 통해 접근하고 조작할 수 있다. 외부에서 직접 접근하려고 하면 AttributeError
가 발생한다.
class Person:
def __init__(self, name, age):
self.__name = name # 프라이빗 변수
self.__age = age # 프라이빗 변수
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
def get_age(self):
return self.__age
def set_age(self, age):
if age > 0:
self.__age = age
else:
raise ValueError("나이는 양수여야 합니다.")
# 객체 생성
person = Person("홍길동", 30)
# 클래스 내부 메서드를 통해 접근
print(person.get_name()) # 홍길동 출력
print(person.get_age()) # 30 출력
# 프라이빗 변수 직접 접근 시도
try:
print(person.__name)
except AttributeError as e:
print(e) # 'Person' object has no attribute '__name' 출력
위 예제에서 __name
과 __age
는 프라이빗 변수로 정의되었으며, 외부에서는 직접 접근할 수 없다. 대신 get_name
, set_name
, get_age
, set_age
메서드를 통해 접근하고 값을 변경할 수 있다.
이름 장식 (Name Mangling)
파이썬은 프라이빗 변수에 접근을 제한하기 위해 이름 장식(name mangling)을 사용한다. 이는 변수 이름을 클래스 이름과 결합하여 변경하는 방식이다. 예를 들어, __name
이라는 프라이빗 변수는 _Person__name
으로 변경된다. 이를 통해 클래스 외부에서 우연히 접근하는 것을 방지한다.
# 이름 장식을 통한 프라이빗 변수 접근
print(person._Person__name) # 홍길동 출력
위와 같이 클래스 이름을 이용해 프라이빗 변수에 접근할 수 있지만, 이는 일반적으로 권장되지 않는 방법이다.
프라이빗 변수를 사용하는 이유
캡슐화(Encapsulation): 프라이빗 변수는 클래스 내부의 구현 세부 사항을 숨기고, 외부로부터 데이터를 보호하여 클래스의 일관성을 유지한다.
데이터 보호: 중요한 데이터나 내부 상태를 보호하여 무분별한 접근과 수정으로부터 객체를 보호한다.
유지보수 용이성: 클래스의 내부 구현이 변경되더라도 외부 코드에 영향을 미치지 않도록 하여 코드의 유지보수를 쉽게 한다.