소개
Python 에서 __main__은 최상위 코드가 실행되는 범위 (scope) 의 이름입니다. Python 파일을 명령줄에서 직접 실행하면, 해당 파일의 특별한 내장 변수인 __name__은 문자열 "__main__"으로 설정됩니다. 하지만 해당 파일을 다른 스크립트로 모듈처럼 가져와 (import) 사용할 경우, __name__은 해당 파일의 이름으로 설정됩니다.
이러한 동작 방식은 매우 일반적이고 강력한 관용구 (idiom) 를 가능하게 합니다: 즉, 해당 파일이 메인 프로그램으로 실행될 때만 특정 코드 블록을 조건부로 실행하는 것입니다. 이는 if __name__ == "__main__": 구문을 사용하여 구현됩니다.
본 실습 (lab) 에서는 이 조건부 블록을 사용하여 Python 파일의 활용도를 높이는 방법을 배우게 될 것입니다. 이를 통해 파일은 독립 실행형 스크립트와 재사용 가능한 모듈 두 가지 역할을 모두 수행할 수 있게 됩니다.
메인 범위 이해하기 (Understanding the Main Scope)
이 단계에서는 __main__ 스코프가 무엇인지 알아보고, 모듈이 실행되는 방식에 따라 모듈의 __name__ 변수가 어떻게 달라지는지 살펴볼 것입니다.
먼저, 간단한 Python 모듈을 생성하고 해당 __name__ 변수를 검사해 보겠습니다.
참고: WebIDE(VS Code 와 유사) 사용법이 익숙하지 않다면, 이 랩 (lab)에서 먼저 학습하십시오.
- 왼쪽 파일 탐색기에서
my_module.py파일을 엽니다. my_module.py에 다음 코드를 추가합니다. 이 코드는 함수를 정의한 다음__name__변수의 값을 출력합니다.
## my_module.py
def greet(name):
print(f"Hello, {name}!")
print(f"The __name__ of my_module.py is: {__name__}")
## This block checks if the script is being run directly
if __name__ == "__main__":
print("my_module.py is being run directly.")
greet("World")
이제 이 파일을 스크립트로 직접 실행해 보겠습니다. 터미널을 열고 다음 명령을 실행합니다.
python3 my_module.py
다음과 같은 출력을 보게 될 것입니다. __name__이 "__main__"과 같으므로 if 블록 안의 코드가 실행되는 것을 확인할 수 있습니다.
The __name__ of my_module.py is: __main__
my_module.py is being run directly.
Hello, World!
다음으로, my_module.py를 다른 스크립트로 가져올 (import) 때 어떤 일이 발생하는지 살펴보겠습니다.
main.py파일을 엽니다.my_module을 가져오고 해당greet함수를 호출하는 다음 코드를 추가합니다.
## main.py
import my_module
print("Running main.py")
my_module.greet("LabEx")
이제 터미널에서 main.py를 실행합니다.
python3 main.py
출력을 주의 깊게 관찰하십시오.
The __name__ of my_module.py is: my_module
Running main.py
Hello, LabEx!
main.py가 my_module.py를 가져올 때, Python 인터프리터는 my_module.py의 코드를 실행합니다. 이때 __name__ 변수는 "my_module"(모듈 파일 이름) 으로 설정됩니다. __name__이 "__main__"이 아니므로 if __name__ == "__main__": 블록 안의 코드는 실행되지 않습니다. 이는 직접 실행하려는 코드와 모듈의 재사용 가능한 부분을 분리하는 방법을 보여줍니다.
메인 확인 (Main Check) 의 장점
이 단계에서는 if __name__ == "__main__": 체크를 사용할 때의 주요 장점을 살펴보겠습니다. 이 간단한 조건문은 모듈화되고 재사용 가능한 Python 코드를 작성하는 데 필수적입니다.
주요 장점은 다음과 같습니다.
- 이중 기능 (Dual Functionality): Python 파일이 가져와서 (import) 사용할 수 있는 재사용 가능한 모듈 역할과 직접 실행할 수 있는 독립 실행형 프로그램 역할을 동시에 수행할 수 있게 합니다.
- 코드 캡슐화 (Code Encapsulation): 테스트 코드, 명령줄 진입점 또는 사용 예시 스니펫이 해당 파일이 다른 모듈에 의해 가져와질 때가 아니라, 파일이 직접 실행될 때만 실행되도록 보장합니다. 이는 예상치 못한 부수 효과 (side effects) 를 방지합니다.
- 모듈성 및 재사용성 (Modularity and Reusability): 스크립트 수준의 로직을 핵심 함수와 분리함으로써 함수를 더 재사용하기 쉽게 만들고 코드를 테스트하고 유지 관리하기 쉽게 만듭니다.
실제 예제를 통해 이를 설명해 보겠습니다. 간단한 함수가 포함된 유틸리티 모듈을 만든다고 가정해 보겠습니다.
- 왼쪽 파일 탐색기에서
calculator.py파일을 엽니다. calculator.py에 다음 코드를 추가합니다.add함수는 재사용 가능하며,if블록 안의 코드는 간단한 테스트 또는 시연 역할을 합니다.
## calculator.py
def add(a, b):
"""This function adds two numbers."""
return a + b
## This block will only execute when calculator.py is run directly.
## It's a good place for tests or a simple command-line interface.
if __name__ == "__main__":
print("Running calculator.py as a standalone script for testing.")
result = add(3, 5)
print(f"A test run of add(3, 5) results in: {result}")
이 파일을 직접 실행하여 테스트 코드가 작동하는 것을 확인합니다.
python3 calculator.py
출력 결과는 테스트 블록이 실행되었음을 보여줍니다.
Running calculator.py as a standalone script for testing.
A test run of add(3, 5) results in: 8
이제 메인 애플리케이션에서 add 함수를 재사용해 보겠습니다.
main.py를 수정하여calculator.py에서add함수를 가져와 사용합니다.
## main.py
from calculator import add
print("Using the 'add' function from the calculator module.")
sum_result = add(10, 20)
print(f"The result of add(10, 20) is: {sum_result}")
- 터미널에서
main.py를 실행합니다.
python3 main.py
다음과 같은 출력을 얻게 됩니다.
Using the 'add' function from the calculator module.
The result of add(10, 20) is: 30
보시다시피 calculator.py의 테스트 코드는 실행되지 않았습니다. 우리는 스크립트별 로직을 실행하지 않고 add 함수를 성공적으로 가져와 사용했으며, 이는 깔끔하고 재사용 가능한 모듈을 만드는 데 있어 if __name__ == "__main__": 체크의 강력함을 입증합니다.
요약
본 실습에서는 Python 의 __main__ 범위와 if __name__ == "__main__": 조건문 블록의 중요성에 대해 배웠습니다.
다음과 같은 사실을 확인했습니다.
- Python 모듈의
__name__변수는 해당 파일이 직접 실행될 때"__main__"으로 설정됩니다. - 모듈이 가져와질 (import) 때, 해당 모듈의
__name__은 모듈 파일 이름으로 설정됩니다. if __name__ == "__main__":검사를 통해 파일이 독립 실행형 스크립트로 실행될 때만 코드를 실행하도록 작성할 수 있습니다.
이 강력한 기능은 모듈화되고 재사용 가능한 Python 코드를 작성하는 데 핵심이며, 파일이 실행 가능한 프로그램 역할과 가져와서 사용할 수 있는 라이브러리 역할을 모두 수행할 수 있도록 해줍니다. 스크립트별 로직을 핵심 기능과 분리함으로써, 더 깔끔하고 유지보수가 용이하며 전문적인 Python 애플리케이션을 만들 수 있습니다.



