본문 바로가기
Python/Python 기초

[Python] 클래스 | 정적 메소드, private 멤버

by snow_white 2022. 3. 15.

정적 메소드란?

  • 정적 메소드 또는 스태틱 메소드로 혼용
  • 클래스에서 직접 호출할 수 있는 메소드
  • 메소드를 정의할 때 인스턴스 객체를 참조하는 self라는 인자를 선언하지 않음

 

정적 메소드의 특징

클래스 인스턴스에는 적용되지 않는 메소드

클래스.메소드 명으로 호출 가능

 

class MyCalc(object):
    @staticmethod
    def my_add(x,y):
        return x+y  
        
MyCalc.my_add(3,4) # 7

 

private 멤버변수란?

클래스 내부의 멤버 변수 중 숨기고 싶은 변수

 

private 멤버변수 특징

  • 클래스의 내부 변수는 일반적으로 public 속성을 갖기 때문에 외부에서 마음대로 접근하거나 변경 가능
  • 이름 변경
    • 외부에서 접근이 어렵도록 하는 파이썬의 특징
    • 외부에서 클래스 내부의 멤버 변수를 호출할 때, 원래 이름이 아닌 _클래스명__멤버 변수로 변경됨

식별자

키워드는 아니지만 private 멤버 변수로 사용하기 위해, 미리 정해진 용도로 사용하는 문자

식별자
(예약어)
정의 예시
_* 모듈(파일) 안에서 _로 시작하는 식별자를 정의하면 다른 파일에서 접근할 수 없음 _name
__*__ 식별자의 앞뒤에 __가 붙어 있는 식별자는 시스템에서 정의한 이름 __doc__
__* 클래스 안에서 외부로 노출되지 않는 식별자로 인식 __name

 

class BankAccount:
    # private 멤버변수로 선언
    __id=0 
    __name=""
    __balance=0
    
    def __init__ (self, id, name, balance):
        self.__id=id
        self.__name=name
        self.__balance=balance
    def deposit(self, amount):
        self.__balance + amount
    def withdraw(self, amount):
        self.__balance -= amount
    def __str__(self):
        return "{0}, {1}, {2}".format(self.__id, self.__name, self.__balance)
        
# 안스턴스 객체 생성
account1 = BankAccount(100, '전우치', 15000)
account1.withdraw(3000)
print(account1) # 100, 전우치, 12000

# 에러가 발생하는 코드(원래 내부 이름으로 접근하는 코드)
print(account1.__balance) # AttributeError: 'BankAccount' object has no attribute '__balance'
# 옳은 접근 방법
print(account1._BankAccount__balance) # 12000

# 클래스 외부에서는 아래와 같이 접근, private 멤버 변수 접근하기
print(BankAccount._BankAccount__balance) # 0
BankAccount._BankAccount__balance = 35000
print(BankAccount._BankAccount__balance) # 35000

 

'Python > Python 기초' 카테고리의 다른 글

[Python] 파이썬 모듈 사용하기  (0) 2022.03.15
[Python] 상속과 다형성  (0) 2022.03.15
[Python] 클래스 정의와 인스턴스 생성  (0) 2022.03.15
[Python] 함수  (0) 2022.03.12
[Python] 집합 자료형  (0) 2022.03.12

댓글