모듈화

개발을 하다 보면 " 모듈화 "라는 말을 들어보셨을 것입니다.

한 파일에 많은 내용이 들어있으면 나중에 유지 보수 하기가 힘들어지고, 의미적으로도 분리가 어렵기 때문에 기능별로 모듈 단위를 만드는 작업이 모듈화입니다.


모듈화의 장점은 어떤 기능을 구현한 한 모듈은 다른 모듈에서 재사용이 가능하다는 것입니다.

기능을 구현한 파일을 만들어 놓고, 이 파일을 쓰고자 하는 곳에서 import로 불러오기만 하면 사용이 가능하기 때문이죠.


import로 모듈을 불러올 때 신경 써야 할 부분은 모듈이 존재하는 경로입니다.

대부분 모듈은 특정 디렉터리에 모아놓고 관리하기 때문에 디렉터리를 import하는 방법을 알아야 합니다.


우선 기본적인 모듈 사용 방법을 알아보겠습니다.





기본적인 모듈 사용하기

최상위 디렉터리 이름은 test이며, test를 기준으로 파일 경로를 표현하겠습니다.

[ test/MyModule.py ]

# MyModule.py 파일
def add(a, b):
return a + b

def subtract(a, b):
return a - b

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

def divide(a, b):
return a / b

[ test/MyModuleTest.py ]

# test.py 파일
import MyModule

print(MyModule.add(10,20)) # 30
print(MyModule.subtract(20,10)) # 10
print(MyModule.divide(20,10)) # 2.0
print(MyModule.multiply(10,20)) # 200


최상위 디렉터리 아래에 MyModule.py 파일과 MyModuleTest.py 파일을 생성했습니다.

그리고 MyModuleTest.py 에서 MyModule.py 파일을 import했고, MyModul에 정의된 함수를 그대로 사용할 수 있는 것을 확인할 수 있습니다.





여러가지 import 사용법

모듈을 불러오는 import에는 여러가지 사용법이 있습니다.

form ~ import ~ 를 통해 모듈에서 특정 변수와 메서드만 불러올 수 있습니다.

또한 as 를 통해 별칭을 줄 수 있는데, 유명한 라이브러리들을 사용할 때는 별칭을 통해 간단하게 작성하곤 합니다.

# from ~ import ~
# math 모듈에서 sin 함수와 pi 변수만 불러옴
from math import sin, pi
print(sin(pi/2))

# math 모듈의 모든 변수와 함수를 불러옴
from math import *
print(tan(pi/4))


# as
# math 모듈을 m으로 별칭
import math as m
print(m.sin(pi/2))

# from ~ import ~ as ~
from math import sin as mysin, pi as mypi
print(mysin(mypi/2))





패키지에 있는 모듈을 import

패키지란 모듈을 모아 놓은 단위입니다.

패키지는 관련된 모듈들을 계층적인 디렉터리 구조로 저장하여 관리하기 위한 목적에 있습니다.


패키지를 생성하면 __init__ 파일이 생성되는데, __init__.py 파일은 패키지를 인식 시켜주는 역할을 하는 파일입니다.

즉 특정 디렉터리가 패키지로 인식되기 위해 필요한 파일입니다.


우선 패키지를 import 하기 위해 디렉터리 구조를 다음과 같이 생성하겠습니다.




[ test / pack1 / MyModule.py ]

def test_echo():
print('test_echo called')

[ test / pack2 / test.py ]

from pack1 import MyModule

MyModule.test_echo()

test.py 파일에서 pack1 패키지의 MyModule 파일을 import 했습니다.


import 할 때 주의할 것은 import한 모듈을 사용하려면 import 이후의 이름은 꼭 명시해야 한다는 것입니다.

test_echo() 메서드를 호출할 때 MyModule.test_echo() 가 아닌 test_echo() 로 호출하면 에러가 발생합니다.

MyModule 을 제외하고 test_echo() 으로만 호출하고 싶으면 아래와 같이 수정하면 됩니다.


[ test / pack2 / test.py ]

from pack1.MyModule import *

test_echo();




이번에는 __init__.py 파일을 활용 해보도록 하겠습니다.

__init__.py 파일에는 특정 모듈만 사용할 수 있도록 정의할 수 있습니다.


pack1 패키지에 Hello.py 파일을 추가하겠습니다.



[ test / pack1 / Hello.py ]

def test_hello():
print('hello')

[ test / pack1 / __init__.py ]

from . import MyModule

from . 에서 점( . )은 상대 경로로 작성한 경로이며, .만 있으므로 현재 디렉터리를 의미합니다.

즉 __init__.py 파일에서 현재 패키지 중 MyModule 파일만 import 될 수 있도록 범위를 제한 한 것입니다.

따라서 외부에서는 Hello.py를 import 할 수 없습니다.



[ test / pack2 / test.py ]

from pack1 import *

MyModule.test_echo()
# Hello.test_hello() 참조 할 수 없음

[ pack1 / __init__.py ] 파일에서 외부에서 사용할 수 있는 모듈의 범위를 제한했기 때문에 Hello.test_hello() 를 호출 할 수 없습니다.




이상으로 Python 모듈화 하는 방법에 대해 알아보았습니다.

Python 개발은 모듈화를 잘 하는 것이 중요합니다.