본문 바로가기

Python

[Python] 7. 모듈(Module)

반응형

 

 

[목차]

 

1. 모듈이란?

 

2. 모듈 만들기 & 불러오기

 

3. if __name__ == "__main__"

 

 

 

 

  1. 모듈(Module)이란?

 

모듈(Module)이란, 함수나 변수 또는 클래스를 모아놓은 파이썬 파일이다. 이미 파이썬에서 아주 많은 표준 라이브러리 모듈을 제공하고 있고, 사용자가 직접 모듈을 만들어서 이용할 수도 있다. 

여러 파일에서 동일한 클래스나 함수 등이 이용되는 경우에, 공통되는 부분을 따로 빼내어 하나의 파일로 만들어두면 매번 새로 정의할 필요 없이 가져오기만 하면 되므로 코드도 짧아지고 훨씬 편리하다. 

 

 

  2. 모듈 만들기 & 불러오기

 

이제 모듈을 어떻게 만들고 불러오는지를 알아보자. 

# file name : calculate.py

def add(a, b):
    return a+b

def mul(a, b):
    return a*b

 

먼저, 파일명이 calculate.py인 코드를 위와 같이 작성하였다. 모든 파이썬 파일은 모듈이기 때문에 calculate.py 또한 모듈이다. 

그리고 이 모듈을 다른 파일인 test.py 에서 이용한다고 가정하자. 이를 위해서는 calculate.py와 test.py가 동일한 디렉토리(폴더)에 존재해야 한다. 

 

이제 어떻게 test.py에 calculate.py 모듈을 불러올 수 있을까? 모듈을 불러오는 여러 방식이 존재한다.

 

* 지금부터 언급하는 '데이터'는 변수와 함수, 클래스 등을 의미한다

 

1. import 모듈

 

import calculate

s = calculate.add(2, 3)
print(s) # 5

s = calculate.mul(3, 5)
print(s) # 15

 

위처럼 먼저 import를 이용해서 calculate 모듈을 불러온다. 그다음 불러온 모듈에 있는 데이터를 이용하기 위해서는 모듈명 뒤에 점(.)을 붙이고 데이터를 이용할 수 있다. 

 

2. from 모듈명 import 데이터

 

from calculate import add

s = add(2, 3) 
print(s) # 5

s = mul(3, 5) # NameError: name 'mul' is not defined

 

from 모듈명 import 데이터 의 형태로 이용하면, 해당 모듈에 있는 특정 데이터만 가져올 수 있다. 그리고 이 방식을 이용하면 데이터를 이용할 때 매번 모듈명을 적지 않아도 된다. 

위의 코드에서는 calculate 모듈의 add 함수만 가져왔기 때문에 mul 함수를 수행하려고 하면 정의되지 않았다는 에러가 발생한다. 

 

 

3. from 모듈명 import 데이터1, 데이터2, ...

 

여러 데이터를 가져오기 위해서는 import 뒤에 콤마(,)를 이용해서 계속 추가해주면 된다.

from calculate import add, mul

s = add(2, 3) 
print(s) # 5

s = mul(3, 5) 
print(s) # 15

 

4. from 모듈명 import *

 

만약 해당 모듈에 있는 모든 데이터를 가져오고 싶다면 import 다음에 * 하나만 붙여주면 된다. 정규 표현식에서 *의 뜻은 모든 것이라는 의미이다.

from calculate import *

s = add(2, 3) 
print(s) # 5

s = mul(3, 5) 
print(s) # 15

 

5. import 모듈명 as 별명 / from 모듈명 import 데이터 as 별명

 

불러온 모듈명이나 데이터에 별명을 지어서 간단하게 이용할 수도 있다. 

아래 코드는 calculate라는 모듈명이 너무 길어 대신에 cal로 별명을 지어 이용하는 예시이다.

import calculate as cal

s = cal.add(2, 3)
print(s) # 5

 

 

  3. if __name__ == "__main__"

 

이전까지는 모듈에 함수만 정의되어 있는 구조였다. 그렇다면 다음과 같은 모듈을 생각해보자.

# calculate.py

def add(a, b):
    return a+b

def mul(a, b):
    return a*b

print("This module contains two functions")
print("add function")
print("mul function")

 

그리고 test.py 에서 calculate 모듈을 불러와서 add함수를 이용하였다.

import calculate

a = calculate.add(2, 3)
print(a)

# OUTPUT
# This module contains two functions
# add function
# mul function
# 5

 

그런데 a를 출력해보니 calculate 모듈에 있던 print문도 모두 test.py에서 출력되었다. 

 

그 이유는, 모듈을 불러오는 순간, 즉 import calculate를 수행한 순간 calculate.py가 한 번 실행이 되어버리기 때문이다. 원래 의도는 calculate 모듈의 함수만 이용하기 위함이기 때문에 이렇게 불필요한 부분은 수행되지 않도록 해야 할 것이다. 

이를 위해서 if __name__ == "__main__" 을 이용한다. 

 

먼저, __name__ 변수는 파이썬이 내부적으로 이용하는 특별한 변수이며 각 모듈마다 존재한다. 만약 calculate.py를 직접 실행하면, calculate.py에서의 __name__ 변수의 값에는 __main__이 저장된다. 하지만 다른 모듈에서 calculate를 import 하는 경우에는, calculate.py에서의 __name__ 변수의 값에는 calculate가 저장된다. 

 

이해하기 쉽게 말하면, 제일 처음 실행되는 모듈의 __name__ 에는 "__main__"이, 나머지는 자신의 모듈명이 저장된다. 

 

따라서, 현재 모듈을 다른 모듈이 import 했을 때 수행되지 않고자 하는 부분은 if __name__ == "__main__"으로 묶어버리면 해당 부분은 현재 모듈을 직접 실행했을 때만 수행이 될 것이다. 

 

# calculate.py

def add(a, b):
    return a+b

def mul(a, b):
    return a*b

if __name__ == "__main__":
    print("This module contains two functions")
    print("add function")
    print("mul function")
import calculate

a = calculate.add(2, 3)
print(a)

# OUTPUT
# 5

 

PC로 보시는 것을 권장합니다. 

피드백은 언제나 환영입니다. 댓글로 달아주세요 ^-^

반응형