오도원입니다.

건강과 행복을 위하여

Development/Python

(Python) if __name__ == "__main__"이란 무엇인가

오도원공육사 2020. 10. 6. 21:10
반응형

파이썬 개발을 하다보면 다음과 같은 코드를 자주 본다.

if __name__ == "__main__"

위 코드를 그대로 해석하면 "__name__ 이라는 변수의 값이 __main__이라면 다음 코드를 실행하라" 라는 뜻이다.

이 코드를 이해하기 위해서는 파이썬의 코드 실행방식과 __name__ 내장변수를 알아야한다.

 

1. 파이썬의 코드 실행 방식

C계열 언어 또는 자바와 같은 프로그래밍 언어에서는 항상 main()함수를 시작으로 프로그램을 실행시킨다. 하지만 파이썬은 main함수가 존재하지 않는다. 그렇다면 어떤 방식으로 코드를 실행시킬까?

 

파이썬은 크게 두 가지 특징을 가진다.

1. 들여쓰기를 통해 코드 실행의 레벨을 결정한다.

2. main이 존재하지 않는다.

 

<C 코드>

#include <stdio.h>

int sum(int num1, int num2) {
    return num1 + num2;
}

int main(){
    printf("%d", sum(1, 2));
    
    return 0;
}

<python 코드>

def sum(num1, num2)
    return num1 + num2

print(sum(1, 2))

 

파이썬 코드에서 들여쓰기를 한 return 문은 sum함수에 속해있는 코드로 볼 수 있고, print함수는 sum함수 밖에 존재한다.

 

즉, 파이썬은 main문이 없는 대신에 들여쓰기 되지 않은 Level0의 코드를 가장 먼저 실행시킨다.

2. __name__

파이썬은 다양한 정보를 담고있는 내장변수가 존재한다. 이 중에서 __name__ 내장변수에 대해서 알아보자.

 

이 변수는 현재 모듈의 이름을 담고있는 내장 변수이다. 이 변수는 직접 실행된 모듈의 경우 __main__이라는 값을 가지고, 직접 실행되지 않은 import된 모듈은 파일명(모듈의 이름)을 가지게 된다.

 

아래 코드를 통해 알아보자.

 

<코드1>

# module.py
def hello():
    print("Hello!")

print(__name__)

<코드2>

# main.py
import module

print(__name__)
module.hello()

<결과>

코드1인 module.py는 hello()함수를 가지고, __name__ 내장변수를 출력한다. 코드2인 main.py는 module.py를 import하고, __name__내장변수를 출력한다.

 

결과를 보면, main.py를 실행한다. 그러면 main.py에서 module.py가 import되면서 module.py의 코드가 한번 수행된다. moduel.py는 import된 모듈이므로 __name__내장변수의 값으로 파일명인 "module"을 가지게 된다. 그리고 main.py에서 __name__내장변수를 출력하는데 main.py는 직접 실행된 모듈이므로 __name__값을 "__main__"을 가진다. 마지막으로 module.py의 hello()함수를 호출한다.

 

따라서, 직접 실행한 파일은 __name__내장변수 값을 __main__을 가진다. 그렇지 않은 import된 모듈들은 각 파일의 이름이 __name__값으로 들어간다는 것을 알 수 있다.

 

이제 if __name__ == "__main__" 조건문을 넣어보자.

3. if __name__ == "__main__"

<코드 - 모듈>

#module.py
def hello():
    print("Hello!")

if __name__ == "__main__":
    print(__name__)

<결과>

4. 정리

모듈에 if __name__ == "__main__" 이라는 조건문은 해당 모듈을 직접 실행시켰을 때 실행되길 원하는 코드를 넣는 것이다. 

 

예를 들어 모듈내에서만 사용하는 테스트나 로그같은 출력부분들을 넣어주게 되면 실제 import될 때는 출력되지 않으면서 모듈에 사용되는 기능만을 포함시킬 수 있기 때문에 효율적인 프로그래밍이 가능하다.

 

참고.

hashcode.co.kr/questions/3/if-__name__-__main__%EC%9D%80-%EC%99%9C%EC%93%B0%EB%82%98%EC%9A%94

hyoje420.tistory.com/45

반응형