Coding Diary.

(파이썬) 모듈과 스크립트의 차이점 총정리 본문

Coding/Python

(파이썬) 모듈과 스크립트의 차이점 총정리

life-of-nomad 2024. 6. 16. 15:37
728x90
반응형

1. 모듈

  • 모듈은 여러 기능을 모아둔 파이썬 파일입니다.
  • 예를 들어, 평면도형의 면적을 구해주는 함수들을 모아서 area라는 모듈을 만들겠습니다.
PI = 3.14

# 원의 면적을 구해 주는 함수
def circle(radius):
    return PI * radius * radius
    
# 정사각형의 면적을 구해 주는 함수
def square(length):
    return length * length
  • 모듈은 파일 이름에서 .py 확장자를 빼고 부릅니다.

 

2. 모듈 임포트(import)

  • 모듈에 저장된 기능을 가져다 쓰기 위해서는 모듈을 임포트(import)하면 됩니다.
  • 모듈을 임포트하는 방법에는 여러 가지가 있습니다.

1) import <module>

  • 모듈 전체를 임포트합니다. 모듈 안에 있는 변수 또는 함수는 .으로 접근할 수 있습니다.
import area

print(area.circle(2))
print(area.PI)

2) from <module> import <member(s)>

  • 모듈에서 필요한 것만 임포트 합니다. 불러온 변수나 함수를 접근할 때 앞에 module.을 붙이지 않습니다.
from area import circle, square

print(circle(2))
print(square(3))

3) from <module> import *

  • 모듈에 있는 모든 것을 임포트 합니다.
from area import *

print(PI)
print(circle(2))
print(square(3))
  • 그런에 이 임포트 방식을 사용하면 어떤 함수가 어떤 모듈에서 왔는지 알 수가 없습니다.
  • 그래서 이 방식은 파이썬 커뮤니티에서 권장하지 않는 방식입니다.
  • 모듈을 사용할 때는 모듈을 그대로 가져오거나 모듈에서 필요한 것들만 가져오는 것이 좋습니다.

4) as 키워드

  • 임포트 문 뒤에 as 라는 키워드를 붙여서 임포트하는 것의 이름을 바꿔줄 수 있습니다.
# 모듈 이름을 바꿈
import area as ar
print(ar.circle(2))

# 함수 이름을 바꿈
from area import square as sq
print(sq(3))

 

 

3. 스크립트 vs 모듈

  • 스크립트는 실제로 프로그램을 작동시키는 코드를 담은 실행 용도의 파일을 뜻합니다.
  • 모듈은 프로그램에 필요한 변수들이나 함수들을 정의해 놓은 임포트 용도의 파일을 뜻합니다.
  • 예를 들어, 아래에 면적 계산기 프로그램은 두 파일로 구성되어 있습니다.
<area.py>

# 원의 면적을 구해 주는 함수
def circle(radius):
    return PI * radius * radius  

# 정사각형의 면적을 구해 주는 함수
def square(length):
    return length * length
  • area 파일에서는 프로그램에 필요한 함수들을 정의하기만 하고 함수들을 사용하지는 않습니다.
<run.py>

x = float(input('원의 지름을 입력해 주세요: '))
print('지름이 {}인 원의 면적은 {}입니다.\n'.format(x, area.circle(x)))

y = float(input('정사각형의 변의 길이를 입력해 주세요: '))
print('변의 길이가 {}인 정사각형의 면적은 {}입니다.'.format(y, area.square(y)))
<area.py>

PI = 3.14

# 원의 면적을 구해 주는 함수
def circle(radius):
    return PI * radius * radius  

# 정사각형의 면적을 구해 주는 함수
def square(length):
    return length * length

# circle 함수 테스트
print(circle(2) == 12.56)
print(circle(5) == 78.5)

# square 함수 테스트
print(square(2) == 4)
print(square(5) == 25)
  • 하지만 여기서 문제가 생기는데 그건 area 모듈을 임포트해도 위 테스트 코드가 실행된다는 것입니다.
  • 모듈을 임포트하면 모듈 안에 있는 코드가 처음부터 끝까지 모두 실행되기 때문입니다.
  • 이 문제를 해결하기 위해서는 __name__이라는 특수 변수를 사용해야 합니다.

 

4. name 특수 변수

1) name 의 뜻

  • __name__ 은 모듈의 이름을 저장해놓은 변수입니다.
  • __name__ 의 값은 파이썬이 알아서 정해줍니다.
    • 파일을 직접 실행하면 __name__은 __main__ 으로 설정됩니다.
    • 파일을 임포트하면 __name__은 모듈 이름으로 설정됩니다.
  • 예를 들어, area 파일에서 __name__을 아래 처럼 출력해보면
<area.py>

print(__name__)
  • area 파일을 직접 실행할 경우 __main__ 이라고 나오고
__main__
  • area 파일을 임포트 할 경우 area라고 나오게 됩니다.
area

2) if __name__ == '__main__'

  • __name__을 사용하면 파일이 직접 실행되냐 아니면 임포트되냐에 따라서 코드의 흐름을 제어할 수 있습니다.
  • 파일이 직접 실행될 때만 실행하고 싶은 코드는 if __name__ == '__main__' 이라는 조건문 안에 넣어주면 됩니다.
<area.py>

PI = 3.14

# 원의 면적을 구해 주는 함수
def circle(radius):
    return PI * radius * radius  

# 정사각형의 면적을 구해 주는 함수
def square(length):
    return length * length
    
if __name__ == '__main__':
     # circle 함수 테스트
    print(circle(2) == 12.56)
    print(circle(5) == 78.4)

    # square 함수 테스트
    print(square(2) == 4)
    print(square(5) == 25)
  • area 파일을 직접 실행시키면 파일의 __name__ 은 __main__ 이 되기 때문에 조건문 안에 있는 코드가 실행되지만 area 파일을 임포트하면 __name__은 area가 되기 때문에 조건문 안에 코드가 실행되지 않습니다.
  • 따라서 area 파일을 모듈처럼 쓸 수 있고 스크립트 처럼 쓸 수도 있게 되는 것입니다.
728x90
반응형