티스토리 뷰

자동차를 운전하다가 접촉사고가 나서 범퍼가 파손되거나, 오랜 기간 주행으로 타이어가 심하게 마모된다면 정비소에 가서 교체 수리를 받게 됩니다. 이 때 보통 범퍼만 교체하거나 타이어만 교체하게 되므로 범퍼 교체 비용, 타이어 교체 비용만 지불하면 되며 수리 비용도 크게 부담되지는 않습니다. 그런데 만약 범퍼 교체를 하러 갔는데 범퍼가 엔진까지 연결이 되어 있어서 엔진도 교체를 한다거나 수리 작업을 해야 한다고 하면 어떨까요? 아무래도 수리 비용도 훨씬 비싸지고 수리 기간도 꽤 많이 걸릴겁니다.

 

소프트웨어도 이처럼 부품만 교체하거나 추가할 수 있도록 만들면 유지보수도 쉽고 코드의 재사용도 수월해지는 장점이 있는데요. 함수 정의나 클래스 등 서로 관련이 있거나 비슷한 기능을 하는 파이썬 문장들을 담고 있는 파일을 모듈(module) 이라고 하며, 필요한 것들끼리 부품처럼 잘 만드는 것을 모듈화 (modularization) 라고 합니다.

 

앞에서 random 모듈을 가져다가 사용했던 것 기억 하시나요? 난수를 생성하는 함수들이 정의된 random 모듈 덕분에 우리는 별도의 난수 생성 함수를 정의할 필요 없이 random 모듈을 import 하여 사용하기만 하면 되었습니다. 파이썬에는 이미 굉장히 많은 유용한 모듈들이 있는데 파이썬 개발을 하다 보면 새로운 모듈을 개발해야 할 필요도 있습니다. 이번 장에서는 직접 모듈을 하나 만들어보도록 하겠습니다.

 

워크스페이스 내에 새로운 파이썬 파일을 하나 만들고 이름은 theater_module.py 로 지어줍니다. 이 파일에는 사람 수에 따른 영화표 가격을 계산해주는 3개 함수를 정의할텐데요. 각 함수는 사람 수를 의미하는 people 을 전달받으며 1인당 영화표 가격은 price() 함수에서는 일반 가격인 10,000원, price_morning() 에서는 조조 할인 가격인 6,000원, price_soldier() 에서는 군인 할인 가격인 4,000원으로 계산하여 출력합니다.

# 일반 가격
def price(people):
    print("{0}명 가격은 {1}원 입니다.".format(people, people * 10000))

# 조조 할인 가격
def price_morning(people):
    print("{0}명 조조 할인 가격은 {1}원 입니다.".format(people, people * 6000))

# 군인 할인 가격
def price_soldier(people):
    print("{0}명 군인 할인 가격은 {1}원 입니다. ".format(people, people * 4000))

 

이제 이 파일은 모듈이 되며 다른 파일에서 가져다가 사용할 수 있습니다. 여러분이 원래 사용하시던 파일 (ex : practice.py) 에서 모듈을 사용해볼텐데, 주의할 점은 theater_module.py 파일과 이 모듈을 사용할 파일은 서로 같은 경로상에 있어야 한다는 것입니다.

 

모듈을 사용하는 방법에는 여러 가지가 있는데 가장 기본적인 import 를 먼저 보겠습니다. import 구문을 쓸 때는 파일명 theater_module.py 에서 확장자 .py 를 제외한 모듈 이름 theater_module 을 그대로 적어주면 됩니다. import 를 한 이후부터는 이 모듈에 정의한 함수를 사용할 수 있는데 모듈명 뒤에 점(.) 을 찍고 나서 함수 이름을 적습니다. 3개 함수를 각각 호출하며 전달값은 3, 4, 5 로 해보겠습니다.

import theater_module # theater_module 을 가져다가 사용
theater_module.price(3) # 3명이 영화 보러 갔을 때 가격
theater_module.price_morning(4) # 4명이 조조 영화 보러 갔을 때
theater_module.price_soldier(5) # 5명이 군인이 영화 보러 갔을 때

 

실행 결과는 다음과 같습니다.

3명 가격은 30000원 입니다.
4명 조조 할인 가격은 24000원 입니다.
5명 군인 할인 가격은 20000원 입니다.

 

그런데 theater_module 이라는 이름이 다소 길어서 모듈을 사용할 때마다 긴 이름을 적자니 조금 불편하기도 합니다. 이럴 때는 as 를 이용해서 모듈에 별명을 붙여줄 수 있습니다. 영화는 영어로 movie 인데 이것도 길어 보이니 편의상 mv 라는 별명을 짓도록 하겠습니다. import 구문 뒤에 as mv 를 붙여서 theater_module 이라는 이름을 이제는 mv 로 간편하게 호출할 수 있습니다. 

import theater_module as mv # theater_module 을 새로운 별명인 mv 로 사용
mv.price(3)
mv.price_morning(4)
mv.price_soldier(5)

 

실행 결과는 동일합니다.

3명 가격은 30000원 입니다.
4명 조조 할인 가격은 24000원 입니다.
5명 군인 할인 가격은 20000원 입니다.

 

이번에는 from ~ import 구문을 써보겠습니다. 앞에서 이미 우리는 random 모듈을 사용할 때 이 구문을 연습해봤었는데요.

from random import *

from 뒤에 모듈 이름을 적고 그 모듈 내에서 가져다가 사용할 부분을 import 뒤에 적어주면 됩니다. 우선은 모든 부분을 가져다 쓴다는 의미로 * 을 적어보겠습니다. from ~ import 구문을 통해 가져온 모듈은 모듈명과 점(.) 부분을 적어줄 필요 없이 모듈 내의 함수 이름을 그대로 적으면 됩니다.

from theater_module import * # theater_module 내에서 모든 것을 가져다가 사용
price(3) # theater_module. 필요 없음
price_morning(4)
price_soldier(5)

 

실행 결과는 여전히 동일합니다.

3명 가격은 30000원 입니다.
4명 조조 할인 가격은 24000원 입니다.
5명 군인 할인 가격은 20000원 입니다.

 

그런데 때로는 모듈 내에 정의된 모든 내용을 가져다 쓰지 않고 필요한 것만 가져다가 써야할 때도 있습니다. 예를 들어서 이미 군대를 전역한 사람이라면 군인 할인 가격에 해당하는 price_soldier() 함수는 아무런 쓸모가 없겠지요. 이 때는 from ~ import 구문 뒤에 * 대신 사용하고자 하는 부분만 콤마(,)로 구분하여 적으면 됩니다. 일반 가격인 price() 와 조조 할인 가격인 price_morning() 만 가져와보겠습니다. 이번에는 사람 수를 5, 6, 7 로 하여 3개 함수를 모두 호출해보겠습니다.

from theater_module import price, price_morning # 모듈에서 일부만 가져다가 사용
price(5) # 이번에는 5명
price_morning(6)
price_soldier(7) # import 하지 않았으므로 사용 불가

 

실행시켜보니 price() 와 price_morning() 은 정상적으로 결과가 출력되는데 price_soldier() 부분은 import 를 하지 않았으므로 정의되지 않은 이름이라고 하며 에러가 발생하는 것을 확인할 수 있습니다.

5명 가격은 50000원 입니다.
6명 조조 할인 가격은 36000원 입니다.
Traceback (most recent call last):
  File "파일 경로", line 23, in <module>
    price_soldier(7)
NameError: name 'price_soldier' is not defined

 

마지막으로 from ~ import 구문에도 as 를 적용하여 별명을 지어주는 연습을 해보겠습니다.

앞에서는 군대를 전역한 사람을 예로 들었는데 만약 현재 군생활을 하고 있는 군인이라면 어떨까요? 일반 가격 (10,000원) 이나 조조 할인 가격 (6,000원) 보다 군인 할인 가격 (4,000원) 이 더 저렴하므로 price() 와 price_morning() 을 사용할 필요 없이 항상 price_soldier() 를 사용하면 되겠습니다. 그런데 price_soldier() 라는 이름이 조금 길고 어차피 다른 함수는 사용하지 않으므로 새로운 별명인 price 를 사용하도록 하면 어떨까요?

 

from ~ import 구문에도 as 를 이용하여 별명을 지어줄 수 있습니다. 다음과 같이 코드를 작성하고 from ~ import 구문 뒤에 as price 를 적어주면 코드에서는 price() 라는 이름으로 모듈 내 함수에 접근할 수 있으며 이 때 실제로 호출되는 함수는 theater_module 내의 price() 가 아닌 price_solder() 가 됩니다.

from theater_module import price_soldier as price # price_soldier 를 새로운 별명인 price 로 사용
price(5) # price_soldier() 를 호출

 

실행 결과는 다음과 같습니다.

5명 군인 할인 가격은 20000원 입니다. 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함