달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

다른 사람의 Python 코드를 보다가 if __name__ == '__main__' 이라는 코드를 본적이 있다.

직감적으로 아~~~ 여기부터 main이구나, Python은 Entry Point를 이렇게 정의하는구나라고 생각했다.

반은 맞고 반은 틀렸다. 정확히 말하면 '현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용하는 코드' 이다.

 

정확한 표현은 

 

if __name__ == '__main__'

     '코드'

 

이다.

이 코드의 의미는 __name__ 이라는 변수 값이  '__main__' 이라면 코드를 실행하라는 뜻이다. 

__name__ 변수의 값이 '__main__' 이면 '코드' 부터 시작하도록 하면 된다. '코드' 가 main 함수가 되는 것이다.

__name__이 변수라면 이 변수는 어디에 선언/정의되어 있는 것일까? 변수라면 어떤 값들을 가질 수 있는 것일까?

도대체 이 코드는 왜 사용하는 것일까?

 

  • __name__ 변수는 어디에 선언/정의 되어 있는 걸까?

__name__은 Python의 내장변수이다. Python 내부 어딘가에 선언/정의되어 있다는 뜻이다. 선언/정의되어 있는 정확한 위치는 Python Document를 찾아보면 된다.( 나도 모른다는 소리이다.)

 

  • 변수라면 어떤 값들을 가질 수 있는 것일까?

__name__ 은 모듈의 이름을 저장하는 변수다. import로 모듈을 가져올 때는 __name__에 모듈의 이름이 저장되고, import가 아니라 모듈을 실행 시킬때는 __name__ 안에 '__main__' 이라는 값이 저장된다.

 

  • 도대체 이 코드는 왜 사용하는 걸까?

Python은 모듈 단위로 실행되며 하나의 파일은 하나의 모듈이다. Python은 초기 탄생할 때 리눅스/유닉스에서 하나의 모듈, 파일로 실행, 사용했다. 그렇기 때문에 main함수가 없고 들여쓰기 하지 않는 모든 코드를 실행한다. 다만 함수나 클래스는 정의되었지만 호출되지 않는 이상 실행되지는 않는다. 사람사는게 어찌 생각한대로만 되던가...

Python은 OS의 단순 스크립터를 뛰어 넘어 광범히하게 여러군데서 사용하게 되었고 하나의 모듈, 파일 단위가 아니라 C/C++, Java 처럼 한 프로젝트에 여러개의 모듈, 파일을 가지게 되었다. 

여기서 문제가 생겼다. Python은 모듈단위로 실행 시킬 수 있다면서, import로 포함하는 것도 하나의 모듈이고 이 것도 import하자마자 실행 되겠네.

 

이 문제를 해결하기 위해 if __name__ == '__main__'  코드를 사용하는 것이다.

Python 각 모듈에 

 

if __name__ == '__main__'

     '코드'

 

이 코드가 있다면, 서두에서도 말했듯이 '현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용하는 코드' 이고 모듈을 import로 사용하면 __name__ 에 모듈명이 저장되기 때문에 if 구문에 False가 되어 import 한 모듈은 실행이 안되는 것이다. import를 모듈이 아니라 실행 모듈에서는 __name__'__main__' 이 저장되고 if 구문이 True가 되어 실행이 된다. 

 

아래 몇 가지만 기억하자

  1. __name__ 은 Python의 내장변수이다. 
  2. __name__ 변수는 '현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용하는 코드' 이다.
  3. import한 모듈에서는 __name__에 모듈명이 들어가고 실행시킨 모듈에서는 __name__'__main__' 이 저장된다.

 

결론을 말하자면 

  1. __name__ 내장변수는 모듈과 Entry Point를 구분하기 위해 사용한다.
  2. 파이썬은 최초로 시작하는 스크립트 파일과 모듈의 차이가 없다.
  3. 모듈이 메인 프로그램으로 사용될 때와 import한 모듈로 사용될 때를 구분하기 위한 용도이다.
  4. if __name__ == '__main__' 에서 __name__변수의 값이 '__main__' 인지 확인하는 코드는 현재 파일이 프로그램의 시작점이 맞는지 판단하는 작업이다.

 

코드짜기 귀찮아서 코드없이 글로만 설명하고 끝낸다. 더 정확히 말하자면 코드없이 글로 이해하기 위해 부러 코드를 짜지 않았다.

코드없이 글로만 설명했더니 장황하다...ㅎㅎㅎ

 

 

 

Posted by 생짜
|