객체지향 프로그래밍에서 데이터와 그 데이터를 다루는 메서드(함수)를 하나로 묶어서, 외부에서 직접 접근하지 못하도록 제한하는 것을 말합니다. 이를 통해 객체의 내부 구현 정보를 보호하고, 외부에서 잘못된 사용으로 발생할 수 있는 오류나 버그를 방지할 수 있습니다.
정보 은닉(Information Hiding): 캡슐화된 객체의 내부 구현 정보를 숨기고, 외부에 공개할 인터페이스만 제공합니다. 이를 통해 객체의 내부 구현 방법을 변경해도 외부에서는 변경되지 않은 인터페이스를 사용할 수 있습니다.
접근 제어(Access Control): 객체의 인터페이스를 통해 외부에서 접근할 수 있는 메서드와 데이터를 제한하여, 객체의 무결성과 안정성을 보장합니다. 예를 들어, 객체 내부의 데이터를 외부에서 직접 변경할 수 없도록 private 접근 제어자를 사용합니다.
class Person:
def __init__(self, name, age):
self._name = name # protected 속성
self._age = age # protected 속성
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):
self._age = age
위 코드에서 _name과 _age 속성은 protected 속성으로 선언되었습니다. 이렇게 protected 속성으로 선언하면, 객체의 내부에서는 접근이 가능하지만, 객체를 사용하는 외부에서는 직접 접근할 수 없습니다. 이러한 접근 제어를 통해 객체의 무결성과 안정성을 보장할 수 있습니다.
class Person:
def __init__(self, name, age):
self._name = name # protected 속성
self._age = age # protected 속성
@property
def name(self):
return self._name
@name.setter
def name(self, name):
self._name = name
@property
def age(self):
return self._age
@age.setter
def age(self, age):
self._age = age
@property 데코레이터를 사용하여 name 프로퍼티를 정의하면, name 프로퍼티를 사용하는 외부에서는 name() 메서드를 호출하는 것과 같은 효과를 볼 수 있습니다. 마찬가지로, @property 데코레이터를 사용하여 age 프로퍼티를 정의하면, age 프로퍼티를 사용하는 외부에서는 age() 메서드를 호출하는 것과 같은 효과를 볼 수 있습니다.
@property.setter 데코레이터를 사용하여 name 프로퍼티와 age 프로퍼티에 대한 setter 메서드를 정의할 수 있습니다. 이러한 setter 메서드를 정의하면, name 프로퍼티와 age 프로퍼티에 값을 할당할 때, 메서드를 호출하는 것과 같은 효과를 볼 수 있습니다.
이렇게 까지 하면 사실 뭐가 그렇게 중요한가
파이썬에서는 어차피 다 눈가리고 아웅하기 아니냐? (과거의 내 생각)
할 수 있겠지만 밑에 예제를 살펴보시면 필요성을 조금이나마 이해하실 수 있습니다.
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def name(self):
return self._name
@name.setter
def name(self, name):
self._name = name
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if age > 20 or age < 100:
raise ValueError("age must be between 20 and 100")
self._age = age
위 코드에서 age 프로퍼티에 대한 setter 메서드에서, age 값이 20 이상이거나 100 이하인 경우 ValueError를 발생시켜서 값을 설정하지 못하도록 합니다. 이렇게 하면, 외부에서 age 속성에 대한 값을 할당할 때, 20 이상 100 이하의 값만 할당할 수 있도록 제한할 수 있습니다.