python

[python] if __name__ == '__main__' : 의 정체

Meng's Computer 2021. 1. 9. 03:02

πŸ“’ κ°œμš”

μ½”λ”©ν…ŒμŠ€νŠΈλ₯Ό μ€€λΉ„ν•˜λ©΄μ„œ, 파이썬으둜 μ½”λ“œλ₯Ό κ΅¬ν˜„ν•  일이 많이 생겼닀.

근데, μ–Όλ§ˆκ°€ μ§€λ‚˜μ§€ μ•Šμ•„μ„œ, 같이 κ³΅λΆ€ν•˜λŠ”, 파이썬으둜 κ΅¬ν˜„μ„ ν•˜λŠ” λͺ‡λͺ‡ μ‚¬λžŒλ“€, μ½”λ“œλ₯Ό 보닀가..

예λ₯Όλ“€μ–΄, 두 수의 ν•©κ³Ό 곱을 κ΅¬ν•˜λŠ” μ½”λ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€κ³  치면

  • case.1
n,m = map(int,input().split())

print(n + m)
print(n * m)
  • case.2
def sum(self,a,b):
	return a + b
def mul(self,a,b):
	return a * b

if __name__ == '__main__' :
	n,m = map(int,input().split())
	print(sum(n,m))
    print(mul(n,m))

μœ„μ™€ 같이, 두가지 μΌ€μ΄μŠ€λ‘œ ꡬ뢄됐닀.

case.1이 파이썬으둜 κ°ˆμ•„νƒ„μ§€ μ–Όλ§ˆμ•ˆλœ, λ‚΄ μ½”λ“œκ΅¬ν˜„λ°©μ‹
case.2κ°€ λͺ‡λͺ‡ λΆ„λ“€μ˜ μ½”λ“œκ΅¬ν˜„λ°©μ‹

결둠만, λ¨Όμ € μ •λ¦¬ν•˜λ©΄, case.2 λ°©μ‹μœΌλ‘œ, μ•žμœΌλ‘œ μ„ ν˜Έν•˜λŠ”κ²ƒμ΄ 이상적(?)이닀.
(λ¬Όλ‘ , μœ„μ— μ˜ˆμ‹œλŠ”, μ•„μ£Ό~~κ°„λ‹¨ν•œ μ˜ˆμ‹œλ‹€λ³΄λ‹ˆ, case.1방식이 "더 보기에도, 간단해 λ³΄μ΄μ§€μ•ŠλŠλƒ" ν•  수 μžˆμ§€λ§Œ, κ·Έκ²ƒμ˜ λ¬Έμ œκ°€ μ•„λ‹ˆλ‹€.

μž‘μ€ κΈ°λŠ₯을 ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λΌλ„, 각각을 λ©”μ†Œλ“œν™” μ‹œν‚€κ³ , main(메인)μ—μ„œ ν•΄λ‹Ή 둜직이 μ‹€ν–‰λ˜κ²Œ μž‘μ„±ν•˜λŠ” μŠ΅κ΄€μ„ λ“€μ—¬μ•Ό ν•œλ‹€.

후에, μ½”λ”©ν…ŒμŠ€νŠΈμš©μ΄ μ•„λ‹ˆκ³ , ν”„λ‘œμ νŠΈκ°œλ…μœΌλ‘œ, 접근을 ν•˜κ²Œ 되면, μš°λ¦¬λŠ” λ˜ν•œ,
슀크립트파일둜 μ‹€ν–‰ν•˜λŠ” 방식 VS λͺ¨λ“ˆλ‘œ μ‚¬μš©ν•˜λŠ” 방식을 κ΅¬λΆ„ν•΄μ„œ μ•Œκ³  μžˆμ–΄μ•Όν•œλ‹€.

πŸ“’ if __name__ == '__main__' :

일단, 그럼 λ‹€μ‹œ 주제둜 λŒμ•„μ™€λ³΄μž.

if __name__ == '__main__':

파이썬 μ½”λ“œλ“€μ„ 보면, μ—¬λŸ¬ λ©”μ†Œλ“œλ‚˜, ν΄λž˜μŠ€κ°€ κ΅¬ν˜„λ˜μ–΄μžˆκ³ , λ§ˆμ§€λ§‰μ—λŠ”, μœ„μ— μ½”λ“œκ°€ 항상 λ³΄μ΄λŠ”λ°, 이게 뭘까.

πŸ‘‰ 이 μ½”λ“œμ˜ μ˜λ―ΈλŠ”, ν˜„μž¬ 슀크립트 파일이 μ‹€ν–‰λ˜λŠ” μƒνƒœλ₯Ό νŒŒμ•…ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

예λ₯Ό λ“€μ–΄λ³΄μž.

πŸ“ 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__

πŸ‘‰ 싀행을 해보면, hello.py 파일과, main.py파일의 __name__ 에 λ³€μˆ˜ 값이 좜λ ₯λ©λ‹ˆλ‹€.

νŒŒμ΄μ¬μ—μ„œ import둜 λͺ¨λ“ˆμ„ κ°€μ Έμ˜€λ©΄, ν•΄λ‹Ή 슀크립트 파일이 ν•œ 번 싀행이 λ©λ‹ˆλ‹€.
μœ„μ— μ˜ˆμ‹œλ₯Ό 보면, helloλͺ¨λ“ˆμ„ κ°€μ Έμ˜€λ©΄, hello.pyμ•ˆμ— μ½”λ“œκ°€ μ‹€ν–‰λ˜κ³ , λ”°λΌμ„œ, hello.py의 __name__ λ³€μˆ˜μ—λŠ” 'hello'κ°€ λ“€μ–΄κ°€κ³ , main.py의 __name__ λ³€μˆ˜μ—λŠ” '__main__' 이 λ“€μ–΄κ°€λŠ” 것이고, 이λ₯Ό 좜λ ₯으둜 확인 ν•  수 있죠 ?

이런 μƒν™©μž…λ‹ˆλ‹€.

즉, __name__ = λͺ¨λ“ˆμ˜ 이름이 μ €μž₯λ˜λŠ” λ³€μˆ˜μ΄κ³ 

import둜 λͺ¨λ“ˆμ„ 가져왔을 λ•Œ, λͺ¨λ“ˆμ˜ 이름이 λ“€μ–΄κ°€λŠ” 것이죠.

"파이썬 인터프리터"둜 슀크립트 νŒŒμΌμ„ 직접 μ‹€ν–‰ν–ˆμ„ λ•Œλ„ (근데,,python도 슀크립트 μ–Έμ–΄μž…λ‹ˆλ‹€.) μ—­μ‹œ 같은 κ²°κ³Όλ₯Ό λ³΄μž…λ‹ˆλ‹€. 이것은, μ½˜μ†”(터미널, λͺ…λ Ήν”„λ‘¬ν¬νŠΈ, cmd λ‹€ 같은말)μ—μ„œ python으둜 main.py을 μ‹€ν–‰ν•œλ‹€κ³  ν•΄λ΄…μ‹œλ‹€.

C:\project>python main.py
hello λͺ¨λ“ˆ μ‹œμž‘
hello.py __name__: hello
hello λͺ¨λ“ˆ 끝
main.py __name__: __main__

μ•žμ„ , 슀크립트파일 μ‹€ν–‰κ³Ό 같이, hello.py 파일의 __name__ λ³€μˆ˜μ˜ 'hello' 와 main.py 파일의 __name__ λ³€μˆ˜μ˜ '__main__' 이 λ“€μ–΄κ°€λ„€μš”.

hello.pyλ₯Ό λͺ¨λ“ˆλ‘œ 가져왔을 λ•Œ

ν•˜μ§€λ§Œ, λ‹€μŒκ³Ό 같이 python으둜 μ΄λ²ˆμ—λŠ”, main.pyκ°€ μ•„λ‹Œ !,  hello.py νŒŒμΌμ„ 싀행해보면, κ²°κ³Όκ°€ 쑰금 λ‹€λ¦…λ‹ˆλ‹€.

C:\project>python hello.py
hello λͺ¨λ“ˆ μ‹œμž‘
hello.py __name__: __main__		// 이 λΆ€λΆ„
hello λͺ¨λ“ˆ 끝

hello.pyλ₯Ό λ‹¨λ…μœΌλ‘œ μ‹€ν–‰ν–ˆμ„ 경우

μ΄λ²ˆμ—λŠ”, hello.py의 __name__ 의 λ³€μˆ˜κ°’μ— μ•žμ„  μ˜ˆμ‹œμ™€ 같은 'hello'κ°€ μ•„λ‹Œ
λͺ¨λ“ˆμ˜ 이름이 μ•„λ‹ˆλΌ( 즉, __name__ 이 μ•„λ‹ˆλΌ ) __main__ 이 λ“€μ–΄κ°‘λ‹ˆλ‹€ ! 

즉, μ–΄λ–€ μŠ€ν¬λ¦½νŠΈνŒŒμΌμ΄λ“ , 파이썬 인터프리터가 졜초둜 μ‹€ν–‰ν•œ 슀크립트 파일의 __name__ λ³€μˆ˜μ—λŠ” '__main__' 이 λ“€μ–΄κ°€λŠ” 것이죠. μ΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ "μ‹œμž‘μ (entry point)"μ΄λΌλŠ” λœ»μž…λ‹ˆλ‹€.

νŒŒμ΄μ¬μ€ 졜초둜 μ‹œμž‘ν•˜λŠ” 슀크립트 파일과 λͺ¨λ“ˆμ˜ 차이가 μ—†μŠ΅λ‹ˆλ‹€.
μ–΄λ–€ 슀크립트 νŒŒμΌμ΄λ“ , μ‹œμž‘μ μ΄ 될 수 있고, λͺ¨λ“ˆλ„ 될 수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.
κ·Έλž˜μ„œ __name__ λ³€μˆ˜λ₯Ό 톡해 ν˜„μž¬ 슀크립트파일이 μ‹œμž‘μ μΈμ§€ ? λͺ¨λ“ˆμΈμ§€ ? νŒλ‹¨ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

계속 μ–ΈκΈ‰ν•˜κ³  μžˆλŠ”,

if __name__ == '__main__' :

처럼 __name__ λ³€μˆ˜μ˜ 값이 '__main__' 인지 ν™•μΈν•˜λŠ” μ½”λ“œλŠ” ν˜„μž¬ 슀크립트파일이 ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘μ μ΄ λ§žλŠ”μ§€ νŒλ‹¨ν•˜λŠ” μž‘μ—…μΈ κ²ƒμž…λ‹ˆλ‹€.

즉, 슀크립트파일이 메인 ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ‚¬μš©λ  λ•Œμ™€, λͺ¨λ“ˆλ‘œ μ‚¬μš©λ  λ•Œλ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•œ μš©λ„λΌ μƒκ°ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

πŸ“’ 슀크립트파일둜 μ‚¬μš©ν•œ 경우 vs λͺ¨λ“ˆλ‘œ μ‚¬μš©ν•œ 경우

λ§ˆμ§€λ§‰μœΌλ‘œ, 그럼, pythonνŒŒμΌμ„ 슀크립트파일둜 μ‚¬μš©ν•œ κ²½μš°μ™€ λͺ¨λ“ˆλ‘œ μ‚¬μš©ν•œ 경우의 예λ₯Ό 보고 마무리 ν•©μ‹œλ‹€.

  • 슀크립트파일둜 μ‹€ν–‰ν•œ 경우

πŸ“ 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))

πŸ“ μ‹€ν–‰κ²°κ³Ό

// IDEμ—μ„œ μ‹€ν–‰ν•œ 경우
30
200
====================================
// λͺ…λ Ήν”„λ‘¬ν¬νŠΈ(cmd)μ—μ„œ μ‹€ν–‰ν•œ 경우
C:\project>python calc.py
30
200

IDEμ—μ„œ μ‹€ν–‰ν•˜κ±°λ‚˜, λͺ…λ Ήν”„λ‘¬ν¬νŠΈκ°™μ€ 파이썬 μΈν„°ν”„λ¦¬ν„°λ‘œ μ‹€ν–‰ν•˜λ©΄ 10,20의 ν•©κ³Ό 곱이 좜λ ₯λ©λ‹ˆλ‹€.

즉, "ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘μ " 일 λ–„λŠ”, if __name__ == '__main__' : μ•„λž˜μ˜ μ½”λ“œκ°€ 싀행이 λ˜λŠ” 것이죠.
( 이 μ˜ˆμ‹œμ—μ„œλŠ”, print(add(10,20)) , print(mul(10,20)) 이 두 μ€„μ˜ μ½”λ“œκ°€ 싀행이 λ˜λŠ” 것이죠. )

  • λͺ¨λ“ˆλ‘œ μ‚¬μš©ν•œ 경우
>>> import calc
>>> 

λͺ¨λ“ˆλ‘œ 가져왔을 λ•ŒλŠ”, 아무것도 좜λ ₯이 λ˜μ§€λŠ” μ•Šμ£  ? μ™œλƒλ©΄ __name__ λ³€μˆ˜μ˜ 값이 '__main__' 일 λ–„λ§Œ, 10,20의 ν•©κ³Ό 곱을 좜λ ₯ν•˜λ„λ‘ λ§Œλ“€μ—ˆκΈ° λ–„λ¬Έμž…λ‹ˆλ‹€.

즉, μŠ€ν¬λ¦½νŠΈνŒŒμΌμ„ λͺ¨λ“ˆλ‘œ μ‚¬μš©ν•  λ•ŒλŠ”, calc.add, calc.mul 처럼 "ν•¨μˆ˜λ§Œ μ‚¬μš©ν•˜λŠ” 것이 λͺ©μ " μ΄λ―€λ‘œ, 10,20의 ν•©κ³Ό 곱을 좜λ ₯ν•˜λŠ” μ½”λ“œλŠ” ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

μ΄λŸ΄λ•ŒλŠ”, μœ„μ—μ²˜λŸΌ, λ¨Όμ € μ‚¬μš©ν•  λͺ¨λ“ˆμ„, importμ‹œν‚¨λ‹€μŒ, λ‹€μŒκ³Ό 같이 calc.add와 calc.mul ν•¨μˆ˜μ— μ›ν•˜λŠ” 값을 λ„£μ–΄μ„œ μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

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

 

πŸ“’ μ°Έκ³ 

  • νŒŒμ΄μ¬μ€ μ™œ ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘μ μ΄ μ •ν•΄μ Έ μžˆμ§€ μ•Šλ‚˜μš” ?
    ( Cλ₯Ό μ˜ˆλ‘œλ“€λ©΄, int main(void) { } 같은 μ‹œμž‘μ μ΄ μžˆλŠ”λ°.. )

πŸ‘‰ 파이썬이 μ²˜μŒμ— 개발 될 λ‹Ήμ‹œμ—λŠ” λ¦¬λˆ…μŠ€(Linux/Unix)μ—μ„œ μ‚¬μš©ν•˜λŠ” "μŠ€ν¬λ¦½νŠΈμ–Έμ–΄" κΈ°λ°˜μ΄μ—ˆκΈ° 떄문에, ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘μ μ΄ λ”°λ‘œ μ •ν•΄μ Έ μžˆμ§€ μ•Šμ•˜λ‹€κ³  ν•©λ‹ˆλ‹€.
보톡 λ¦¬λˆ…μŠ€/μœ λ‹‰μŠ€μ˜ μŠ€ν¬λ¦½νŠΈνŒŒμΌμ€ 파일 ν•œ 개둜 이루어진 κ²½μš°κ°€ λ§Žμ€λ°μš”. 이 슀크립트 파일 μžμ²΄κ°€ "ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨" 이닀 λ³΄λ‹ˆ, μ‹œμž‘μ μ΄ λ”°λ‘œ ν•„μš”ν•˜μ§€ μ•Šμ•˜λ‹€κ³  ν•©λ‹ˆλ‹€.
ν•˜μ§€λ§Œ, μ•žμ„œλ§ν•œ "Cμ–Έμ–΄", "μžλ°”(Java)" 같은 ν”„λ‘œκ·Έλž˜λ°μ–Έμ–΄λŠ” 처음 λ§Œλ“€μ–΄μ§ˆ λ•ŒλΆ€ν„°, μ†ŒμŠ€ νŒŒμΌμ„ μ—¬λŸ¬ 개 μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έμ— μ—¬λŸ¬ μ†ŒμŠ€ 파일의 ν•¨μˆ˜λ“€ μ€‘μ—μ„œλ„ μ‹œμž‘ν•¨μˆ˜(main)을 λ”°λ‘œ μ •ν•΄ 놓은 κ²ƒμž…λ‹ˆλ‹€.

 

πŸ“’ 마무리

μ΄λ ‡κ²Œ, "파이썬" = "μŠ€ν¬λ¦½νŠΈμ–Έμ–΄" 이고, μ΄λŸ¬ν•œ μŠ€ν¬λ¦½νŠΈμ–Έμ–΄μ˜ νŠΉμ„± λ•Œλ¬Έμ—, 전에 본인이 , C,Java 같은 μ–Έμ–΄λ‘œλ§Œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜κ³  μžˆμ—ˆλ‹€λ©΄, 였늘 μ •λ¦¬ν•œ, λ‚΄μš©μ΄ λ‚―μ„  뢀뢄이 λΆ„λͺ…νžˆ μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

아무 μ΄μœ μ—†μ΄, 처음 νŒŒμ΄μ¬μ„ ν”„λ‘œκ·Έλž˜λ°μ–Έμ–΄λ‘œ  μ‚¬μš©ν•΄μ„œ, 잘 μ•Œκ³  μžˆκ±°λ‚˜, μ• μ΄ˆμ— 이런 μŠ€ν¬λ¦½νŠΈμ–Έμ–΄μ˜ νŠΉμ§•μ„ 이미 잘 μ•Œκ³  있던 μ‚¬λžŒμ΄λΌλ©΄, λ‹Ήμ—°νžˆ μ•Œκ³  μžˆλŠ” λ‚΄μš©μΌ 수 μžˆμ§€λ§Œ, ν•œλ²ˆ 쯀은, 정리λ₯Ό ν•΄μ•Όν•  λ‚΄μš©μΈ 것 κ°™μŠ΅λ‹ˆλ‹€.

였늘 λ‚΄μš©μ˜ μ €μ˜ 생각을 μ •λ¦¬ν•˜μžλ©΄, κ°„λ‹¨ν•˜κ²Œ..

  • 파이썬 μ½”λ“œλ„ μ—­μ‹œ, ν•˜λ‚˜μ˜ 파이썬 파일 μ•ˆμ—μ„œλ„, "λ©”μ†Œλ“œ" λ‚˜ "클래슀" 등을, μž‘μ€ κΈ°λŠ₯이여도 λΆ„λ¦¬μ‹œν‚€κ³ ,
    if __name__ == '__main__' : 을 ν†΅ν•΄μ„œ, ν˜ΈμΆœν•΄μ„œ μ‚¬μš©ν•˜λŠ” λ°©μ‹μ˜ μ½”λ“œ κ΅¬ν˜„μ„ 지ν–₯ν•˜μž.
  • 파이썬 ν”„λ‘œκ·Έλž¨λ„ μ—­μ‹œ, "μŠ€ν¬λ¦½νŠΈνŒŒμΌμ„ μ‹€ν–‰ν•˜λŠ” 방식"κ³Ό, ν•„μš”ν•œ λͺ¨λ“ˆμ˜ κΈ°λŠ₯만 가져와 μ“°λ„λ‘ν•˜λŠ” "λͺ¨λ“ˆμ„ import ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 방식" 이 μžˆλ‹€λŠ” 것을 μ•Œκ³ , 이 λ‘˜μ˜ μ‚¬μš©λ²•μ˜ 차이λ₯Ό μ•Œμž.

μ΄λ ‡κ²Œ λ˜λŠ”κ²ƒ κ°™μŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€. πŸ™‚

728x90
λ°˜μ‘ν˜•