[Python Note] 클래스(Class)
1. 클래스(class)란?
- 여러 개의 기능을 가진 하나의 계산기로 만들어서 여러 변수들이 이 계산기를 사용할 수 있도록 하는 것을 말하는데, 이 때 계산기를 클래스(class)라고 한다.
- 클래스(class)는 프로그램 작성을 위해 꼭 필요한 것은 아니지만 잘 사용한다면 충분히 이점이 큰 요소이다.
- 예를 들어, A와 B는 모두 50000원의 용돈을 받았다. 용돈을 사용할 때마다 남은 돈을 알고싶다고 하자. A와 B는 뺄셈에 대한 계산기가 필요하다. 우리는 뺄셈을 하는 계산기를 하나의 클래스로 만들어 A와 B에게 주려고 한다.
class subcalc:
def __init__(obj):
obj.result = 50000
def sub(obj,num):
obj.result -= num
return obj.result
A = subcalc()
B = subcalc()
print("A: 1day ", A.sub(4100)," 2day ",A.sub(16000)," 3day ",A.sub(2400))
print("B: 1day ", B.sub(6000)," 2day ",B.sub(7000)," 3day ",B.sub(17000))
A: 1day 45900 2day 29900 3day 27500
B: 1day 44000 2day 37000 3day 20000
- 이 때, A, B를 객체(object)라고 하고, A, B는 subcal()의 인스턴스(instance)라고 한다.
- 객체에 생성되는
result
라는 변수는객체변수
라고 한다. - 객체 변수는 다른 객체들에 영향을 받지 않고 독립적으로 그 값을 유지한다.
(id()
는 값의 주소값을 의미한다.)
print(id(A.result), id(B.result))
2799572255760 2799572255376
- class안의 함수들을 메서드라고 하는데, 파이선에서 메서드의 첫번째 매개변수(parameter)는 관례적으로 self를 사용한다.(이 포스트에서는 obj로 사용했다.)
- 위의 예제에서 subcalc 클래스의 sub 메서드를 호출할 때 입력한 값은
num
만 있는 것을 볼 수 있다. 이 때, obj는 객체 A, B가 자동으로 전달되었기 때문이다.
2. 생성자(Constructor)
- 생성자(Constructor)란 객체(object)가 생성될 때 자동으로 호출되는 메서드를 의미한다.
- 초기값(initial value)를 설정할 필요가 있을 때 생성자(constructor)를 만드는 것이 안전하다.
__init__
를 사용하면 생성자(constructor)를 만들 수 있다.- 위의 예시로 확인하면, 초기값(initial value)를 50000으로 주었다는 것을 확인할 수 있다.
3. 사칙연산 클래스 만들기
- 숫자 2개를 입력하면 사칙연산을 해주는 계산기를 만들고자 한다.
- 지정한 2개의 숫자를 저장할 수 있는
numbers
라는 함수를 만든다.
2개의 숫자를 class에 직접 넣어__init__
함수를 이용하여 저장할 수도 있다. - 덧셈(
add
), 뺄셈(sub
), 곱셈(mul
), 나눗셈(div
)을 하는 각각의 함수들을 만든다.
- 지정한 2개의 숫자를 저장할 수 있는
# make 'numbers' function
class Calc:
def numbers(obj,one,two):
obj.one = one
obj.two = two
def add(obj):
result = obj.one + obj.two
return result
def sub(obj):
result = obj.one - obj.two
return result
def mul(obj):
result = obj.one * obj.two
return result
def div(obj):
result = obj.one / obj.two
return result
A = Calc()
B = Calc()
A.numbers(2,5)
B.numbers(6,3)
print(A.add(),A.sub(),A.mul(),A.div())
print(B.add(),B.sub(),B.mul(),B.div())
7 -3 10 0.4
9 3 18 2.0
# using init function
class Calc:
def __init__(obj,one,two):
obj.one = one
obj.two = two
def add(obj):
result = obj.one + obj.two
return result
def sub(obj):
result = obj.one - obj.two
return result
def mul(obj):
result = obj.one * obj.two
return result
def div(obj):
result = obj.one / obj.two
return result
A = Calc(2,5)
B = Calc(6,3)
print(A.add(),A.sub(),A.mul(),A.div())
print(B.add(),B.sub(),B.mul(),B.div())
7 -3 10 0.4
9 3 18 2.0
4. 클래스의 상속(Inheritance)
class 새로운 클래스 이름(상속할 클래스 이름)
- 클래스에 기능을 추가하거나 수정하고 싶을 때 사용한다.
1) 클래스에 기능 추가하기
- 위의 사칙연산 기능에 거듭제곱, 절댓값의 합, 나눗셉의 나머지 기능을 추가해보자.
class MyCalc(Calc):
def power(obj):
result = obj.one**obj.two
return result
def absadd(obj):
result = abs(obj.one)+abs(obj.two)
return result
def divremain(obj):
result = obj.one%obj.two
return result
C = MyCalc(10,4)
print(C.add(),C.sub(),C.mul(),C.div())
print(C.power(), C.absadd(), C.divremain())
14 6 40 2.5
10000 14 2
2) 클래스의 기능 수정하기(Overriding, 덮어쓰기)
- 같은 함수 이름으로 작성하면 덮어쓰기(overriding)가 된다.
- 위의
MyCalc
클래스의 div함수와 divremain함수를 수정해보자.
나누는 값이 0이 되면 Error가 나오기 때문에 0이 입력되면 0으로 출력하고, “ZeroDivisionError!!” 문구가 출력되도록 수정하고자 한다.
class ReMyCalc(MyCalc):
def div(obj):
if obj.two == 0:
print("div function error! ZeroDivisionError!!")
return 0
else:
result = obj.one/obj.two
return result
def divremain(obj):
if obj.two == 0:
print("divremain function error! ZeroDivisionError!!")
return 0
else:
result = obj.one%obj.two
return result
D = ReMyCalc(10,0)
print(D.div(), D.divremain())
div function error! ZeroDivisionError!!
divremain function error! ZeroDivisionError!!
0 0
5. 클래스 변수
- 클래스(class) 안에 있는 변수를 클래스 변수라고 한다.
- 객체 변수와는 다르게 다른 객체들을 만들더라도 클래스 변수는 공유된다.
class Family:
Dad = "신형만"
Mom = "봉미선"
I = "신짱구"
Sister = "신짱아"
Dog = "흰둥이"
A = Family()
B = Family()
print(id(Family.I),id(A.I),id(B.I))
2799572276912 2799572276912 2799572276912
댓글남기기