이 글에서는 Python의 패키지(Package)에 대해 알아보겠습니다. 패키지를 사용하면 모듈과 코드 파일을 체계적인 계층 구조로 관리할 수 있어 프로젝트가 커져도 유지보수가 훨씬 쉬워집니다. 지금부터 Python에서 패키지를 만들고 사용하는 방법을 단계별로 살펴보겠습니다.
패키지란 무엇인가?
Python에서 패키지는 관련된 모듈들을 하나의 디렉터리로 묶은 것입니다. 패키지 내부에는 또 다른 패키지(서브패키지)나 여러 개의 모듈 파일을 포함할 수 있으며, 이를 통해 대규모 프로젝트도 깔끔하게 구성할 수 있습니다.
패키지 생성 방법
디렉터리 안에 __init__.py 파일을 포함시키면 Python은 해당 디렉터리를 하나의 패키지로 인식합니다. 즉, 패키지를 만들고 싶다면 반드시 해당 디렉터리에 __init__.py 파일을 넣어야 합니다. 이 파일 안에 코드를 작성해도 되고, 비워 두어도 상관없습니다. 참고로 Python 3.3부터는 네임스페이스 패키지 덕분에 이 파일이 없어도 동작하는 경우가 있지만, 호환성을 위해 항상 포함하는 것이 좋습니다.
패키지 생성 단계
- 디렉터리를 생성하고 그 안에 __init__.py 파일을 추가하여 해당 디렉터리가 패키지임을 Python에 알립니다.
- 필요한 서브패키지나 모듈 파일을 원하는 만큼 추가합니다.
- 유효한 import 문을 사용하여 패키지 내부의 클래스와 함수에 접근합니다.
그럼 다음과 같은 구조를 가진 간단한 패키지를 직접 만들어 보겠습니다.
university (패키지) ├── __init__.py ├── student.py └── faculty.py
노트북이나 데스크톱의 아무 디렉터리에서 위 폴더 구조를 만든 뒤, 각 파일에 아래 코드를 작성합니다.
예제: 기본 패키지 만들기
# student.py
class Student:
def __init__(self, student):
self.name = student['name']
self.gender = student['gender']
self.year = student['year']
def get_student_details(self):
return f"Name: {self.name}\nGender: {self.gender}\nYear: {self.year}"
# faculty.py
class Faculty:
def __init__(self, faculty):
self.name = faculty['name']
self.subject = faculty['subject']
def get_faculty_details(self):
return f"Name: {self.name}\nSubject: {self.subject}"student.py와 faculty.py 파일에 위 코드를 작성했습니다. 이제 이 클래스들을 실제로 불러와 사용하는 파일을 만들어 보겠습니다. 패키지 디렉터리 안에 testing.py라는 이름의 파일을 생성하고 아래 코드를 입력하세요.
예제: 패키지 접근하기
# testing.py
# 각 파일에서 Student, Faculty 클래스 임포트
from student import Student
from faculty import Faculty
# 학생 및 교수 정보를 담은 딕셔너리 생성
student_dict = {'name' : 'John', 'gender': 'Male', 'year': '3'}
faculty_dict = {'name': 'Emma', 'subject': 'Programming'}
# Student, Faculty 클래스의 인스턴스 생성
student = Student(student_dict)
faculty = Faculty(faculty_dict)
# 정보를 가져와 출력
print(student.get_student_details())
print()
print(faculty.get_faculty_details())testing.py 파일을 실행하면 다음과 같은 결과가 출력됩니다.
출력 결과
Name: John Gender: Male Year: 3 Name: Emma Subject: Programming
지금까지 Python에서 패키지를 생성하고 접근하는 기본적인 방법을 살펴봤습니다. 하지만 실제 프로젝트에서는 하나의 패키지 안에 수많은 서브패키지와 파일이 존재할 수 있습니다. 그렇다면 서브패키지의 모듈은 어떻게 접근할까요?
서브패키지 모듈 접근하기
먼저 다음과 같은 구조로 디렉터리를 구성합니다.
university (패키지) ├── __init__.py ├── student (서브패키지) │ ├── __init__.py │ ├── main.py │ └── ... └── testing.py
앞서 작성한 student 관련 코드를 main.py에 복사해서 넣습니다. 이제 testing.py에서 이 모듈에 어떻게 접근하는지 살펴보겠습니다. testing.py 파일에 아래 코드를 추가하세요.
예제: 서브패키지 접근하기
# testing.py
from student.main import Student
# 학생 정보를 담은 딕셔너리 생성
student_dict = {'name' : 'John', 'gender': 'Male', 'year': '3'}
# Student 클래스의 인스턴스 생성
student = Student(student_dict)
# 학생 정보를 가져와 출력
print(student.get_student_details())testing.py 파일을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
출력 결과
Name: John Gender: Male Year: 3
여기서 주목할 점은 점(.) 연산자를 사용해 서브패키지 student 내부의 main.py 파일에 있는 Student 클래스에 접근했다는 것입니다. 패키지 구조가 깊어지더라도 from package.subpackage.module import Class 형태로 원하는 만큼 깊게 접근할 수 있습니다.
마무리
이번 튜토리얼에서는 Python 패키지의 개념부터 생성 방법, 그리고 서브패키지 모듈 접근 방법까지 알아보았습니다. 패키지를 잘 활용하면 코드의 재사용성과 가독성이 크게 향상되므로, 규모가 있는 프로젝트에서는 반드시 익혀두어야 할 개념입니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨주세요!