computer science
모듈과 패키지: 코드의 재사용성과 조직성을 높이는 방법
모듈은 독립적인 기능을 수행하는 코드 단위이며, 패키지는 관련 있는 모듈들을 묶어놓은 것이다. 이를 통해 코드의 중복을 줄이고 유지보수성을 향상시킬 수 있다. 효과적인 모듈화와 패키징은 대규모 프로젝트에서 필수적이다.
송민성3분 읽기
1. 개념
모듈(Module)은 특정 기능을 수행하는 독립적인 코드 단위다. 함수와 클래스, 변수를 담고 있고, 다른 프로그램에서 불러다 쓰도록 설계한다. 레고 블록처럼 기능별로 쪼개 놓은 코드라고 보면 된다.
패키지(Package)는 관련 있는 모듈을 묶어 놓은 것이다. 디렉토리 구조로 계층을 잡고, 이름 공간을 제공해 모듈 간 이름 충돌을 막는다. 더 큰 레고 상자인 셈이다.
2. 왜 사용하는가
- 코드 재사용: 같은 기능이 여러 곳에 필요할 때 모듈로 만들어 둔 코드를 가져다 쓰면 중복이 줄어든다.
- 유지보수: 문제가 생기면 해당 모듈만 고치면 되니 손이 덜 간다.
- 협업: 개발자마다 다른 모듈을 맡아 따로 개발하니 함께 일하기 편하다.
- 가독성: 코드 구조가 뚜렷해져 읽기 쉬워진다.
3. 동작 원리
프로그래밍 언어는 모듈과 패키지를 불러오는 장치를 갖추고 있다. 보통 import 키워드를 쓰면 지정된 경로에서 해당 모듈이나 패키지를 찾아 메모리에 올린다. 그때부터 그 모듈의 함수나 클래스를 쓴다.
4. 코드 예제 (Python)
my_module.py - 간단한 사칙연산 모듈
my_module.py
def add(x, y):
"""두 수를 더합니다."""
return x + y
def subtract(x, y):
"""두 수를 뺍니다."""
return x - ymain.py - my_module을 사용하여 사칙연산 수행
main.py
import my_module
result = my_module.add(5, 3)
print(f"5 + 3 = {result}")
result = my_module.subtract(10, 4)
print(f"10 - 4 = {result}")5. 시간 복잡도 또는 성능 특성
모듈과 패키지 자체의 동작은 파일 시스템 접근과 메모리 로딩이 전부다. 성능에 미치는 영향도 모듈과 패키지의 크기, 개수를 따라간다. 작은 모듈 여럿을 적당히 쓰는 정도로는 성능이 떨어지지 않는다. 다만 import가 지나치게 많으면 초기 로딩 시간이 늘어난다.
6. 실무 사용 사례
- 웹 프레임워크: Django, Flask 같은 웹 프레임워크는 여러 기능을 모듈로 나눠 제공한다. 데이터베이스 연동, 사용자 인증, 템플릿 엔진이 각각 하나의 모듈이다.
- 데이터 분석 라이브러리: NumPy, Pandas는 수많은 함수를 모듈 단위로 묶어, 사용자가 필요한 기능만 골라 가져다 쓰게 한다.
- UI 컴포넌트 라이브러리: React, Vue 같은 UI 컴포넌트 라이브러리는 재사용 가능한 UI 요소를 모듈이나 패키지로 내놓는다.
7. 주의할 점
- 순환 참조(Circular Dependency): 모듈 A가 B를 import하고 B가 다시 A를 import하면 순환 참조 오류가 난다. 코드 구조를 미리 신중히 설계해 막는다.
- 과도한 의존성: 한 모듈이 너무 많은 모듈에 기대면 결합도가 높아져 유지보수가 어려워진다. 의존성은 되도록 줄이는 쪽이 낫다.
- 네임스페이스 관리: 모듈 간 이름이 부딪히지 않도록 네임스페이스를 정리해 둔다.
8. 핵심 정리
모듈과 패키지는 코드를 다시 쓰고 고치기 쉽게 만드는 중요한 기법이다. 대규모 프로젝트일수록 알맞게 모듈로 나누고 패키지로 묶는 일이 중요하다. 그래야 코드의 복잡도가 줄고 개발 효율이 올라간다.