[Python] if __name__ == “__main__”은 왜 필요할까?

Suhyeon Lee·2025년 1월 9일
0

자기주도학습

목록 보기
73/83

출처 1 2

if name == “main”의 의미

  • 파이썬 소스코드를 보다보면 자주 마주하게 되는 한 줄 → 왜 쓸까?
if __name__ == "__main__":
    //코드
    //코드
  • 그대로 해석해보면 'name이라는 변수의 값이 main이라면 아래의 코드를 실행하라.'라는 뜻
    • 해당 모듈이 임포트된 경우가 아니라 인터프리터에서 직접 실행된 경우에만, if문 이하의 코드를 돌리라는 명령
    • 메인 함수의 선언, 시작을 의미
    • 현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용
  • __name__
    • interpreter가 실행 전에 만들어 둔 글로벌 변수

모듈을 실행할 수 있는 방법: 직접 실행하거나 임포트하거나

  • 예시: excuteThisModule.py 모듈
//excuteThisModule.pydef func():
    print("function working")
if __name__ == "__main__":
    print("직접 실행")
    print(__name__)
else:
    print("임포트되어 사용됨")
    print(__name__)
  • 이 모듈을 실행할 수 있는 방법은 두 가지:

    1. 인터프리터에서 직접 실행
      python3 executeThisMoudle.py
    2. 다른 모듈에 임포트해서 실행
    import executeThisMoudle.py
    executeThisMoudle.func()
  • 1처럼 인터프리터에서 직접 실행하면, __name__ 변수에 “__main__”이 담겨서 프린트됨

직접실행
__main__
  • 반면, 2처럼 모듈에서 임포트해서 실행하면, __name__변수에 “executeThisModule”이 담겨서 프린트됨
임포트되어 사용됨
executeThisModule
  • 즉, __name__ == __main__은 인터프리터에서 직접 실행했을 경우에만 if문 내의 코드를 돌리라는 명령이 된다!

더 알아보기

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

  • C언어 또는 자바와 같은 프로그래밍 언어에서는 항상 main()이라는 함수를 시작으로 프로그램을 실행시키지만 파이썬은 main 함수가 없음
    • 파이썬의 두 가지 특징
      1. main이 없음
      2. 들여쓰기를 통해 코드 실행 레벨 결정
      → 그렇다면 어떤 방식으로 코드를 실행시키는 것일까?

예시

# 코드 - 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__
    • 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__ 변수를 통해 현재 스크립트 파일이 시작점인지 모듈인지 판단한다.

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
>>> 
  • import로 calc를 가져와서 calc.py를 모듈로 사용하면 아무것도 출력되지 않음
    • 스크립트 파일을 모듈로 사용할 때는 calc.add, calc.mul처럼 함수만 사용하는 것이 목적이므로 10, 20의 합과 곱을 출력하는 코드는 필요가 없기 때문
    • 이때는 아래와 같이 calc.add와 calc.mul 함수에 원하는 값을 넣어서 사용하면 됨
>>> calc.add(50, 60)
110
>>> calc.mul(50, 60)
3000

정리

if __name__ == '__main__':처럼 __name__ 변수의 값이 __main__인지 확인하는 코드는 현재 스크립트 파일이 프로그램의 시작점이 맞는지 판단하는 작업이다.
즉, 스크립트 파일이 메인 프로그램으로 사용될 때와 모듈로 사용될 때를 구분하기 위한 용도!
쉽게 생각하면 모듈에 if __name__=='__main__'이라는 조건문을 넣어주고 그 아래는 직접 실행시켰을 때만 실행되길 원하는 코드들을 넣어주는 것으로 생각하면 쉬울 것이다.

profile
2 B R 0 2 B

0개의 댓글

관련 채용 정보