📢 개요
코딩테스트를 준비하면서, 파이썬으로 코드를 구현할 일이 많이 생겼다.
근데, 얼마가 지나지 않아서, 같이 공부하는, 파이썬으로 구현을 하는 몇몇 사람들, 코드를 보다가..
예를들어, 두 수의 합과 곱을 구하는 코드를 구현한다고 치면
- 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__' 이 들어가네요.
하지만, 다음과 같이 python으로 이번에는, main.py가 아닌 !, hello.py 파일을 실행해보면, 결과가 조금 다릅니다.
C:\project>python hello.py
hello 모듈 시작
hello.py __name__: __main__ // 이 부분
hello 모듈 끝
이번에는, 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 해서 사용하는 방식" 이 있다는 것을 알고, 이 둘의 사용법의 차이를 알자.
이렇게 되는것 같습니다. 감사합니다. 🙂
'python' 카테고리의 다른 글
[Flask] (3) 렌더링 템플릿 & Jinja2 & 간단한 게시판 (0) | 2021.01.24 |
---|---|
[Flask] (2) REST & HTTP Method & API/End Point (0) | 2021.01.22 |
[Flask] (1) Intro & URL Routing & Variable Rules & jsonify( ) (1) | 2021.01.21 |
[python] 문자열 정규표현식 정리 (0) | 2021.01.14 |
[python] sort( ) 에 대해서 알아봅시다. (0) | 2021.01.08 |