728x90

아래와 같은 한줄의 코드를 보고 이게 무슨 의미인지, 왜 쓰는표현지 궁금해서 알아봤다.

if__name__ == "__main__"


이를 알아보려면 먼저 파이썬에서의 namespace라는 개념을 알아야 한다.

파이썬은 list, string, integer, function(names)들을 모두 객체로 표현하고,

name(변수명)은 그 객체에 접근하기 위해 사용한다.

 

namepscaename들을 담을 수 있는 공간으로 생각하면 된다.

 

그리고, module에 대해서 알아보면

module은 파이썬 코드를 담고 있는 파일이다. 그리고, 그 파일에는 클래스, 함수, 변수 모음 등이 있을 수 있다.

 

모듈은 자신만의 유일한 namespace를 갖는다. 그래서 동일한 모듈에서 동일한 이름을 가지는 클래스 및 함수는 

정의할 수 없다.

즉, 모듈은 namespace가 각각 다르기 때문에, 두 모듈이 있다고 했을때, 같은 이름을 가지는 클래스, 함수를 정의 할 수 있다.


namespace를 조금 더 알기 위하여: 객체란 무엇인가?

example = 4118

위와 같은 예시가 있을때,

 

1. 4118이라는 값이 메모리에 할당된다.

2. 변수 example 또한 메모리 어딘가에 할당되는 공간이며, 4118이라는 객체의 메모리 주소값이 저장

=> 변수 example은 4118이라는 값의 객체를 가리킨다.

 

ex1 = 4118
ex2 = 4118

>>> id(x), id(y)

자 이렇게, 다른 변수명 두개를, 같은 값을 할당하는 코드를 하여, id함수에 넣으면

각각 주소값이 다를 것인가 같을 것인가?

 

결과는 같은 메모리 주소를 가리킨다.

(메모리의 절약을 위해 ex1의 주소를 ex2가 가리키는 것이다.)

 

 

하지만

항상 위와 같은 방식으로 메모리 주소를 할당하는 것이 아니다.

파이썬은 Integer 중 자주 사용할 것 같은 범위의 정수값메모리에 올려두고,

 

이를 여러 변수가 가리키게 하는 것이다.

 

즉, 파이썬이 판단하기에 자주 사용하지 않을것 같은 Integer는 같은 값이여도

변수마다 객체의 주소가 다를 수 있다.


namespace 와 관련이 있는 상황 : 모듈을 import할때 2가지 방법이 있다.

 

situation 1.) import module_name

=> 이 방식으로 import를 하면, module의 name을 prefix로 명시 해줘야 모듈의 namespace에 접근 할 수 있다.

 

ex1) import sys

sys.stdin.readline()

 

situation 2.) from module_name import path

=> 이 방식으로 import를 하면, namespace에서 지정된 names을 가져온다. 이렇게 하면 prefix로 명시 하지 않아도 접근이 가능하다. 그렇지만, 그 외의 main 코드에서 동일한 변수명을 가지면, 나중에 정의된 변수명으로 기능이 대체돼 접근이 불가능해진다. 따라서 (권장X)


* namespace

* 객체

* 모듈

* import 에 대해서 알아보았으니 사전 지식은 채워졌다.

 

본격적으로 if__name__ == "__main__" 에 대해서 알아보자

 

파이썬인터프리터 언어로,

인터프리터가 소스를 읽고, 그 코드를 실행하기전에 특정 변수값을 정의한다.

 

그중 하나가 __name__이라는 변수를 __main__으로 셋팅을 한다.

 

다시 말해서, cmd 등 쉘에서 python test.py 와 같은 명령어로 직접 실행하는 경우

 

인터프리터가 해당 test.py 모듈을 script라는 namepsace가 아닌 __main__이라는 namespace로 간주한다

 

내가 구현한 코드가 실행되는 방법은

 

1 : 모듈로써 import 될 경우

 

2 : 인터프리터에 의해 직접 실행되는 경우

 

이렇게 두 가지인데,

 

[*] 결론적으로 [*]

 

[*] if__name__ == "__main__" 라는 구문이 있으면

 

[*] 인터프리터에 의해 실행됐을때(import 되어 사용되는 경우가 아닐때) 코드가 동작되도록 하는 것이다.

728x90
복사했습니다!