Published on

5단계: 모듈과 패키지

5-1. 모듈이란?

모듈은 .py 확장자 하나의 파일로 구성되며, 함수, 변수, 클래스 등을 포함할 수 있습니다.

# calc.py
def add(a, b):
    return a + b
# main.py
import calc
print(calc.add(2, 3))  # 5

5-2. import 방식

import math
from math import sqrt
import math as m
  • import 모듈: 전체 불러오기
  • from 모듈 import 항목: 선택 불러오기
  • as: 별칭 지정

5-3. 사용자 정의 모듈

모듈 파일을 프로젝트 디렉토리에 두고 직접 import 합니다.

from my_utils import greet

구조:

/project
  main.py
  my_utils.py

5-4. 패키지란?

여러 모듈을 디렉토리로 묶은 구조. __init__.py 파일이 반드시 존재해야 합니다.

/mypkg
  __init__.py
  calc.py
  string_util.py

사용 예:

from mypkg import calc
from mypkg.string_util import clean

5-5. name == "main"

# module.py
def run():
    print("실행됨")

if __name__ == "__main__":
    run()

직접 실행 시에만 동작하고 import 시에는 실행되지 않습니다.


5-6. 모듈 캐싱

Python은 import 시 모듈을 메모리에 캐싱합니다.
다시 import해도 다시 실행되지 않습니다.
수정 후 재실행 시 인터프리터를 재시작하는 것이 안전합니다.


5-7. 상대 경로와 절대 경로

  • 절대 경로: 루트부터 명시 (project.mypkg.module)
  • 상대 경로: ... 사용 (from . import helper)

상대 경로는 패키지 내부 구조에서만 사용 가능합니다.


요약

  • 모듈은 하나의 .py 파일, 패키지는 모듈을 포함한 폴더
  • 다양한 import 방식으로 구조적으로 관리 가능
  • __name__ == "__main__"으로 직접 실행 여부 판단
  • __init__.py는 패키지 인식에 필요하며, 상대 경로 import는 구조를 명확히 할 때 유용

심화학습

Q1. import 시 실행되지 않게 하려면 어떤 문법을 사용해야 하나요?
A1. if __name__ == "__main__" 블록을 사용하여, 직접 실행된 경우에만 코드를 실행하도록 합니다.


Q2. 모듈 캐싱이 개발 중 문제를 일으킬 수 있는 경우는?
A2. 수정된 모듈이 자동으로 반영되지 않고 예전 버전이 재사용될 수 있어, Python REPL을 재시작해야 할 수 있습니다.


Q3. from-import와 import 차이는 무엇이며 언제 구분해서 써야 할까?
A3. from은 명확한 대상 접근에 좋고, import는 전체 네임스페이스 구분을 명확히 할 수 있습니다. 충돌 위험이 있으면 import가 더 안전합니다.