티스토리 뷰

 

 

1.  if __name__ == "__main__"  : 이 코드는 뭐야?

 특이한 코드를 발견했다.

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

 

도대체 이 코드를 무엇인가?

조건문인건 알겠는데  __name__  은 무엇이고, __main__ 은 무엇인가?

 

구글서치, 유튜브에서 얻은 정보로 바탕으로 내가 이해한 부분을 기록해 둔다.

 

2.  __name__ 

우선 __name__ 부터 알아보자. 

 

파이썬 코드를 작성할때 비슷한 기능의 함수나 클래스를 매번 작성한다면 코드가 길어지는 건 당연하고 만약에 함수를 수정해야 한다면 일일이 수정해야하는 번거러움 또는 비효율성을 해소하기 위해 모듈과 패키지를 만들고 이를 다시 가져와서 사용하고 있다. 

 

다시 돌아와 파이썬 코드파일(.py)에는 __name__라는 변수가 있다. 이 변수는 모듈의 이름을 가지고 있는 변수이다. 예를 들면 hello.py 라는 모듈에 __name__ 변수는 "hello" 라는 문자열을 가지고 있게 된다.

 

 

3.  if __name__ == "__main__"  : 은 왜 사용하는 걸까?

main.py 가 있다.

hello.py를 import 해서 hello 함수를 모듈로 사용하고자 한다. 인수에 "You"를 넣어 실행해보자. 

#hello.py

def hello(name):
	return f'Hello {name}'
print(hello("Rogers"))
#main.py

import hello

print(hello.hello("You"))

main.py를 실행해보면 출력결과는 아래와 같다.

#main.py 실행결과

Hello Rogers
Hello You

내가 원하는 출력결과가 아니다. "Hello you"를 원하는데 "Hello Rogers"도 출력된다.

print(hello("Rogers"))를 실행하고 싶지는 않다.

 

이 경우 if __name__ == "__main__" 를 사용한다. 

hello.py를 아래와 같이 수정하고 main.py는 그대로 두자.

#hello.py

def hello(name):
	return f'Hello {name}'

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

스크립트를 실행하면 내가 원하던 "Hello you"가 출력된다.

#main.py 실행결과

Hello You

if __name__ == "__main__"  가 False 이기 때문에  print(hello("Rogers")) 가 실행이 안되는 것이다.

 

앞에서 파이썬 코드파일(.py)에는 __name__라는 변수가 있고 이 변수는 모듈의 이름을 가지고 있는 변수있다고 했다. 따라서 hello.py 라는 모듈에 __name__ 변수는 "hello" 라는 문자열이 할당되기 때문에 "hello" == "__main__"  이기때문에 이 조건문은 False 이다.

 

하지만 hello.py 를 단독으로 실행한다면 if __name__ == "__main__"  가 True 이기 때문에 "Hello Rogers"가 출력된다. 

앞서 hello.py 라는 모듈에 __name__ 변수는 hello 라는 문자열이 있다고 했지만, hello.py 가 모듈로 실행되지 않기 때문에 __name__ 변수에는 문자열 "__main__"이 할당된다.

 

정리하자면,

import 되어 실행되면 __name__ 에는 모듈명(파일명) 할당되고, 모듈이 직접실행되면 문자열 "__main__"이 할당된다. 따라서 import 되어 실행되면 if __name__ == "__main__"  이하 코드는 실행되지 않고(모듈의 전체가 실행되지 않고) 원하는 부분만 실행될수 있는 것이다.

 

이게 왜 필요한지는 체감이 되지 않으나, 모듈이라는 것이 앞서 얘기한데로 반복해서 사용할 경우 비효율성을 제거하기 위해 사용한다는 목적이기 때문에 모듈의 일부분만을 사용해야할 필요가 있지 않을까 한다. 

 

모듈의 시작점을 정하기 위해 사용한다고 하는데 이 부분은 이해가 어려운 부분이고, 초보자들은 import 된 모듈의  if __name__ == "__main__"  이하 코드는 실행이 안된다고 알면 될듯하다.

 

4.  Chatgpt 는?

chatgpt에게 if __name__ == "__main__" 코드가 필요한 이유에 대해서 물어보았더니 다음과 같은 답을 내놓았다.

 

if __name__ == "__main__": 구문은 모든 경우에 꼭 필요한 것은 아니지만 Python 스크립트에서 일반적이고 권장되는 방법입니다. 사용 이유는 다음과 같습니다.

모듈성 및 재사용성: Python 스크립트를 작성할 때 다른 컨텍스트에서 사용하려고 할 수 있습니다. if __name__ == "__main__":을 사용하면 스크립트가 직접 실행될 때 실행할 코드를 다른 스크립트에서 가져와서 재사용할 수 있는 코드와 분리할 수 있습니다.

의도하지 않은 실행 방지: 이 구문을 사용하지 않고 스크립트에 함수 또는 클래스 외부의 실행 가능한 코드가 포함되어 있는 경우 스크립트를 다른 스크립트의 모듈로 가져올 때마다 해당 코드가 실행됩니다. 이로 인해 의도하지 않은 부작용이나 불필요한 실행이 발생할 수 있습니다.

테스트 및 디버깅: if __name__ == "__main__":을 사용하면 해당 블록 내에 테스트 코드 또는 디버깅 문을 넣을 수 있습니다. 이를 통해 스크립트를 가져올 수 있는 다른 스크립트에 영향을 주지 않고 스크립트의 동작을 빠르게 테스트할 수 있습니다.

모범 사례: 반드시 필요한 것은 아니지만 모범 사례를 따르면 코드를 읽거나 공동 작업하는 다른 사람들이 코드를 더 이해하고 유지 관리할 수 있습니다.

본질적으로 if __name__ == "__main__":을 사용하면 스크립트가 직접 실행될 때 실행되는 코드와 다른 곳에서 가져올 수 있는 코드를 구별하는 명확하고 표준화된 방법을 제공합니다. 이러한 분리는 더 나은 코드 구성 및 재사용성에 기여합니다.

 

5. 참고자료

https://velog.io/@jeewoo1025/Python-name-%EC%9D%B4%EB%9E%80

https://wikidocs.net/195615

https://dojang.io/mod/page/view.php?id=2448