코드잇 스프린트/파이썬

클래스 변수와 클래스 메소드

JOHAWK 2024. 7. 30. 21:30

파이썬 클래스 변수와 클래스 메소드에 대해 알아보겠습니다.

클래스 변수와 메소드

목차

1. 클래스 변수

2. 클래스 메소드

 

1. 클래스 변수

클래스에 속하는 모든 인스턴스가 공유하는 변수를 클래스 변수라 한다.

 

클래스 변수의 특징은 클래스로부터 직접 호출받아야 작동할 수 있다는 것이다.

 

클래스를 교실이라고 비유하면 클래스 변수는 학생들이 볼 수 있는 게시판으로 모든 학생(인스턴스)이 같은 게시판(클래스 변수)을 사용해 정보를 보고 공유한다.

 

위 비유를 코드로 표현하면 다음과 같다.

class School:
    student_count = 0  # 클래스 변수 -> 모든 학생이 공유함. 학생 수를 카운트

    def __init__(self, name):
        self.name = name
        School.student_count += 1  # 클래스(School.)로부터 직접 호출한다. 학생이 추가될 때마다 1씩 증가.

# 학생 인스턴스 생성
student1 = School("Alice")
student2 = School("Bob")

print(School.student_count)

클래스 변수는 인스턴스 변수가 아니기 때문에 클래스로부터 직접 호출을 받는다(School.student_count).

Alice와 Bob이 School 클래스에 추가되어 2명이 되었고, 클래스 변수인 student_count는 2가 되었다.

student_count는 student1과 student2 모두 사용할 수 있다.


2. 클래스 메소드

클래스 자체에서 작업을 수행하는 메소드를 클래스 메소드라고 한다.

 

이 메서드는 클래스 변수에 접근하거나 수정할 수 있으며, 클래스  이름을 통해 호출된다. 

 

클래스가 학교, 클래스 변수가 교실 게시판이라면, 클래스 메소드는 교장 선생님이라고 할 수 있다.

 

교장 선생님은 학교의 모든 것을 알고 있고 그 정보를 활용해 학교와 관련된 작업을 지시하는 것처럼 클래스 메소드는 인스턴스와 클래스의 정보를 활용할 수 있다.

 

클래스 메소드는 정적 메소드처럼 정의하고자 하는 클래스 메소드 위에 @classmethod를 표기해야 한다.

인스턴스 메소드는 첫번째 인자로 self를 받지만 클래스 메소드는 cls(class의 약자)를 첫번째 인자로 받는다.

cls의 역할은 인스턴스 메소드의 self와 동일하다.

 

class School:
    student_count = 0  # 클래스 변수, 모든 학생이 공유함

    def __init__(self, name):
        self.name = name
        School.student_count += 1

    @classmethod  # 클래스 메소드를 사용하기 위해 @classmethod를 꼭 써야한다.
    def get_student_count(cls):   # 첫 번째 인자로 'cls'를 받음 인스턴스에서 self와 같은 개념
        return cls.student_count  # 클래스 변수에 접근

# 학생 인스턴스 생성
student1 = School("Alice")
student2 = School("Bob")

print(School.get_student_count())

클래스 변수인 School.student_count의 출력값과 클래스 메소드로 만든 get_student_count의 출력값은 2로 같다.

출력값이 같으면 굳이 클래스 메소드를 만들 필요가 없나? 라고 생각할 수 있다. 하지만 상황에 따라 클래스 메소드를 사용하는 것이 더 나을 때가 있다.

 

 1) 단순히 값만 읽을 때: 클래스 변수를 통해 직접 접근

 2) 데이터 접근을 통제하고 싶을 때: 클래스 메소드를 통해 데이터를 읽으면 클래스의 내부 구조를 감추고, 필요에 따라 데이터를 가공할 수 있음.

 

클래스 메소드는 인스턴스 변수를 받을 수 없어 인스턴스의 속성 값을 찾고 싶으면 인스턴스 변수를 대체할 수 있는 인자를 넣어야 하는 경우가 있다.

class School:
    student_count = 0  # 클래스 변수, 각 공장이 차를 생산할 때마다 이 변수가 증가

    def __init__(self, class_name):  # 학급(class_name) 인스턴스
        self.class_name = class_name
        self.class_member = 0  # 학급 인원 수

    def make_friend(self):
        self.class_member += 1  # 학급 인스턴스의 학급 인원 수가 증가
        School.student_count += 1  #학교 변수인 학생 수가 증가

    @classmethod   # 특정 학급 인스턴스에 속하지 않고, School과 관련된 공통 작업만을 수행
    def get_total_student_count(cls):  # 클래스 메소드는 cls를 통해 클래스 변수(student_count)에 접근
        return cls.student_count # 전체 클래스의 학생 수 반환

    @classmethod  # 특정 학급 리스트의 학생 수 계산
    def from_class_list(cls, class_list):  # 클래스 메소드이기 때문에 인스턴스 변수(class_member)를 인자로 넣을 수 없다.
        total = 0
        for class in class_list:
            total += class.class_member  # for문에서 class는 class_list의 요소. 만약 class_list가 [class1]이라면 class.class_member는 class1.class_member이다.
        return total

# 학급 인스턴스 생성
class1 = School("class1")
class2 = School("class2")

class1.make_friend()
class1.make_friend()
class1.make_friend()
class2.make_friend()
class2.make_friend()

print(School.get_total_student_count())

total_students_from_list = School.from_class_list([school1])
print(total_cars_from_list)

total_students_from_list = School.from_class_list([school1, school2])
print(total_cars_from_list)

 


 

※ 이 포스트는 코드잇스프린트 데이터분석2기 강의를 바탕으로 재구성되었습니다.

 

참고글

정적 메소드 (tistory.com)

 

정적 메소드

파이썬에서 클래스, 인스턴스에 이어 정적 메소드에 대해 알아보겠습니다.정적 메소드 목차 1. 정적 메소드란? 2. 정적 메소드 호출 방법 1. 정적 메소드란?일반적으로 클래스의 메소드를 사용하

johawk.tistory.com

 

 

 

'코드잇 스프린트 > 파이썬' 카테고리의 다른 글

절대경로 vs. 상대경로  (0) 2024.07.31
시간 관련 모듈(datetime, time)  (0) 2024.07.30
정적 메소드  (0) 2024.07.25
클래스와 인스턴스  (0) 2024.07.25
pass, continue, 그리고 break  (0) 2024.07.19