티스토리 뷰

2. 클래스를 구성하는 변수와 함수

 

 


클래스에서 사용하는 변수

 

클래스에서 사용하는 변수는 위치에 따라 클래스 변수와 인스턴스 변수로 구분한다. 클래스 변수는 클래스 내에 있지만 함수 밖에서 '변수명 = 데이터' 형식으로 정의한 변수로서 클래스에서 생성한 모든 객체가 공통으로 사용할 수 있다. 클래스 변수는 '클래스명.변수명' 형식으로 접근할 수 있다. 반면 인스턴스 변수는 클래스 내의 함수 안에서 'self.변수명 = 데이터' 형식으로 정의한 변수로서 클래스 내의 모든 함수에서 'self.변수명'으로 접근할 수 있다. 인스턴스 변수는 각 인스턴스(객체)에서 개별적으로 관리하며, 객체를 생성한 후에 '객체명.변수명' 형식으로 접근할 수 있다. 만약 인스턴스 변수가 정의돼 있지 않고 클래스 변수만 정의돼 있을 때 객체를 생성한 후 '객체명. 변수명'으로 접근하면 클래스 변수에 접근한다. 예제를 살펴보자.

 

 In:

 

 

 

 

 

 

 

 

 

 

class Car( ):

    instance_count = 0 # 클래스 변수 생성 및 초기화

 

    def __init__(self, size, color):

        self.size = size # 인스턴스 변수 생성 및 초기화

        self.color = color # 인스턴스 변수 생성 및 초기화

        Car.instance_count = Car.instance_count + 1 # 클래스 변수 이용

        print("자동차 객체의 수: {0}".format(Car.instance_count))

 

    def move(self):

        print("자동차({0} & {1})가 움직인다.".format(self.size, self.color))

위에서 클래스 변수인 instance_count를 초기화 함수 __init__( )에서 Car.instance_count의 형식으로 이용했다.  위와 같이 선언한 클래스를 이용해 클래스 변수와 인스턴스 변수를 각각 어떻게 사용하는지 알아보자.

 

먼저 두 객체(car1과 car2)를 생성하겠다.

 

 In:

 

car1 = Car('small', 'white')

car2 = Car('big', 'black')

 Out:

 

자동차 객체의 수: 1

자동차 객체의 수: 2

클래스 Car를 이용해 객체 car1과 car2를 생성했다. 출력된 결과를 보면 객체를 생성할 때마다 클래스 변수 instance_count가 1식 증가해서 Car클래스의 객체가 몇 개 생성됐는지 알 수 있다. 클래스 변수는 다음과 같이 '클래스명.변수명' 형식으로 언제든지 호출할 수 있다.

 

 In:

print("Car 클래스의 총 인스턴스 개수:{}".format(Car.instance_count))

 Out:

Car 클래스의 총 인스턴스 개수:2

클래스 변수도 객체를 생성한 후 '객체명.변수명' 형식으로 접근할 수 있다.

 

 In:

 

print("Car 클래스의 총 인스턴스 개수:{}".format(car1.instance_count))

print("Car 클래스의 총 인스턴스 개수:{}".format(car2.instance_count))

 Out:

 

Car 클래스의 총 인스턴스 개수:2

Car 클래스의 총 인스턴스 개수:2

출력 결과를 보면 car1과 car2 객체에서 사용한 클래스 변수 instance_count는 값이 같은 것을 볼 수 있다. 이는 모든 객체에서 클래스 변수가 공통으로 사용되기 때문이다.

 

다음으로는 인스턴스 변수가 어떻게 동작하는지 살펴보기 위해 생성된 객체의 메서드를 실행해 보자.

 

 In:

 

car1.move()

car2.move()

 Out:

 

자동차(small & white)가 움직입니다.

자동차(big & black)가 움직입니다.

출력 결과에서 볼 수 있듯이 인스턴스 변수(여기서는 self.size와 self.color)는 각 개체에서 별도로 관리된다.

 

다음으로 이름이 같은 클래스 변수와 인스턴스 변수가 있는 클래스를 정의해서 객체에서 각 변수가 어떻게 동작하는지 살펴보자.

 

 In:

 

 

 

 

 

 

 

 

 

 

class Car2( ):

    count = 0; # 클래스 변수 생성 및 초기화

 

    def __init__(self, size, num):

        self.size = size # 인스턴스 변수 생성 및 초기화

        self.count = num #인스턴스 변수 생성 및 초기화

        car2.count = car2.count + 1 # 클래스 변수 이용

        print("자동차 객체의 수: Car2.count = {0}".format(Car2.count))

        peinr("인스턴스 변수 초기화: self.count = {0}".format(self.count))

 

    def move(self):

        print("자동차({0} & {1}) 가 움직입니다.".format(self.size, self.count))

클래스의 초기화 함수 __init__( )에서 클래스 변수 count(함수 내에서 Car2.count)와 인스턴스 변수 count(함수 내에서 self.count)를 이용했다. 변수 이름은 같지만 이 둘은 별개로 동작한다. 이제 객체를 생성해서 각 객체에서 두 변수가 어떻게 동작하는지 확인해 보자.

 

 In:

 

car1 = Car2("big", 20)

car1 = Car2("small", 30)

 Out:

 

 

 

자동차 객체의 수: Car2.count = 1

인스턴스 변수 초기화: self.count = 20

자동차 객체의 수: Car2.count = 2

인스턴스 변수 초기화: self.count = 30

 

 

클래스에서 사용하는 함수

 

클래스에서 정의할 수 있는 함수(메서드)에는 그 기능과 사용법에 따라 인스턴스 메서드, 정적 메서드, 클래스 메서드가 있다.

 

 

①인스턴스 메서드

 

인스턴스 메서드는 각 객체에서 개별적으로 동작하는 함수를 만들고자 할 때 사용하는 함수로서 이미 앞에서 살펴본 함수이다. 인스턴스 메서드는 함수를 정의할 때 첫 인자로 self가 필요하다. self는 클래스의 인스턴스(객체) 자신을 가리킨다. 인스턴스 메서드에서는 self를 이용해 인스턴스 변수를 만들고 사용한다. 또한 인스턴스 메서드 안에서는 'self.함수명( )' 형식으로 클래스 내의 다른 함수를 호출할 수 있다.

 

인스턴스 메서드의 구조를 보면

 

class 클래스명( ):

     def 함수명(self[, 인자1, 인자2, . . . , 인자[n]):

        self.변수명1 = 인자1

        self.변수명2 = 인자2

        self.변수명3 = 데이터

        . . .

        <코드 블록>

인스턴스 메서드는 다음과 같이 객체를 생성한 후에 호출할 수 있다.

 

객체명 = 클래스명( )

객체명.메서드명([인자1, 인자2, . . . , 인자n]) 

다음은 인스턴스 메서드를 사용한 예이다. 클래스내의 함수 __init__( ), move( ), auto_cruise( )는 인스턴스 메서드이다.

 

 In:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

# Car 클래스 선언

class Car( ):

    instance_count = 0 # 클래스 변수 생성 및 초기화

 

    # 초기화 함수(인스턴스 메서드)

    def __init__(self, size, color):

        self.size = size # 인스턴스 변수 생성 및 초기화

        self.color = color # 인스턴스 변수 생성 및 초기화

        Car.instance_count = Car.instance_count + 1 # 클래스 변수 이용

        print("자동차 객체의 수: {0}".format(Car.instance_count))

 

    # 인스턴스 메서드

    def move(self, speed):

        self.speed = speed # 인스턴스 변수 생성

        print("자동차({0} & {1})가 ".format(self.size, self.color), end=' ')

        print("시속 {0}킬로미터로 전진".format(self.speed))

 

    # 인스턴스 메서드

    def auto_cruise(self):

        print("자율 주행 모드")

        self.move(self.speed) # move( ) 함수의 인자로 인스턴스 변수를 입력

예제 코드에서 함수 auto_cruise( )는 'self.함수명( )'을 이용해 인스턴스 메서드(move())를 호출했다. 클래스 내의 함수에서 인스턴스 메서드를 호출할 때는 인자에 self는 전달하지 않습니다. 이제 인스턴스 메서드를 실행하기 위해 객체를 생성하고 move( )와 auto_cruise( ) 메서드를 호출하겠다.

 

 In:

 

 

 

 

 

 

 

 

car1 = Car("small", "red") # 객체 생성 (car1)

car2 = Car("big", "green") # 객체 생성 (car2)

 

car1.move(80) # 객체(car1)의 move( ) 메서드 호출

car2.move(100) # 객체(car2)의 move( ) 메서드 호출

 

car1.auto_cruise( ) #객체(car1)의 auto_cruise( ) 메서드 호출

car2.auto_cruise( ) #객체(car2)의 auto_cruise( ) 메서드 호출

 Out:

 

 

 

 

 

 

 

자동차 객체의 수: 1

자동차 객체의 수: 2

자동차(small & red)가 시속 80킬로미터로 전진

자동차(big & green)가 시속 100킬로미터로 전진

자율 주행 모드

자동차(small & red)가 시속 80킬로미터로 전진

자율 주행 모드

자동차(big & green)가 시속 100킬로미터로 전진

출력 결과에서 볼 수 있듯이 인스턴스 메서드인 move( )와 auto_cruise( )는 두 개의 객체(car1, ccar2)에서 개별적으로 동작한다.

 

 

②정적 메서드

 

정적 메서드는 클래스와 관련이 있어서 클래스 안에 두기는 하지만 클래스나 클래스의 인스턴스(객체)와는 무관하게 독립적으로 동작하는 함수를 만들고 싶을 때 이용하는 함수이다. 함수를 정의할 때 인자로 self를 사용하지 않으며 정적 메서드 안에서는 클래스나 클래스 변수에 접근할 수 없다. 함수 앞에 데코레이터(Decorator)인 @staticmethod를 선언해 정적 메서드임을 표시한다.

 

정적 메서드의 구조는 다음과 같다.

 

class 클래스명( ):

    @staticmethod

    def 함수명([인자1, 인자2, . . . , 인자n]):

        <코드 블록> 

객체를 생성한 후에 정적 메서드를 호출할 수도 있지만 정적 메서드는 보통 다음과 같이 객체를 생성하지 않고 클래스명을 이용해 바로 메서드를 호출한다.

 

클래스명. 메서드명([인자1, 인자2, . . . ,인자n]): 

정적 메서드는 날짜 및 시간 정보 제공, 환율 정보 제공, 단위 변환과 같이 객체와 관계없이 독립적으로 동작하는 함수를 만들 때 주로 이용합니다. 다음은 정적 메서드를 사용한 예로, 앞에서 만든 Car( ) 클래스에 정적 메서드인 check_type( )을 추가하였다.

 

 In:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

# Car 클래스 선언

class Car( ):

 

    # def __init__ (self, size, color): => 앞의 코드 활용

    # def move(self, speed): => 앞의 코드 활용

    # def auto_cruise(self): => 앞의 코드 활용

 

    # 정적 메서드

    @staticmethod

    def check_type(model_cod):

        if(model_code >= 20):

            print("이 자동차는 전기차입니다.")

        elif(10 <= model_code < 20):

            print("이 자동차는 가솔린차입니다.")

        else:

            print("이 자동차는 디젤차입니다.")

정적 메서드 check_type( )을 살펴보면 self 인자 없이 일반 함수처럼 필요한 인자만 사용한다. 이제 '클래스명.정적메서드명( )' 형식으로 정적 메서드를 호출하겠다.

 

 In:

 

Car.check_type(25)

Car.check_type(2)

 Out:

 

이 자동차는 전기차입니다.

이 자동차는 디젤차입니다.

 

 

③클래스 메서드

 

클래스 메서드는 클래스 변수를 사용하기 위한 함수이다. 클래스 메서드는 함수를 정의할 때 첫 번째 인자로 클래스를 넘겨받는 cls가 필요하며 이를 이용해 클래스 변수에 접근해야 한다. 클래스 메서드를 사용하기 위해서는 함수 앞에 데코레이터인 @classmethod를 지정해야 한다.

 

클래스 메서드의 구조는 다음과 같다.

 

class 클래스명( ):

    @classmethod

    def 함수명(cls[, 인자1, 인자2, . . . , 인자n]):

        <코드 블록> 

클래스 메서드도 객체를 생성하지 않고 다음과 같이 클래스명을 이용해 바로 호출한다.

 

클래스명.메서드명([인자1, 인자2, . . . , 인자n]): 

클래스 메서드는 생성된 객체의 개수를 반환하는 등 클래스 전체에서 관리해야 할 기능이 있을 때 주로 이용한다.

 

다음은 클래스 메서드를 사용한 예로, Car( ) 클래스에 클래스 메서드인 count_instance( )를 추가하였다.

 

 In:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

# Car 클래스 선언

class Car( ):

    instance_ count = 0 # 클래스 변수

 

    # 초기화 함수(인스턴스 메서드)

    def __init__(self, size, color):

        self.size = size    # 인스턴스 변수

        self.color = color # 인스턴스 변수

        Car.instance_count = Car.instance_count + 1

 

    # def move(self, speed): => 앞의 코드 활용

    # def auto_cruise(self): => 앞의 코드 활용

    # @staticmethod

    # def check_type(model_code): => 앞의 코드 활용

 

    #클래스 메서드

    @classmethod

    def count_instance(cls):

        print("자동차 객체의 개수: {0}".format(cls.instance_count))

클래스 변수 instance_count는 초기화 함수 __init( )__에서 1씩 증가하므로 객체가 생성될 때마다 값이 1씩 증가한다. 따라서 클래스 변수 instance_count를 출력하는 클래스 메서드 count_instance( )를 호출하면 현재까지 생성된 객체의 개수를 알 수 있다. 다음은 '클래스명.클래스메서드명( )' 형식으로 클래스 메서드를 호출하는 예이다.

 

 In:

 

 

 

 

 

 

 

Car.count_instance( )        # 객체 생성 전에 클래스 메서드 호출

 

car1 = Car("small", "red")  # 첫 번째 객체 생성

Car.count_instance( )        # 클래스 메서드 호출

 

car2 = Car("big", "green") # 두 번째 객체 생성

Car.count_instance( )        # 클래스 메서드 호출

 Out:

 

 

 

자동차 객체의 개수: 0

자동차 객체의 개수: 1

자동차 객체의 개수: 2

결과를 보면 객체를 생성할 때마다 클래스 변수 instance_count의 값이 1씩 증가하는 것을 볼 수 있다.

 

 

 

 

출처: 파이썬 철저 입문

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함