티스토리 뷰
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씩 증가하는 것을 볼 수 있다.
출처: 파이썬 철저 입문
'beginner > 파이썬 분석' 카테고리의 다른 글
문자열과 텍스트 파일 데이터 다루기 ② (0) | 2019.01.15 |
---|---|
문자열과 텍스트 파일 데이터 다루기 ① (0) | 2019.01.14 |
객체와 클래스 ① (0) | 2019.01.14 |
파이썬을 계산기처럼 이용하기 (0) | 2019.01.13 |
[Quest]이중 for문을 이용한 구구단 (0) | 2019.01.11 |