파이썬에도 여타 언어들 처럼 class를 만들어 객체를 생성하는 기능을 포함하고 있다.

 

현실세계에서 어떠한 객체는 하나의 정보로만 구성되는 경우는 매우 드물다. 예를 들어 자동차라는 하나의 객체 안에는 자동차의 모델명, 제작사, 타입 등의 여러가지 정보로 구성되기 때문에, primitive 타입의 자료형으로는 표현하는데 한계가 존재한다.

 

따라서 class의 기능을 이용해 자동차 같은 객체를 설명하고, 그런 변수를 생성하고 처리할 수 있도록 한다.

 

특히 파이썬과 JAVA는 같은 OOPL(Object-Oriented-Programming Language)로 객체를 우선시 하는 이러한 언어들에서 Class의 개념은 몹시 중요하다.

 

예시로 2개의 operator에 대해 사칙연산만 수행하는 계산기를 class형식으로 만들어 보았다.

class Calculator:
#constructor
    def __init__(self,operator1, operator2):
        self.operator1 = operator1
        self.operator2 = operator2
#method
    def add(self):
        return self.operator1+self.operator2
    def multiple(self):
        return self.operator1*self.operator2
    def subtraction(self):
        return self.operator1-self.operator2
    def division(self):
        return self.operator1/self.operator2

class 안에서 함수와 같은 기능을 수행하는 것들을 method라고 부른다. 

 

Calculator class안에는 사칙연산을 계산하는 4개의 method가 존재한다.

 

method는 다음과 같이 작동한다

c1 = Calculator(4,2)
print(c1.add())
print(c1.multiple())
print(c1.subtraction())
print(c1.division())
6
8
2
2.0

여기서 다른 언어들과 차이를 보이는게 몇가지 있는데, 첫번째로 constructor이다.

 

다른 언어에서 constructor는 보통 class 명으로 선언되는데 파이썬에서는 __init__이라는 이름을 사용해서 선언된다. 

파이썬에서는 언더스코어(__)이 포함된 method는 파이썬 내부에 저장된 특별한 함수나 변수명을 나타내거나, 예약어로 지정돼 함수명으로 사용할 수 없을 때 사용한다.

(대표적으로 __init__, __add__, __sub__, __str__ 등이 있다)

 

또 다른 것으로는 파이썬은 인터프리터형 언어로, 자료형이 동적으로 할당된다는 것이다. 

 

위의 각 method 실행 결과 중, division만 소숫점형태로 나타난 것을 확인할 수 있는데, C나 JAVA와 같은 언어에서 이와 같이 출력하기 위해서는 return 타입을 미리 지정해줘야하고 method 인자 또한 타입을 지정해줘야 가능하다.

 

또, 다른 언어에서는 class가 가지는 특징을 변수로 나타내는데 (C : 멤버변수, JAVA: 필드), 파이썬에서는 그런 것을 선언해주지 않아도 method 내부에서

self.변수명 = initiating

와 같이 초기화 할 수 있다.

이는 constructor가 아닌 다른 method 내부에서도 초기화가 가능하다.

 

self는 다른 언어의 this와 유사한 기능을 수행한다. 객체 스스로를 호출하는 기능을 수행하는데 객체에 대한 연산을 수행할 때는 인자로 self를 거의 항상 가진다.

(객체의 속성을 연산하는 것이 아닌 아예 다른 수행을 하는 경우 self를 사용하지 않는 경우도 있다.)

 

상속

상속은 똑같다.

오버라이딩하거나 상속받은 함수를 그대로 사용할 수 있다.

class ExtandCalcualtor(Calculator):
    def __init__(self,operator1,operator2):
        Calculator.__init__(self,operator1,operator2)
    def power(self):
        result = 1
        for i in range(self.operator2):
            result *= self.operator1
        return result
    def division(self):
        result = [0, 0]
        result[0] = int(self.operator1/self.operator2)
        result[1] = int(self.operator1%self.operator2)
        return result

이는 확장된 계산기 class로 n제곱승과 나눗셈의 몫과 나머지를 출력하도록 method를 정의해줬다.

c2 = ExtandCalcualtor(4,2)
print(c2.power())
print(c2.division())
print(c2.add())
16
[2, 0]
6

조금 다른 기능으로는 파이썬은 다중 상속을 지원하고(JAVA는 미지원), mro라는 method를 지원하는데, 이는 해당 class가 어떤 상속관계에 놓여져있는지 나타낸다.

ExtandCalcualtor.mro()

#결과
[<class '__main__.ExtandCalcualtor'>, <class '__main__.Calculator'>, <class 'object'>]