카테고리 없음

모듈이란 무엇인가?

  • -

모듈(module)이란?

파이썬 내에서는 모듈(module)을 잘 사용하게 된다. 흔히 게임을 다운로드 한다던지, 아니면 프로그램을 다운로드 한다던지 하는 경우에 설치 폴더 내에 수많은 파일들이 설치되는 것을 어렵지 않게 확인할 수 있다. 파이썬의 모듈을 바로 그런 것처럼 이해하면 조금 쉽다. 즉, 다소 복잡한 함수들이 하나의 코드 내에 위치해 있다면 그 코드를 사용할 때 모든 정보들을 다 불러와야 하기 때문에 오류가 있는지를 확인하는 것도 어렵고, 그만큼 사용 시간도 늘어날 수밖에 없다. 그래서 존재하는 것이 모듈이다. 일반적으로 파이썬을 시작할 때, 맨 처음에 보통 아래와 같은 코드를 사용해보게 된다.

import os
import pyqt5

위에서 'os'나 'pyqt5'가 바로 모듈에 해당하는 것이다. 즉, os나 pyqt5라는 작동 체계가 따로 저장되어 있으니 코드 내에서는 그걸 불러와서 필요할 때만 사용하는 것이다.

 

모듈 만들기

모듈은 일반적으로 함수와 변수들이 포함되어 있다. 

new file을 클릭해서 모듈을 만들어보자.

 

이번에 만들어 볼 모듈은 현재가를 기준으로 상한가와 하한가를 계산해보는 모듈이다. 일반적으로 상한가와 하한가는 전날의 종가 또는 당일 시가를 기준으로 계산되기 때문에, 모듈 내에서의 price가 바로 전날의 종가 또는 당일 시가의 역할을 수행하게 된다.

def cal1(price):
    first_value = price * 0.3
    second_value = price + first_value
    return second_value

def cal2(price):
    first_value = price * 0.3
    second_value = price - first_value
    return second_value

 

함수를 입력했다면 원하는 이름으로 저장을 해주도록 하자. 나는 'cal_module'로 저장함

 

※ 참고사항 ※

지금 사용하고 있는 idle파일은 이전에 설치할 때 설정한 경로에서 가져온 것입니다. 따라서 앞으로도 방금 만들었던 상하한가 계산 모듈을 임포트하기 위해서는 해당 모듈 py 파일도 그 경로 내에 두는 편이 편리하긴 합니다.

○ 저장 경로 : C:/Anaconda3    [이 경우 코드의 저장경로는 C:/Anaconda3:/cal_module.py가 됩니다.]

즉 특정 폴더 내에 'cal_module' py 파일을 위치시켰기 때문에, 이 모듈은 그 폴더 내에서만 작동하게 됩니다.  만약 폴더 내에 'cal_module' py 파일을 위치시킨 후, C:/Anaconda3 경로 내에 있는 idle을 이용해서 import cal_module 을 사용하게 된다면 오류 문구가 발생하게 됩니다. 왜냐하면 앞서 만들었던 IDLE 바로가기 파일의 위치는 C:/Anaconda3이기 때문입니다.

cal_module이 다른 폴더에 있어서 IDLE이 그 모듈을 불러올 수 없는 상황
cal_module 파일을 C:/anaconda 경로 내에 위치시킨 후 
import cal_module 을 입력하게 되면 오류가 발생하지 않는 모습

 

모듈 써보기

모듈을 사용하기 위해서는, 해당 모듈 내에 어떠한 변수가 있었는지를 알고 있어야 한다.

def cal1(price):
    first_value = price * 0.3
    second_value = price + first_value
    return second_value

def cal2(price):
    first_value = price * 0.3
    second_value = price - first_value
    return second_value

앞서 작성했던 코드를 보면, cal1(price), cal2(price)에서 'price'라는 변수가 함수 내에 입력되는 변수임을 알 수 있다. 그렇다면 모듈을 임포트한 후에 어떠한 형태로 그 모듈 내의 함수를 사용할 수 있을까? 방법은 간단하다. 
▶  모듈 파일명 . 모듈 내 함수 명(함수 내 변수 값)

즉, 지금까지 만들었던 것을 바탕으로 변환해서 작성하자면 아래와 같이 작성할 수 있다.
cal_module . cal1 (10000)

 

모듈을 잘 불러왔다면, '('를 입력했을 때 함수 내 변수를 입력할 자리에 어떤 변수가 있는지 뜬다.

 

cal_module.함수명(입력값)을 통해 상하한가를 계산해본 결과 화면

 

모듈 심화 학습, __name__과 __main__

앞서 저장했던 모듈을 뜯어서 조금 수정해보도록 하자.

def cal1(price):
    first_value = price * 0.3
    second_value = price + first_value
    return second_value

def cal2(price):
    first_value = price * 0.3
    second_value = price - first_value
    return second_value


print(cal1(10000))
print(cal2(10000))
print(__name__)

그 후 F5를 누르면 자동으로 모듈이 실행된다.

뭔가 이상하다. __name__을 출력하랬더니 __main__을 출력한다.
IDLE을 이용해서 import cal_module을 실행했더니 또 다른 값이 나온다.

 

여기서 한 가지 사실을 확인할 수 있다. 즉, 모듈을 곧바로 실행할 경우 __name__의 결과값으로 __main__이 출력되지만 모듈을 import 해서 실행할 경우 __name__의 결과값으로 __모듈 명__이 출력된다는 것이다.

사실 파이썬에서 __name__이라는 변수는 파이썬 자체에서 제공되는 변수로, 특정 파일이 직접 실행된 파일인지, 아니면 다른 파일을 통해 import된 파일인지를 확인하는 용도로 사용한다.

그렇다면 이를 어떻게 활용할 수 있을까? 단순하게 말해, 모듈이 직접 실행된 경우에는 다른 모듈을 사용할 수 없음을 의미한다. 즉, a와 b와 c라는 모듈을 A라는 파일에서 import한 경우에는 a, b, c 모두 사용할 수 있지만 A가 아닌 a를 실행중이라면 b와 c라는 모듈은 사용할 수 없게 된다.

따라서, a, b, c의 세 가지 모듈이 A 내에서 import 된 것이라면 print(__name__)의 반환값은 __main__이 되기 때문에, if문과 결합하여 사용할 수 있다! 그렇다면 if문을 작성해보도록 하자.

def cal1(price):
    first_value = price * 0.3
    second_value = price + first_value
    return second_value

def cal2(price):
    first_value = price * 0.3
    second_value = price - first_value
    return second_value


if __name__ == "__main__":
    print(cal1(10000))
    print(cal2(10000))
    print(__name__)

 

이처럼, __name__값이 __main__이라면 모듈을 import한 파일에서 사용되고 있기 때문에 if 아래에 있는 세 줄의 print 명령어가 동작하지만, 반대로 import가 되지 않은 상태라면 __name__ 값이 __cal_module__이기 때문에 if 문이 충족되지 않아 세 줄의 print 명령어가 작동하지 않게 된다.

 

모듈 임포트하기

사실 이 글에서 모듈 이름을 cal_module 처럼 길게 작성한 이유가 있다. 사실 모듈 이름은 계속해서 사용되기 때문에 간편하게 작성하는 편이 좋지 않나 싶지만 그렇다고 모듈 이름을 a나 aaaa로 저장할 경우에는 이 모듈이 무슨 모듈인지 기억나지 않는 문제가 발생한다.

이러한 문제점들을 깔끔하게 해결할 수 있는 방법이 하나 있다. 바로, import (모듈명)에서 끝내지 않고 해당 코드 내에서 그 모듈명의 별명을 붙여주는 것이다. 이 경우에는 모듈 이름을 aaaa로 저장했다 하더라도, 불러올 때 as cal_module이라는 코드만 작성해주면 해당 모듈이 무슨 동작을 수행하는 모듈이었는지 확인할 수 있다.

import cal_module as cm

 

위의 코드를 보면 cal_module을 임포트하는 것은 맞지만, 그 뒤에 as cm이라는 코드를 추가로 작성했다. 이 코드를 해석하자면, "cal_module 불러와. 근데, 귀찮으니까 이 코드에서는 cm이라고 부를게"이다.

실제로 사용되는 영단어와 똑같은 역할을 담당한다.

그렇다면 이제 모듈을 사용하기 위핸 명령어의 형태는 '모듈명.함수명(변수값)'. 즉 앞에서는 cal_module.cal1(10000)이었지만, 이제는 cm.cal1(10000)을 사용하면 된다!

cal_module을 cm으로 불러온 후, cm.cal1(10000) 명령어로 모듈을 사용하는 모습

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.