[파이썬] Python언어의 self를 인자로 받는 함수(Method)와 그렇지 않은 함수(메소드)의 차이점을 알아보자

self를 인자로 넣은 함수는 변수명 = 클래스명()으로 초기화 후 변수명.함수명(값) 방식으로 접근이 가능합니다.

self를 인자로 넣지 않는 함수는 클래스명.함수명(값) 방식으로 접근합니다.

코드의 동작은 동일합니다. 함수를 호출하여 사용하는 방법이 다릅니다.

이해를 돕기 위해 아래 샘플코드를 준비했습니다.

import time
import datetime


class CallTest:

    def selfmethod(self, param1):
        start_time = time.time()
        tot = 0
        for i in range(param1):
            tot = tot + i

        # tmp = "{:,}".format(tot)
        tmp = format(tot, ",")
        print("1부터", param1, "까지의  총합:", tmp)
        end_time = time.time()
        timelist = str(datetime.timedelta(seconds=end_time - start_time)).split(".")
        print("selfmethod 실행시간(시:분:초) -> ", timelist[0])

    def nonselfmethod(param1):
        start_time = time.time()
        tot = 0
        for i in range(param1):
            tot = tot + i
        tmp = format(tot, ",")
        print("1부터", param1, "까지의  총합:", tmp)
        end_time = time.time()
        timelist = str(datetime.timedelta(seconds=end_time - start_time)).split(".")
        print("nonselfmethod 실행시간(시:분:초) -> ", timelist[0])


a = 1000000
b = CallTest()
b.selfmethod(a)
b.nonselfmethod(a) # 호출 오류 발생

[실행결과]

클래스 CallTest()를 초기화 후 2개의 메소드를 호출하였습니다.

b.selfmethod(a)는 정상적으로 호출되었습니다.

그러나 self인자를 받지 않은 nonselfmethod(a)함수는 오류가 발생하였습니다.  

이번엔 다른 방식으로 호출하여서 테스트합니다.

import time
import datetime


class CallTest:

    def selfmethod(self, param1):
        start_time = time.time()
        tot = 0
        for i in range(param1):
            tot = tot + i

        # tmp = "{:,}".format(tot)
        tmp = format(tot, ",")
        print("1부터", param1, "까지의  총합:", tmp)
        end_time = time.time()
        timelist = str(datetime.timedelta(seconds=end_time - start_time)).split(".")
        print("selfmethod 실행시간(시:분:초) -> ", timelist[0])

    def nonselfmethod(param1):
        start_time = time.time()
        tot = 0
        for i in range(param1):
            tot = tot + i
        tmp = format(tot, ",")
        print("1부터", param1, "까지의  총합:", tmp)
        end_time = time.time()
        timelist = str(datetime.timedelta(seconds=end_time - start_time)).split(".")
        print("nonselfmethod 실행시간(시:분:초) -> ", timelist[0])


a = 1000000

CallTest.nonselfmethod(a)
CallTest.selfmethod(a)

[실행결과]

이번에는 CallTest를 초기화 하지 않고 호출하였습니다.

그 결과 nonselfmethod(a)는 정상적으로 동작을 하였습니다.

하지만 self인자를 받는 selfmethod(a)는 오류가 발생되었습니다.

이해가 가시죠?

카테고리 글 더 보기

error: Content is protected !!