[Python] 클래스 프로퍼티 (Property)


Study/Python  2019. 12. 19. 09:00

안녕하세요. 명월입니다.


이 글은 Python에서의 클래스 프로퍼티에 관한 글입니다.


먼저 프로퍼티란 외부에서 클래스 내부 변수를 참조하기 위한 함수를 뜻합니다.

흔히 getter, setter라고도 이야기합니다.


class를 만들 때 내부 변수를 public으로 만들 수 있습니다만, oop의 캡슐화에 의해 class의 변수를 직접 참조하는 건 옳지 않습니다. 직접 참조하게 되면 클래스의 변수를 관리하기도 힘들어 집니다.

변수를 다 오픈할 꺼면 굳이 클래스를 만드는 이유가?

class Main():
  def __init__(self):
    self.data1 = "good";
    # 변수명 앞에 언더바(_) 두개를 붙이면 private 설정이 됩니다.
    self.__data2 = "morning";
    
a = Main();
# data1은 public으로 참조가 가능하다.
print(a.data1);
# data2는 private으로 참조가 불가능하다.
print(a.__data2);

위의 예에서 클래스 내부의 private 변수의 값을 가져오거나 설정을 해야 할 때가 있습니다. 그럴 때 함수를 사용해서 가져오거나 설정하면 됩니다.

class Main():
  def __init__(self):
    self.__data = "good";
  # data변수 값을 외부에서 받기 위한 getter.
  def get_data(self):
    return self.__data;
  # data변수를 외부에서 설정하기 위한 setter
  def set_data(self, data):
    self.__data = data;
a = Main();
print(a.get_data());

위처럼 getter, setter를 만들어도 python 표준 코딩에 크게 틀린 것은 아닙니다. 사실 java의 경우도 위처럼 getter, setter를 작성합니다.

C#은 이 프로퍼티 설정이 많이 편합니다.


python은 조금 다르게 getter, setter를 만들 수 있습니다.

class Main():
  def __init__(self):
    self.__data = "good";
  # getter
  @property
  def data(self):
    return self.__data;
  # property 이름.setter
  @data.setter
  def data(self,data):
    self.__data = data;
a = Main();
# getter를 통해 데이터를 받는다.
print(a.data);
# setter를 통해 데이터를 입력한다.
a.data = "hello";
# getter를 통해 데이터를 받는다.
print(a.data);

Python에서의 프로퍼티는 주의점이 setter만 만들 수는 없습니다. @property 이름.setter인데 프로퍼티가 없으면 에러가 발생합니다.

class Main():
  def __init__(self):
    self.__data = "good";
  @data.setter
  def data(self,data):
    self.__data = data;
a = Main();
a.data = "hello";

그러나 getter만은 선언이 가능합니다. getter만 사용하면 읽기 전용 변수가 되겠네요.

class Main():
  def __init__(self):
    self.__data = 0;
  @property
  def data(self):
    # 호출할 때마다 1씩 증가하는 카운팅을 만들었다.
    self.__data = self.__data + 1;
    return self.__data;
    
a = Main();
print(a.data);
print(a.data);
print(a.data);
print(a.data);

# setter가 없으므로 에러가 발생한다.
a.data = 10;

1씩 증가하는 값을 출력하네요. 10을 넣으려고 하니 set이 없다고 에러가 발생합니다.


좀 설명이 getter, setter를 왜 만들어야 하는 지 설명이 부족한 감이 있어서 자세히 설명하겠습니다.

이 getter, setter 개념은 oop의 개념 중의 캡슐화와 관계가 있습니다.


캡슐화는 class에 특성, 의미을 부여해서 하나의 오브젝트화를 만든느 것을 뜻합니다.

예를 들면, 우리가 어떤 일에 대한 프로시져 또는 모듈을 사용한다고 하면 그 모듈의 입력과 출력만 생각해야지 그 내부가 어떻게 돌아가는지 전부 생각할 필요가 없습니다.

다른 예로, excel를 만드는 라이브러리를 가져와 사용한다고 할 때 우리는 excel에 필요한 입력 값만 넣고 export를 하게 되면 excel이 나오면 되지 그 내부가 어떻게 돌아가는 생각할 필요는 없습니다.


그러기 위해서는 절처하게 클래스 내부에서 사용되는 변수는 보호할 필요가 있습니다. 외부에서 변수를 마음대로 조작이 된다면 class가 정해놓은 로직대로 돌아가지 않고 에러가 날 가능성이 높습니다.

그렇기 때문에 oop에서는 캡슐화를 정해 놓고 내부에서 사용되는 변수와 함수와 외부에서 사용되는 함수를 철저하게 구분해 놓습니다. 다른 언어에서는 private와 public 키워드가 있습니다.


그냥 프로퍼티의 설명만 보면 프로퍼티는 의미가 없어보이지만(그냥 변수 public하면 되잖아?), 사실 oop에서는 매우 중요한 변수 관리 문법입니다.


여기까지 Python에서의 클래스 프로퍼티에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.