삽질인가 고찰인가

Python 클래스 메서드, 클래스 속성, 정적 메서드. 개념 구분/용도/주의사항. 언제 어떻게 쓸까?

우당탕 오리의 개발모험 2024. 8. 8. 14:26

 

Java만 하던 Python 초보자의 눈으로 작성한 글입니다.

기능 개발 중 필요한 내용이 있어서 책 내용 기반으로 정리 & 개인 생각을 작성한 내용입니다.

참고하세요.

 

클래스 메서드

메서드에 @classmethod 데코레이터를 붙여 선언한다.

클래스.메서드()로 직접 접근할 수 있다.

객체.메서드()로도 접근 가능하다.

기본 파라미터 self를 받지 않는다. 대신 cls로 class 자체를 받는다.(필수)

하위 클래스가 부모 클래스의 클래스 메서드를 상속받을 수 있다. 그리고 메서드 오버라이드도 할 수 있다.

일반적 용도: 객체생성메서드 용도로 사용된다.

주의사항

1. 필수 파라미터 cls를 사용하지 않는다면, 굳이 클래스 메서드를 사용할 필요 없는 로직이다. 다시 한 번 생각해 봐야 한다.

2. 상속관계 특성 때문에 클래스 메서드 내에서 객체생성 시 클래스명()으로 생성하지 말고, 파라미터 cls()로 호출해야 상속관계에서 예상한대로 작동한다.
(하위 클래스에서 부모 클래스의 클래스 메서드를 호출했을 때 하위클래스의 객체 생성자가 아닌, 부모클래스의 생성자 메서드가 실행되기 때문)

class MyClass:
    class_variable = 0

    def __init__(self, value):
        self.instance_variable = value

    # 클래스 메서드 선언
    @classmethod
    def increment_class_variable(cls):
        cls.class_variable += 1

# 인스턴스 생성
obj1 = MyClass(10)
obj2 = MyClass(20)

# 클래스 메서드 호출
MyClass.increment_class_variable()
print(MyClass.class_variable)  # 출력: 1

 

클래스 속성

클래스 내 & 메서드 밖에 선언한 변수.

객체든, 클래스든 접근 가능하다.

서로 다른 객체끼리 공유할 수 있는 '공유자원'이다.

주의사항

1. 클래스 속성은 거의 사용되지 않는다. 그대신 '전역 변수'를 사용하는게 간단하다.

2. ? 전역 변수와 차이점은 뭔가?

class MyClass:
    class_variable = 42

# 클래스 속성 접근
print(MyClass.class_variable)  # 출력: 42

 

전역 변수? 클래스 속성과 차이점은?

# ChatGPT 답변 참고
파이썬에서 전역 변수(global variable)는 함수나 클래스 내부가 아닌 모듈의 최상위 수준에서 정의된 변수를 의미합니다. 전역 변수는 모듈 내 어디에서든 접근할 수 있으며, 모듈 전체에서 동일한 값을 유지합니다.

 

즉, 클래스 속성과 전역 변수의 차이점: 클래스 외부에 선언하면 '전역 변수'. 클래스 내부에 선하면 '클래스 속성'

 

정적 메서드

Static Method

메서드에 @staticmethod 데코레이터를 붙여 선언한다.

그냥 함수와 동일하다.

파이썬에서는 정적 메서드를 사용할 일이 거의 없다. 명목상(?) 있을 뿐. 필요하다면 '함수'를 먼저 고려해라.

주의사항

1. 클래스 메서드, 클래스 속성에 접근할 수 없다.

class MyClass:
    @staticmethod
    def static_method():
        print("This is a static method.")

# 정적 메서드 호출
MyClass.static_method()  # 출력: This is a static method.

 

책에서는

이 3가지 항목을 파이썬에서 거의 필요도 없고, '대신 함수나 전역 변수를 사용해라'라고 권고하고 있다.

 

그럴법하다.

함수나 전역 변수로 충분히 구현가능할 것이기 때문이다.

 

또 "파이썬은 자바가 아니다"라고 한다.

공감한다.

 

그럼에도 개인적으로 아래의 용도에서 사용하기엔 좋을 듯 하다.

 

용도

1. 클래스 메서드는 앞서 본 것 처럼 특정 로직이 들어간 '객체 생성 메서드' 용도로 좋을 것 같다.

2. Util 코드를 작성할 때 이다.

 

1번은 책에 나온 내용이고, 2번은 개인적인 의견이니 2번에 대해 좀 더 작성해보겠다.

 

예를들면 '날짜시간'과 관련된 공통 유틸, '파일 읽고 쓰기'와 관련된 공통 유틸을 만들고 싶을 때를 가정해보자.

 

만약, 클래스 없이 함수나 전역변수를 사용하면 함수명으로만 '날짜시간'과 관련된 유틸인지, '파일'과 관련된 유틸인지 구분해줘야한다.

 

하지만, TimedateUtils 이라는 명칭의 클래스, FileUtils 라는 명칭의 클래스로 관련 기능들을 묶어놓으면 사용하기 쉽다.

 

즉, Util 코드를 용도별로 구분하는 용도로는 충분이 사용해봄직 하다고 생각한다.

 

 

[책]

 

클린 코드, 이제는 파이썬이다 | 알 스웨이가트 - 교보문고

클린 코드, 이제는 파이썬이다 | 가독성 높으며 유지 보수와 기능 확장이 쉬운 파이썬 코드를 원하는가? 기초적인 파이썬 프로그래밍 문법이나 튜토리얼을 끝냈다면, 유능하고 자신감 넘치는 소

product.kyobobook.co.kr