자료실/파이썬(Python)

파이썬(Python) - 클래스 _ 변수의 종류 및 접근권한

자료수집중 2020. 7. 14.
반응형

이번에는 클래스 내부의 변수에 대해 알아보겠습니다.

바로 멤버 변수(또는 클래스 변수)와 인스턴스 변수입니다.

예제를 통해서 살펴보겠습니다.

class Person:
    count = 0   # 멤버 변수

    def __init__(self, name, age, count=None):
        self.name = name  # 인스턴스 변수
        self.age = age
        Person.count += 1

    def show(self):
        print("이름 : ", self.name)
        print("나이 : ", self.age)
        print("등록된 사람 수 : ", Person.count)


a = Person("홍길동", 10)
b = Person("철수", 12)
c = Person("영희", 14)
d = Person("홍길동", 13)

a.show()
b.show()
c.show()
d.show()

class Person의 인스턴스를 4개 생성했습니다. 각각 이름 나이를 다르게 초기값으로 넘겨줬습니다.

그리고 인스턴스를 생성할 때마다 멤버 변수 count를 1씩 추가해서 몇 명의 사람의 정보가 왔는지 확인하겠습니다.

여기서 중요한 건 __init__가 객체를 초기화시켜준다고 앞에서 말했었습니다.

하지만 결과를 보면 count는 초기화되지 않고 값을 계속 가지고 있는걸 볼 수 있습니다.

 멤버 변수는 같은 클래스의 인스턴스들과 값을 공유합니다. 그래서 초기화 되지 않습니다.

클래스 내부에서 사용하기 위해서는 클래스 이름. 변수명으로 사용할 수 있습니다.

인스턴스 변수는 인스턴스 각각이 값을 가지는 변수입니다.

클래스 내부에서 사용하기 위해서는 self.변수명으로 사용할 수 있습니다.

 

 

멤버 변수에 접근하는 방법은 인스턴스 또는 클래스로 직접 접근이 가능합니다.

print(a.count)
print(Person.count)

하지만 인스턴스 변수는 인스턴스로만 접근이 가능합니다.

print(a.name)

 

 

이번에는 접근 권한에 대해 알아보겠습니다.

클래스 내부에 변수 또는 함수라도 사용자가 접근하지 못하게 해야 하는 상황이 있습니다.

다른 언어는 보통 public, private, protected라고 합니다.

파이썬도 접근 권한을 지정해 줄 수 있습니다.

일반적으로 멤버 변수 또는 메서드를 선언하면 접근 권한이 public상태입니다. 누구든지 사용할 수 있는 상태라는 의미입니다.

다시 한번 예제로 살펴보겠습니다.

class Person:
    count = 0   # 멤버 변수

count는 public상태입니다. 그래서 위의 예제처럼 접근이 가능하고 외부에서 변경도 가능합니다.

 

 

private로 선언된 변수 또는 함수는 자신의 클래스 내에서만 사용이 가능합니다.

private로 선언하는 방법 변수명 또는 함수명 앞에 __(언더바2개)를 붙여주면 됩니다.

단 변수명 또는 함수명 뒷부분에 __(언더바2개)가 다시 나오면 public으로 인식됩니다. 앞에만 붙여야 합니다.

다음 예제를 그대로 실행하게 되면

class Person:
    __count = 0   # 멤버 변수

    def __init__(self, name, age, count=None):
        self.__name = name  # 인스턴스 변수
        self.__age = age
        Person.__count += 1

    def __show(self):
        print("이름 : ", self.__name)
        print("나이 : ", self.__age)
        print("등록된 사람 수 : ", Person.__count)


a = Person("홍길동", 10)
a.__show
print(a.__name)
print(a.__count)

해당 속성이 존재하지 않는다는 에러가 발생합니다.

클래스 내에서는 일반 변수나 함수처럼 사용할 수 있지만 외부에서는 접근이 불가능 해집니다.

*파이썬은 private라 비유했지만 접근하는 방법은 있습니다. 파이썬은 다른 언어의 private처럼 완벽하게 차단하는게 아닌 일종의 경로를 복잡하게 한다는게 정확한 의미인 거 같습니다.

_클래스명+private선언한변수명을 이용하면 접근은 가능합니다.

ex)a._Person__count

 

 

protected는 외부에서는 접근이 불가능 하지만 상속받은 자식 클래스는 사용이 가능합니다.

protected로 선언하는 방법 변수명 또는 함수명 앞에 _(언더바1개)를 붙여주면 됩니다.

 

 

 

 

댓글