Python 메인 함수 (Main Function)

PythonBeginner
지금 연습하기

소개

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)에서 먼저 학습하십시오.

  1. 왼쪽 파일 탐색기에서 my_module.py 파일을 엽니다.
  2. 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) 때 어떤 일이 발생하는지 살펴보겠습니다.

  1. main.py 파일을 엽니다.
  2. 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 코드를 작성하는 데 필수적입니다.

주요 장점은 다음과 같습니다.

  1. 이중 기능 (Dual Functionality): Python 파일이 가져와서 (import) 사용할 수 있는 재사용 가능한 모듈 역할과 직접 실행할 수 있는 독립 실행형 프로그램 역할을 동시에 수행할 수 있게 합니다.
  2. 코드 캡슐화 (Code Encapsulation): 테스트 코드, 명령줄 진입점 또는 사용 예시 스니펫이 해당 파일이 다른 모듈에 의해 가져와질 때가 아니라, 파일이 직접 실행될 때만 실행되도록 보장합니다. 이는 예상치 못한 부수 효과 (side effects) 를 방지합니다.
  3. 모듈성 및 재사용성 (Modularity and Reusability): 스크립트 수준의 로직을 핵심 함수와 분리함으로써 함수를 더 재사용하기 쉽게 만들고 코드를 테스트하고 유지 관리하기 쉽게 만듭니다.

실제 예제를 통해 이를 설명해 보겠습니다. 간단한 함수가 포함된 유틸리티 모듈을 만든다고 가정해 보겠습니다.

  1. 왼쪽 파일 탐색기에서 calculator.py 파일을 엽니다.
  2. 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 함수를 재사용해 보겠습니다.

  1. 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}")
  1. 터미널에서 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 애플리케이션을 만들 수 있습니다.