if __name__ == “__main__”은 왜 필요한지에 대해 알아보자

김민주·2022년 1월 10일
8
post-thumbnail

파이썬의 모듈에 아래와 같은 코드가 존재할 때가 있다.

if __name__=="__main__"

그대로 해석해보면 'name이라는 변수의 값이 main이라면 아래의 코드를 실행하라.'라는 뜻이다. 즉, 메인 함수의 선언, 시작을 의미이며, 현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용한다.

라고 해도 잘 이해가 가지 않으니 좀 더 파헤쳐보자.

위 코드를 이해하기 위해서는 1) 파이썬의 코드 실행방식2) __name__ 내장변수를 알 필요가 있다.

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

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

  • main이 존재하지 않는다.
  • 들여쓰기를 통해 코드 실행의 레벨을 결정한다.

아래 예시를 살펴보자

# 코드 - C
int sum(int num1, int num2) {
    return num1 + num2;
}

int main() {
    printf("%d", sum(1, 1));

    return 0;
}
# 코드 - Python
def sum(num1, num2)
    return num1 + num2
print(sum(1, 1))

둘 다 두 수를 더해서 출력해주는 코드이지만 차이점이 눈에 띈다.

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

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

2) __name__ 내장변수

파이썬 공식 사이트에서는 __name__ 내장변수를 아래와 같이 정의하고 있다.
__name__ : The __name__ attribute must be set to the fully-qualified name of the module. This name is used to uniquely identify the module in the import system.

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

아래 예시를 살펴보자

# hello.py
print('hello 모듈 시작')
print('hello.py __name__:', __name__)    # __name__ 변수 출력
print('hello 모듈 끝')
# main.py
import hello    # hello 모듈을 가져옴
print('main.py __name__:', __name__)    # __name__ 변수 출력
# 실행결과
hello 모듈 시작
hello.py __name__: hello
hello 모듈 끝
main.py __name__: __main__

파이썬에서 import로 모듈을 가져오면 해당 스크립트 파일이 한 번 실행된다. 따라서 hello 모듈을 가져오면 hello.py 안의 코드가 실행됩니다. 따라서 hello.py의 __name__ 변수에는 'hello'(import된 모듈은 모듈의 이름(파일명))가 들어가고, main.py의 __name__ 변수에는 '__main__'이 들어간다.

어떤 스크립트 파일이든 파이썬 인터프리터가 최초로 실행한 스크립트 파일의 __name__에는 __main__이 들어간다. 이는 프로그램의 시작점(entry point)이라는 뜻이다.

파이썬의 코드 실행방식과 연관되어 파이썬은 최초로 시작하는 스크립트 파일과 모듈의 차이가 없다. 어떤 스크립트 파일이든 시작점도 될 수 있고, 모듈도 될 수 있다. 그래서 __name__ 변수를 통해 현재 스크립트 파일이 시작점인지 모듈인지 판단한다.

여기까지 1) 파이썬의 코드 실행방식2) __name__ 내장변수를 알아보았다.

if __name__=="__main__"

우리가 알아보고자 했던 위 코드에 대해서는 예를 통해 이해해보자.

# calc.py
def add(a, b):
    return a + b
 
def mul(a, b):
    return a * b
 
if __name__ == '__main__':    # 프로그램의 시작점일 때만 아래 코드 실행
    print(add(10, 20))
    print(mul(10, 20))
# 실행결과
30
200

IDLE에서 실행하거나 python calc.py와 같이 파이썬 인터프리터로 실행하면 10, 20의 합과 곱이 출력된다. 즉, 프로그램의 시작점일 때는 if __name__ == '__main__': 아래의 코드가 실행된다.

이번엔 반대로 import로 calc를 가져와서 calc.py를 모듈로 사용해 보자.

>>> import calc
>>> 

모듈로 가져왔을 때는 아무것도 출력되지 않는다. 스크립트 파일을 모듈로 사용할 때는 calc.add, calc.mul처럼 함수만 사용하는 것이 목적이므로 10, 20의 합과 곱을 출력하는 코드는 필요가 없다. 이때는 아래와 같이 calc.addcalc.mul 함수에 원하는 값을 넣어서 사용하면 된다.

>>> calc.add(50, 60)
110
>>> calc.mul(50, 60)
3000

<정리해보자>

if __name__ == '__main__':처럼 __name__ 변수의 값이 __main__인지 확인하는 코드는 현재 스크립트 파일이 프로그램의 시작점이 맞는지 판단하는 작업이다. 즉, 스크립트 파일이 메인 프로그램으로 사용될 때와 모듈로 사용될 때를 구분하기 위한 용도!

쉽게 생각하면 모듈에 if __name__=='__main__'이라는 조건문을 넣어주고 그 아래는 직접 실행시켰을 때만 실행되길 원하는 코드들을 넣어주는 것으로 생각하면 쉬울 것이다. 끝 :)

<출처>

파이썬 코딩 도장

https://medium.com/@chullino/if-name-main-%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C-bc48cba7f720

https://hyoje420.tistory.com/45

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

https://madplay.github.io/post/python-main-function

profile
안녕하세요 :-) 잘 부탁드립니다!

0개의 댓글