파이썬 코드를 보다 보면 가끔 if __name__ == "main":를 보게 되는데, 그 의미에 대해서 한 번 생각해보자. 먼저 name 이라는 것은 인터프리터가 실행되기전 만들어 놓는 글로벌 변수이며, 그 변수의 값으로는 main 혹은 모듈의 이름이 들어간다. (여기서 모듈이란 함수나 변수 또는 클래스를 모아 놓은 파일을 말하며, 모듈은 다른 파이썬 프로그램에서 import하여 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있다.) 다시말해, 파이썬 인터프리터가 최초로 실행한 스크립트 파일의 name에는 'main'이 들어가며 모듈로써 실행되는 파일의 name에는 해당 모듈의 이름이 들어가는 것이다. 다음의 예를 통해서 이 말의 의미를 정확하게 이해할 수 있을 것이다.
먼저 하나의 파이썬 파일만 있는 경우만 생각해보도록 하자.
# jaeyi.py
print('jaeyi.py의 __name__:', __name__) # jaeyi.py의 __name__에 할당되어 있는 변수를 출력
# 실행 결과
jaeyi.py의 __name__: __main__
하나의 파이썬 파일을 실행시키면 해당 파일이 최초로 실행된 스크립트 파일이으로 해당 파일의 name의 값에는 'main'이 할당된다.
다음으로는 하나의 파이썬 파일(main.py)에서 다른 파이썬 파일(junho.py)을 import하는 경우를 살펴보도록 하자.
# junho.py
print('junho 모듈 시작')
print('junho.py의 __name__:', __name__) # junho.py의 __name__에 할당되어 있는 변수를 출력
print('junho 모듈 끝')
# main.py
import junho # junho 모듈을 import
print('main.py의 __name__:', __name__) # main.py의 __name__에 할당되어 있는 변수를 출력
위와 같이 두 개의 파이썬 파일을 만든 다음, main.py 내에서 junho 모듈을 import하고 main을 실행시키면 아래와 같은 결과가 나오게 된다.
# 실행 결과
junho 모듈 시작
junho.py의 __name__: junho
junho 모듈 끝
main.py의 __name__: __main__
위의 결과에서 처럼 최초로 실행한 파일의 name에는 'main'이 들어가고, 모듈로 import한 파일의 name에는 해당 모듈의 이름이 들어가는 것을 확인할 수 있다.
그렇다면 이러한 이해를 바탕으로 왜 if name == "main": 구문이 필요한지 살펴보도록 하자.
# operations.py
def add(a,b):
sum = a + b
return sum
if __name__ == "__main__":
print(add(10,20))
# main.py
from operations import add
print(add(20,30))
# 실행 결과1: operations.py를 실행시킨 경우
30
# 실행 결과2: main.py를 실행시킨 경우
50
만약 위와 같은 두 개의 파이썬 파일이 있을 때, operations.py만 실행시키게 되면 add(10,20)의 결괏값 30을 출력하지만 main.py에서 operations을 import하여 사용하게 되면 operations.py내의 name은 더 이상 main이 아니기 때문에 if name == "main": 내의 함수를 실행시키지 않고 add(20,30)만 실행하여 50의 결과를 출력하게 된다.
이와 같이 if name == "main": 문은, 해당 파일이 처음 실행이 시작되는 파일일 경우에만 실행하고 import되어 모듈로써 사용될 때에는 실행되지 않도록 하고 싶은 동작이 있을 경우에 이용하도록 한다.