본문 바로가기

Software/Python

간단한 예제를 통해 본 Python Class

요즘 은근히 바쁜척하면서 지내고 있답니다. 뭔가 더 재미난 것이 없을까 계속 찾는 걸로 봐서는 저는 하나에 집중하는 것보다 뭔가 계속 새로운 것에 흥미를 느끼는 스타일인 모양입니다. 몇일전에는 멀리서 지도교수님이 제가 있는 판교까지 찾아와주셔서 살짝 학교의 향기를 느낄 수 있었네요.^^. 오늘은 요즘 제가 보고 있는 몇몇 주제들 중에 Python에서 class를 사용하는 것에 대해 이야기를 할려고 합니다. 뭐 거창하게 class의 가치나 역할 등등을 이야기할 것은 아니구요. 그냥 예제 하나를 통해서 설명할려구요^^



Python에서 클래스의 구조는 위와 같은 것이 일반적인 구조입니다. class를 선언하고... 내부에 변수나 함수를 선언하는 것이지요. 내부에서 인자로 self를 사용하는 것과 __init__ 함수의 선언 등이 좀 필요하지만... 뭐 심플한 예제를 다룰 거니 (사실 모르기도 하구요^^) 간단히... __init__에는 그 클래스에서 사용할 초기 변수를 선언해 두면 됩니다. 여기서 **kwargs는 [바로가기]에서 이야기한 keywarded argument입니다.


import numpy as np
import matplotlib.pyplot as plt

class sinWaveForm:
    def __init__(self, **kwargs) :
        self.endTime = kwargs.get('endTime', 1)
        self.sampleTime = kwargs.get('sampleTime', 0.01)
        self.amp = kwargs.get('amp', 1)
        self.freq = kwargs.get('freq', 1)
        self.startTime = kwargs.get('startTime', 0)
        self.bias = kwargs.get('bias', 0)

    def calcDomain(self) :
        return np.arange(0.0, self.endTime, self.sampleTime)

    def calcSinValue(self, time) :
        return self.amp * np.sin(2*np.pi*self.freq*time + self.startTime) + self.bias

    def plotWave(self) :
        time = self.calcDomain()
        result = self.calcSinValue(time)
    
        plt.plot(time, result)
        plt.grid(True)
        plt.xlabel('time')
        plt.ylabel('sin')
        plt.show()

if __name__ == "__main__" :
    test = sinWaveForm(amp = 2, endTime = 1)
    test.endTime = 2
    print(test.calcDomain())
    print(test.calcSinValue(test.calcDomain()))
    test.plotWave()


위에서 보여주는 예는 삼각함수를 그리는 아까의 이전 글을 클래스로 바꿔본 심플한 예입니다. 내부 변수는 domain인 시간을 만드는 calcDomain함수와 그 시간으로 사인함수의 결과를 만드는 calcSinValue와 그림을 그려주는 plotWave함수가 있습니다. 뭐 크게 어려움 없는 부분이구요. 마지막 if __name__ == "__main__" 구문은 이 class가 있는 화일이 단독으로 실행되는지 다른 코드에서 호출된 것인지를 체크하는 구문입니다^^


import matplotlib.pyplot as plt
import sinClass

# test1 = sinClass.sinWaveForm(amp = 1, endTime = 1)
# test1.plotWave()

test2 = sinClass.sinWaveForm(amp = 1, freq=1, endTime = 5)
test3 = sinClass.sinWaveForm(amp = 1, freq=4, endTime = 5)

time = test2.calcDomain()
resultTest2 = test2.calcSinValue(time)
resultTest3 = test3.calcSinValue(time)

plt.plot(time, resultTest2, time, resultTest3, time, resultTest2+resultTest3)
plt.grid(True)
plt.xlabel('time')
plt.ylabel        
plt.show()


위에서는 방금 만든 class를 사용하는 예제인데요. 다른 주기의 삼각함수와 그 두 함수를 더한 결과도 보여주게 됩니다.



바로 그 결과가 위의 그림입니다.^^ 뭐 아무것도 아닌 글입니다만.... 제 블로그 습관이 어떤 대화나 글을 적기 위해 항상 링크를 걸면서 참조를 하는 것을 좋아하기 때문이죠^^.


반응형