Post List

2015년 8월 23일 일요일

Python 기초 #11 Class (클래스)

1. Class란 ?

에 대한 설명은 생략하겠습니다. 그런 자세한 설명을 아실려면 이런 Blog가 아닌 괜찮은 책을 한 권 사보시는걸 추천드립니다. 온라인에서도 괜찮은 곳이 있긴 합니다. 점프 투 파이썬 이라는 e-book을 온라인으로 공개한 곳이 있습니다.

https://wikidocs.net/28

위 Link를 참조하시기 바랍니다.

2. Class 문법

class class명:
    변수1
    변수2
 
    def __init__(self):
        self.변수1 = 1
        self.변수2 = 2
 
    def Method명(self, 인자):
        self.변수1 = 인자

C++, Java 등과 크게 다르지 않습니다.
self 라는 것이 타 언어의 this 와 같습니다. 자기 자신을 참조한다는 것을 뜻합니다.
Member Variable ( = Property ) 를 참조하기 위해서는 self. 을 반드시 붙여야 합니다.
__init__는 instance 생성시 항상 실행되는 함수입니다. 타 언어의 Constructor와 같은 개념입니다.
Member Function ( = Method ) 의 첫번째 인자는 반드시 self 이어야 합니다.

3. Class 예제 ( self 사용법)

타 언어와 다른점은 Property 참조시 반드시 self.을 붙여야 하며, Method의 첫번째 인자는 self 이어야 한다는 점입니다.
다른 언어는 Class 선언시 Class Type을 Instance 앞에 붙이지만, Python은 변수 선언시 Type을 앞에 쓰지 않으므로 뒤에 써야 합니다.

class Calc:
    acc = 0
 
    def Add(self, n1, n2):
        self.acc = n1 + n2
 
    def Get(self):
        return self.acc
 
C = Calc()
C.Add(2,3)
>>> print(C.Get())
5

4. __init__ Method

__init__는 instance 생성시 항상 실행되는 함수입니다. 타 언어의 Constructor와 같은 개념입니다.
위 Code에서 __init__  Method를 추가하여서 acc에 대한 초기 값을 설정하였습니다.
그리고 Add Method에서 계산된 값을 acc에 누산시켰습니다.

class Calc:
    acc = 0
 
    def __init__(self, initVal = 0):
        self.acc = initVal
 
    def Add(self, n1, n2):
        self.acc += n1 + n2
 
    def Get(self):
        return self.acc
 
C = Calc(10)
C.Add(2,3)
>>> print(C.Get())
15

5. Method를 호출하는 다른 방법

앞서 모든 Method의 첫번째 인자는 self 이어야 한다고 얘기했습니다.
Class Method를 호출하는 다른 방법은 Class.Method( Instacne, 변수... ) 식으로 호출이 가능합니다.

>>> Calc.Add(C, 1, 2)
>>> print(Calc.Get(C))
18

6. 상속

Class 선언시 괄호 ( ) 안에 부모 Class Type을 적어주면 됩니다.

class CalcEx(Calc):
    def Sub(self, n1, n2):
        self.acc += n1 - n2
 
>>> D = CalcEx(10)
>>> D.Add(2,3)
>>> print(Calc.Get(D))
15
>>> D.Sub(2,1)
>>> print(CalcEx.Get(D))
16

7. Operation Overloading (연산자 오버로딩)

Python에는 연산자 별로 선언시 사용해야 할 Method 이름이 정해져 있습니다.

Operator

Expression

Internally

Addition

p1 + p2

p1.__add__(p2)

Subtraction

p1 - p2

p1.__sub__(p2)

Multiplication

p1 * p2

p1.__mul__(p2)

Power

p1 ** p2

p1.__pow__(p2)

Division

p1 / p2

p1.__truediv__(p2)

Floor Division

p1 // p2

p1.__floordiv__(p2)

Remainder (modulo)

p1 % p2

p1.__mod__(p2)

Bitwise Left Shift

p1 << p2

p1.__lshift__(p2)

Bitwise Right Shift

p1 >> p2

p1.__rshift__(p2)

Bitwise AND

p1 & p2

p1.__and__(p2)

Bitwise OR

p1 | p2

p1.__or__(p2)

Bitwise XOR

p1 ^ p2

p1.__xor__(p2)

Bitwise NOT

~p1

p1.__invert__()
참조 : http://www.programiz.com/python-programming/operator-overloading

__add____sub__ 에 대한 예제를 들어보겠습니다.

class Calc:
    acc = 0
 
    def __init__(self, initVal = 0):
        self.acc = initVal
 
    def Add(self, n1, n2):
        self.acc += n1 + n2
 
    def Get(self):
        return self.acc
 
    def __add__(self, other):
        R = Calc(self.acc + other.acc)
        return R
 
    def __sub__(self, other):
        R = Calc(self.acc - other.acc)
        return R
 
>>> A = Calc(10)
>>> B = Calc(5)
>>> C = A + B
>>> print(C.Get())
15
>>> D = A - B
>>> print(D.Get())
5


댓글 없음:

댓글 쓰기