본문 바로가기
프로그래밍/python

python @classmethod? @staticmethod?

by W.C. 2024. 12. 28.
728x90

클래스 변수

클래스 정의에서 메서드(method)밖에 존재하는 변수

→ 해당 클래스를 사용하는 모두에게 공용으로 사용된다.

→ 일반적으로 ‘클래스명.변수명’ 으로 엑세스 할 수 있다.

class Calc:
	result = 0

	def __init__(self, num1, num2):
		self.num1 = num1
		self.num2 = num2
		Calc.result = -100

인스턴스 변수

하나의 클래스로부터 여러 객체 인스턴스를 생성해서 사용할수 있다. 클래스 변수는 클래스에 하나 생성해야 하지만 인스턴스 변수는 각 객체 인스터스마다 별도 존재하다.

‘self.변수명’형식으로 사용한다.

Python 코딩 관례(Convention)상 내부적으로만 사용하는 변수 혹은 메서드는 그 이름 앞에 하나의 밑줄(_) 을 붙인다. 하지만 이는 코딩 관례에 따른 것일 뿐 실제 밑줄 하나를 사용한 멤버도 public 이므로 필요하면 외부에서 엑세스할 수 있다.

만약 특정 변수명이나 메서드를 private으로 만들어야 한다면 두개의 밑줄(__)을 이름 앞에 붙이면 된다

def __init__(self, num1, num2):
	self.num1 = num1
	self.num2 = num2

	self.__sum_result = num1 + num2

def __interalRun(self):
	# private 메서드 class 내에서만 사용가능하다
	# __ 는 기존 사용하고 있는 내부 매서드들이 있으니 해당 매서드이름을 잘 파악하고 사용해야 한다
	pass

클래스 메서드

메서드 앞에 @classmethod 라는 Decorator를 표시하여 해당 메서드가 클래스 매서드임을 표시

객체 인스턴스를 의미하는 self대신 cls라는 클래스를 의미하는 파라미터를 전달 받는다.

클래스 변수를 액세스할 필요가 있을 때 사용

정적 메서드

메서드 앞에 @staticmethod 라는 Decorator를 표시하여 해당 메서드가 정적 메서드임을 표시

self 파라미터를 가지지 않는다 실제로는 클래스내에 객체 필드와 독립적이지만 class 로직상 해당메서드가 사용되어 질때 쓴다.

class Rectangle:
    count = 0  # 클래스 변수
 
    def __init__(self, width, height):
        self.width = width
        self.height = height
        Rectangle.count += 1
 
    # 인스턴스 메서드
    def calcArea(self):
        area = self.width * self.height
        return area
 
    # 정적 메서드
    @staticmethod
    def isSquare(rectWidth, rectHeight):
        return rectWidth == rectHeight   
 
    # 클래스 메서드
    @classmethod
    def printCount(cls):
        print(cls.count)   
 
 
# 테스트
square = Rectangle.isSquare(5, 5)        
print(square)   # True        
 
rect1 = Rectangle(5, 5)
rect2 = Rectangle(2, 5)
rect1.printCount()  # 2