파이썬에서는 다른 프로그래밍 언어에서도 사용되는 클래스를 사용할 수 있다.
(C언어에는 클래스라는 개념이 없다. 하지만 클래스가 없어도 프로그래밍을 하는 데에는 큰 지장이 없다.)
우선 클래스가 뭔지 설명하기에 앞서 간단한 예제로 클래스를 왜 사용하는지에 대해서 알아보자.
result1 = 0
result2 = 10
result3 = 5
result4 = 9
def add1(var1):
global result1
result1 += var1
print("add1 result = %d" %result1)
def add2(var1):
global result2
result2 += var1
print("add2 result = %d" %result2)
def mul(var1):
global result3
result3 *= var1
print("mul result = %d" %result3)
def div(var1):
global result4
result4 /= var1
print("div result = %d" %result4)
add1(1)
add2(3)
add2(2)
add1(5)
mul(4)
div(3)
################출력 결과################
add1 result = 1
add2 result = 13
add2 result = 15
add1 result = 6
mul result = 20
div result = 3
위의 예제 소스코드를 보면 add1, add2, mul, div 함수에서 연산에 필요한 전역변수가 각각 사용되고 있다.
4개의 함수에서 각각 다른 결괏값을 얻기위해 4개의 전역변수를 사용하였다.
심지어 add1과 add2는 함수 구조는 같은데 다른 결과값을 사용하기 위해 동일한 구조의 함수를 2개나 만들어서 사용하고 있다.
만약 함수가 10개가 되었을 때는 전역변수는 10개가 사용될 것이다. 이건 그다지 효율적이지 못하다.
하지만 만약 여기서 클래스를 사용하게 되면 매우 효율적으로 사용할 수가 있다.
class Calculator:
def __init__(self):
self.result_add = 0
self.result_min = 10
self.result_mul = 5
self.result_div = 9
def add(self, var1):
self.result_add += var1
def min(self, var1):
self.result_min -= var1
def mul(self, var1):
self.result_mul *= var1
def div(self, var1):
self.result_div /= var1
cal1 = Calculator()
cal2 = Calculator()
cal1.add(5)
cal1.min(1)
cal1.mul(3)
cal1.div(9)
cal2.add(9)
cal2.min(7)
print("cal1 result \nadd:%d min:%d mul:%d div:%d\n" %(cal1.result_add, cal1.result_min, cal1.result_mul, cal1.result_div))
print("cal2 result \nadd:%d min:%d mul:%d div:%d" %(cal2.result_add, cal2.result_min, cal2.result_mul, cal2.result_div))
################출력 결과################
cal1 result
add:5 min:9 mul:15 div:1
cal2 result
add:9 min:3 mul:5 div:9
이전에 본 예제코드와 다르게 Calculator라는 class가 선언되었고
Calculator라는 class안에 __init__, add, min, mul, div 함수를 포함해서 5개의 함수가 추가된 것을 확인할 수 있다.
사실 클래스에 안에 선언된 함수는 메서드(method)라고 표현을 한다.
그래서 지금부터는 메서드라고 표현할 것이다.
__init__메서드는 객체가 생성되자마자 수행되는 메서드라고 이해하면 된다.
그리고 cal1과 cal2라는 객체는 각각 Calculator로 선언이 되었다.
반대로 Calculator의 인스턴스는 cal1, cal2이다.
cal1과 cal2는 각각 add, min, mul, div메서드를 호출하였고
그에 따른 결과를 확인했을 때 각 객체에 따라 다른 결과 값을 갖는 것을 확인할 수 있다.
그런데 여기서 하나 이상한 게 있다.
클래스에서 선언된 메서드를 보면 변수를 2개를 받아오게끔 되어있는데
코드상에서 변수를 하나만 입력하였다. 이건 왜 그런 걸까??
Calculator의 add 매서드의 첫 번째 인자 self에는 객체 cal1이 자동으로 전달되고 나머지 인자는 순차적으로 전달된다.
그래서 첫 번째 변수인 self는 입력이 생략되고 나머지 변수만 입력해주면 된다.
추가로 파이썬에서 메서드의 첫번째 변수는 관례적으로 self를 사용하는데 self 말고 다른 것을 사용해도 무방하다.
메서드는 아래 예제처럼 호출을 할 수도 있다.
cal1 = Calculator()
Calculator.add(cal1, 5)
객체 cal1을 선언한 후에, Calculator.add(객체, 변수)와 같은 형식으로 호출해도 무방하다.
이처럼 파이썬에서 클래스를 사용하면 좀 더 유용하게 코딩을 할 수 있다.
그럼 이어서 클래스 변수를 선언하고 사용하는 방법을 알아보자.
클래스를 통해 각각의 객체를 만들면 그 객체 내에서 사용되는 메서드의 변수들은 각 객체들을 따라가게 되어있다.
하지만 클래스 바로 안에 변수를 선언하게 되면 모든 객체들이 global 변수처럼 해당 변수를 공유할 수 있다.
사용 방법은 아래 예제를 참고하자.
class Calculator:
result = 0
def __init__(self):
pass
def add(self, var1):
Calculator.result += var1
def min(self, var1):
Calculator.result -= var1
cal1 = Calculator()
cal2 = Calculator()
cal1.add(5)
print("result: %d" %cal1.result)
cal2.min(3)
print("result: %d" %cal2.result)
################출력 결과################
result: 5
result: 2
위의 예제처럼 cal1과 cal2로 객체를 따로 생성하였지만 add와 min 메서드를 사용해 연산한 결과,
우리는 클래스 내 result라는 변수를 cal1과 cal2가 공유해서 사용했다는 사실을 알 수 있다.
다음으로 클래스의 상속에 대해서 알아보자.
클래스가 2개 선언되어 있을 때 다른 클래스에서 선언한 메서드를 사용할 수 있다.
사용 방법은 아래 예제를 참고하도록 하자.
class Calculator1:
def __init__(self):
self.result_add = 1
self.result_min = 10
self.result_mul = 5
self.result_div = 9
def add(self, var1):
self.result_add += var1
def min(self, var1):
self.result_min -= var1
class Calculator2(Calculator1): #Calculator1 상속
def mul(self, var1):
self.result_mul *= var1
def div(self, var1):
self.result_div /= var1
cal1 = Calculator1()
cal2 = Calculator2()
cal2.add(5)
cal2.mul(3)
print("add result: %d" %cal2.result_add)
print("mul result: %d" %cal2.result_mul)
################출력 결과################
add result: 6
mul result: 15
Calculator2에 Calculator1의 메서드를 상속해 주었다.
그 결과 Calculator2에서 add와 mul 메서드 모두 사용할 수 있게 되었다.
그렇다면 이러한 클래스의 상속 기능은 언제 사용하는지 알아야 그때 사용할 텐데 언제 쓰는지 설명하자면,
클래스의 함수가 라이브러리로 형태로 제공되거나 수정을 할 수 없는 경우가 있다.
이때 클래스의 상속을 사용한다.
마지막으로 메서드 오버라이딩(overriding)에 대해서 알아보자.
상속받은 클래스의 메서드를 변경하고 싶을 때 메서드 오버라이딩을 하는데 오버라이딩 하는 방법은 아래 예제를 참고하면 된다.
class Calculator1:
def __init__(self):
self.result_add = 1
self.result_min = 10
self.result_mul = 5
self.result_div = 9
def add(self, var1):
self.result_add += var1
def min(self, var1):
self.result_min -= var1
class Calculator2(Calculator1): #Calculator1 상속
def add(self, var1):
self.result_add += var1*2
cal1 = Calculator1()
cal2 = Calculator2()
cal2.add(5)
print("add result: %d" %cal2.result_add)
################출력 결과################
add result: 11
add 메서드는 단순히 변수를 한번 더하는 것이었지만 Calculator2에서 곱하기 2 한 후에 더하는 것으로 다시 add 메서드를 선언하였다. 이렇게 되면 상속받은 클래스 Calculator1의 add 메서드에 오버라이딩이 된다.
그 결과 객체 cal2에서 호출한 add 메서드에 변수 5를 넣으면 결괏값이 11이 된다.
여기까지 클래스에 대해서 알아보았고 다음에는 모듈에 대해서 알아볼 예정이다.
'Python' 카테고리의 다른 글
파이썬에서 모듈(module) 사용하기 (0) | 2024.06.29 |
---|---|
파이썬에서 파일을 읽고 써보자(Read/Write) (0) | 2024.06.22 |
파이썬에서 함수를 다뤄보자 (0) | 2024.06.21 |
파이썬에서 반복문 while문과 for문 사용하기 (0) | 2024.06.20 |
파이썬에서 조건문 if 사용 방법 (0) | 2024.06.16 |