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개를 입력하면 사칙연산을 해주는 계산기를 만들고자 한다.
    1. 지정한 2개의 숫자를 저장할 수 있는 numbers라는 함수를 만든다.
      2개의 숫자를 class에 직접 넣어 __init__함수를 이용하여 저장할 수도 있다.
    2. 덧셈(add), 뺄셈(sub), 곱셈(mul), 나눗셈(div)을 하는 각각의 함수들을 만든다.
# 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

댓글남기기