※ 모듈의 필요성
- 함수 정의 코드가 길어지면 길어질수록 특정 기능들을 단위별로 모듈로 만든 뒤 import 문으로 모듈을
불러들인다면 메인이 되는 모듈의 코드를 파악하기 쉽고 어렵지 않게 활용할 수 있을 것이다.
예를 들어, 카메라 기능이 필요한 태블릿을 만들어야 한다고 할 때, camera_base 모듈을 import해 사용할 수 있고
이렇게 한다면 카메라 기능이 필요할때마다 모듈만 import 하면 되기 때문에 매우 효율적이다
이전 포스트에서 사용한 예시와 같이 camera_base.py 모듈은 import 문으로 다른 모듈로 불렸을떄 사진을 찍는 기능을 한 번 사용하며 불려졌는데 일반적으로 스마트폰은 이렇게 작동하지 않고 사용자 친화적이지 않다는 점을 깨달았을 것 이다. 그래서 camera나 phone 모듈이 다른 모듈에 의해 불려질때 기능이 자동으로 실행되지 않도록 해볼것인데 이는 __name__ 변수에 대한 이해가 필요하다.
○ 모듈은 __name__ 변수를 가진다
- 사용자가 모듈 내에서 정의하지 않더라도 파이썬 프로그램을 실행할 때 모듈 내에 자동으로 만들어지는 변수들이 있는데, __name__ 변수는 해당 모듈의 이름이 저장되는 변수이다. __name__ 변수가 어떤것인지 확인하기 위해 모듈 두개를 불러들이는 예시를 보며 확인해보자.
#camera.py
def photo():
print("Take Photo")
photo()
print("camera.py's module name is",__name__)
#phone.py
def makeacall():
print("Make a Call")
makeacall()
print("phone.py's module name is",__name__)
#smart.py
import carmera
import phone
print("smart.py's module name is",__name__)
print("-----")
while True:
choice = input("what do you want? : ")
if choice == '0':
break
if choice == '1':
camera.photo()
elif choice == '2':
phone.makeacall()
elif choice == '3':
print("나중에 구현될 기능")
print("프로그램이 종료되었습니다")
예시 코드는 이렇게 작성하였고 출력 결과는 다음과 같다.
#Take Photo
#camera.py's module name is camera
#Make a Call
#phone.py's module name is phone
#smart.py's module name is __main__
#-----
#what do you want? :
camera 와 phone 모듈은 각각 자신의 모듈 명이 저장되어 있고, smart.py 모듈은 __main__이 저장되어 있는데 이는 직접 실행되는 모듈의 변수 __name__ 은 항상 __main__ 이라는 값을 갖기로 약속되었기 때문이다.
즉, 어떤 모듈을 실행하던지 변수명과는 상관없이 직접 실행되는 모듈의 경우 항상 __main__ 값을 가지고 출력한다는 점을 유의하여야 한다.
이 점을 이용하여 원하는 경우에만 기능이 작동하도록 하는 코드를 작성해보았다.
#camera_mod.py
def photo():
print("Take Photo")
if __name__ == '__main__':
photo()
#phone_mod.py
def makeacall():
print("Make a Call")
if __name__ == '__main__':
makeacall()
#smart.py
import carmera
import phone
print("smart.py's module name is",__name__)
print("-----")
def smart_on():
while True:
choice = input("what do you want? : ")
if choice == '0':
break
if choice == '1':
camera_mod.photo()
elif choice == '2':
phone_mod.makeacall()
elif choice == '3':
print("나중에 구현될 기능")
print("프로그램이 종료되었습니다")
if __name__ == '__main__':
smart_on()
이제 모듈을 불러들인다 하더라도 모듈에 있는 실행코드가 멋대로 작동하는 것이 아니라 사용자가 원할때만 작동하도록 코드가 수정되어 실행여부를 제어할 수 있게 되었다. 이렇게 모듈의 특성을 이해하고 적용하는데 어려움이 없다면 간단하게 효율적인 코드를 작성할 수 있을 것이다.
'기타 > What I Learned' 카테고리의 다른 글
[TIL] 패키지 (0) | 2022.01.01 |
---|---|
[TIL] 모듈을 사용하는 방법 (0) | 2021.12.29 |
[TIL] 모듈 (0) | 2021.12.27 |
[TIL] 람다 표현식 (0) | 2021.12.26 |
[TIL] 스코핑룰과 주의점 (0) | 2021.12.25 |