안녕하세요, MoonLight입니다.
이번 Post에서는 Python의 Module에 대해서 알아보도록 하겠습니다.
1. 기본사항
Python의 Module은 코드 재사용성을 높이고 유지보수를 쉽게 하기 위해 사용되는 중요한 개념입니다.
Module은 Python 코드 파일(확장자 .py)이며, 변수, 함수, 클래스 등을 정의하여 다른 Python 프로그램에서 사용할 수 있도록 구성됩니다.
1.1. Module의 정의와 역할
1.1.1. Module이란?
Python에서 Module은 하나의 Python 파일입니다. Module에는 변수, 함수, 클래스 정의가 포함될 수 있습니다.
프로그램을 여러 개의 파일로 나눠 조직적으로 관리할 수 있게 합니다.
1.1.2. Module의 역할
코드 재사용 : 여러 프로젝트에서 동일한 코드를 공유 가능.
코드 관리 : 긴 프로그램을 작은 파일로 나눠 구조적으로 관리.
표준화 : Python 표준 라이브러리 및 외부 라이브러리도 Module로 구성.
네임스페이스 관리 : 각 Module은 고유의 네임스페이스를 제공.
1.2. 기본적인 Module 사용법
1.2.1. Module 생성
아래는 my_module.py라는 파일을 생성한 예입니다:
# my_module.py
# 변수
greeting = "Hello, World!"
# 함수
def add_numbers(a, b):
return a + b
# 클래스
class Calculator:
def multiply(self, a, b):
return a * b
1.2.2. Module 사용
다른 Python 파일에서 my_module.py를 import 하여 사용할 수 있습니다:
# main.py
# Module 임포트
import my_module
# 변수 사용
print(my_module.greeting) # Hello, World!
# 함수 사용
result = my_module.add_numbers(5, 10)
print(result) # 15
# 클래스 사용
calc = my_module.Calculator()
print(calc.multiply(2, 3)) # 6
1.3. Module 임포트 방식
Python에서 Module을 임포트하는 방식은 상황에 따라 여러 가지가 있습니다. 다음은 네 가지 주요 방식과 각각의 특징입니다.
1.3.1. 일반적인 import 방식
가장 기본적인 방식으로, Module 전체를 임포트합니다. 임포트된 Module의 함수나 클래스에 접근할 때는 Module 이름을 접두사로 사용해야 합니다.
사용법
import math
# math Module의 함수 사용
result = math.sqrt(16) # 16의 제곱근
print(result)
특징
Module 전체를 불러옵니다. 호출 시 Module 이름을 명시해야 하므로 코드의 가독성이 높습니다.
권장 방식: Module 이름을 명시하므로 충돌을 방지할 수 있습니다.
1.3.2. Module에서 특정 함수나 클래스만 임포트 (from module import)
Module에서 특정 함수, 클래스 또는 변수를 직접 임포트하여 사용할 수 있습니다. 이 경우, 호출 시 Module 이름을 접두사로 사용하지 않아도 됩니다.
사용법
from math import sqrt
# sqrt 함수 직접 사용
result = sqrt(16)
print(result)
특징
필요한 기능만 임포트하므로 코드가 간결해집니다.
주의점 : 다른 Module과 함수 이름이 충돌할 가능성이 있습니다.
1.3.3. Module 전체를 별칭으로 임포트 (import module as alias)
Module 이름이 길거나 반복해서 사용될 경우, 별칭(alias)을 지정하여 간단히 사용할 수 있습니다.
사용법
import math as m
# 별칭 m을 사용하여 접근
result = m.sqrt(16)
print(result)
특징
Module 이름을 짧게 만들어 코드가 간결해집니다.
권장 : 별칭은 Module의 목적과 관련 있는 이름으로 지정하는 것이 좋습니다.
1.3.4. Module의 모든 내용을 임포트 (from module import *)
Module 내의 모든 함수, 클래스, 변수를 전역 네임스페이스로 가져옵니다.
사용법
from math import *
# math Module의 함수 바로 사용
result = sqrt(16)
print(result)
특징
코드가 간결해지지만, 다른 Module과 이름 충돌의 위험이 큽니다.
대규모 프로젝트에서는 사용을 권장하지 않습니다.
비교 및 권장 사항
방식
|
장점
|
단점
|
사용 상황
|
import module
|
코드 가독성이 높음. 충돌 위험이 적음.
|
함수 호출 시 Module 이름을 항상 명시해야 함.
|
대부분의 상황에서 권장.
|
from module import name
|
필요한 부분만 가져와 코드가 간결해짐.
|
이름 충돌 가능성 존재.
|
함수/클래스가 특정 작업에만 사용될 때.
|
import module as alias Module
|
이름을 짧게 만들어 반복 호출 시 편리함.
|
별칭이 직관적이지 않을 경우 가독성이 떨어질 수 있음.
|
Module 이름이 길거나 자주 사용될 때.
|
from module import *
|
모든 기능을 가져와 코드를 간결하게 작성 가능.
|
이름 충돌 가능성이 매우 큼.
|
작은 스크립트나 임시 코드에서만 사용.
|
결론
대규모 프로젝트에서는 충돌 방지를 위해 import module 방식이 가장 안전하고 권장됩니다.
필요한 경우에만 from module import name 또는 import module as alias 방식을 선택하세요.
from module import * 방식은 이름 충돌 가능성이 크므로 되도록 피하는 것이 좋습니다.
1.4. 표준 Module
Python은 많은 표준 Module을 제공하며, 이를 바로 사용할 수 있습니다.
아래는 주로 많이 사용하는 표준 Module의 사용예입니다.
1.4.1. math Module
import math
# 제곱근
print(math.sqrt(16)) # 4.0
# π 값
print(math.pi) # 3.141592653589793
1.4.2. os Module
import os
# 현재 디렉토리 확인
print(os.getcwd())
# 디렉토리 목록 확인
print(os.listdir())
1.4.3. random Module
import random
# 1부터 10 사이의 임의 숫자 생성
print(random.randint(1, 10))
1.5. 사용자 정의 Module
1.5.1. Module 파일 생성
my_math.py라는 파일을 생성:
# my_math.py
def square(x):
return x * x
def cube(x):
return x * x * x
1.5.2. 다른 파일에서 사용
# main.py
import my_math
print(my_math.square(4)) # 16
print(my_math.cube(3)) # 27
1.6. 패키지와 Module
1.6.1. 패키지란?
패키지는 여러 Module을 포함하는 디렉토리입니다.
패키지 내에는 __init__.py 파일이 있어야 하며, 이는 패키지로 인식되도록 합니다.
1.6.2. 패키지 구조
my_package/
__init__.py
module1.py
module2.py
사용 예
# my_package/module1.py
def func1():
return "This is module1"
# main.py
from my_package import module1
print(module1.func1())
1.7. Module 경로 설정
Python은 기본적으로 현재 디렉토리와 표준 라이브러리 경로에서 Module을 검색합니다.
추가 경로를 설정하려면 sys.path를 수정할 수 있습니다:
import sys
# Module 검색 경로 확인
print(sys.path)
# 새 경로 추가
sys.path.append("/path/to/your/modules")
1.8. Module 작성 시 주의사항
Module명 충돌 방지:
다른 Module과 이름이 충돌하지 않도록 고유한 이름 사용.
테스트 코드 분리:
Module 파일에 테스트 코드를 작성할 때는 아래와 같이 작성:
if __name__ == "__main__":
# 테스트 코드
print(add_numbers(2, 3))
__name__ == "__main__"는 Module이 직접 실행될 때만 동작합니다.
1.9. 요약
항목
|
설명
|
Module 정의
|
Python 파일 하나를 Module로 간주, 변수, 함수, 클래스 포함 가능.
|
장점
|
코드 재사용, 구조화된 관리, 표준화된 코드 작성.
|
사용 방법
|
import, from ... import ..., as를 사용하여 Module 불러오기.
|
표준
|
Module 예시 math, os, sys, random 등.
|
사용자 정의 Module
|
Python 파일을 생성하여 원하는 기능 정의 후 다른 파일에서 사용.
|
패키지
|
여러 Module을 포함하는 디렉토리, __init__.py 파일 포함.
|
테스트 코드
|
if __name__ == "__main__":로 테스트 코드 작성.
|
2. 예제
Ex. 1. datetime Module을 사용해서 현재 시간을 화면에 출력해보세요.
from datetime import datetime
print(datetime.now())
출력:
2024-11-29 23:13:35.803423
Ex. 2. datetime Module의 now 함수의 리턴 값의 타입을 화면에 출력해보세요.
from datetime import datetime
print(type(datetime.now()))
출력:
<class 'datetime.datetime'>
Ex. 3. datetime Module의 timedelta를 사용해서 오늘로부터 5일, 4일, 3일, 2일, 1일 전의 날짜를 화면에 출력해보세요.
from datetime import datetime, timedelta
today = datetime.now()
for days_ago in range(5, 0, -1):
past_date = today - timedelta(days=days_ago)
print(f"{days_ago}일 전의 날짜: {past_date.strftime('%Y-%m-%d')}")
출력:
5일 전의 날짜: 2024-11-24
4일 전의 날짜: 2024-11-25
3일 전의 날짜: 2024-11-26
2일 전의 날짜: 2024-11-27
1일 전의 날짜: 2024-11-28
Ex. 4. 현재시간을 얻어온 후 다음과 같은 포맷으로 시간을 출력해보세요. strftime 메서드를 사용하세요.
from datetime import datetime
# 현재 날짜와 시간을 원하는 형식으로 출력
current_time = datetime.now()
formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_time)
출력:
2024-11-29 23:15:37
Ex. 5. datetime.datetime.strptime 메서드를 사용하면 문자열 형식의 시간을 datetime.datetime 타입의 시간 값으로 만들어줍니다. "2020-05-04"의 문자열을 시간 타입으로 변환해보세요.
from datetime import datetime
print(datetime.strptime("2020-05-04", "%Y-%m-%d"))
출력:
2020-05-04 00:00:00
Ex. 6. time Module, datetime Module을 사용해서 1초에 한 번 현재 시간을 출력하는 코드를 작성하세요.
import time
from datetime import datetime
while True:
# 현재 시간을 datetime Module로 가져오기
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"현재 시간: {current_time}")
# 1초 대기
time.sleep(1)
출력:
현재 시간: 2024-11-29 23:24:18
현재 시간: 2024-11-29 23:24:19
현재 시간: 2024-11-29 23:24:20
현재 시간: 2024-11-29 23:24:21
현재 시간: 2024-11-29 23:24:22
Ex. 7. Module을 임포트하는 4가지 방식에 대해 설명해보세요.
Python에서 Module을 임포트하는 방식은 상황에 따라 여러 가지가 있습니다. 다음은 네 가지 주요 방식과 각각의 특징입니다.
1. 일반적인 import 방식
가장 기본적인 방식으로, Module 전체를 임포트합니다. 임포트된 Module의 함수나 클래스에 접근할 때는 Module 이름을 접두사로 사용해야 합니다.
사용법
import math
# math Module의 함수 사용
result = math.sqrt(16) # 16의 제곱근
print(result)
특징
Module 전체를 불러옵니다. 호출 시 Module 이름을 명시해야 하므로 코드의 가독성이 높습니다.
권장 방식: Module 이름을 명시하므로 충돌을 방지할 수 있습니다.
2. Module에서 특정 함수나 클래스만 임포트 (from module import)
Module에서 특정 함수, 클래스 또는 변수를 직접 임포트하여 사용할 수 있습니다. 이 경우, 호출 시 Module 이름을 접두사로 사용하지 않아도 됩니다.
사용법
from math import sqrt
# sqrt 함수 직접 사용
result = sqrt(16)
print(result)
특징
필요한 기능만 임포트하므로 코드가 간결해집니다.
주의점: 다른 Module과 함수 이름이 충돌할 가능성이 있습니다.
3. Module 전체를 별칭으로 임포트 (import module as alias)
Module 이름이 길거나 반복해서 사용될 경우, **별칭(alias)**을 지정하여 간단히 사용할 수 있습니다.
사용법
import math as m
# 별칭 m을 사용하여 접근
result = m.sqrt(16)
print(result)
특징
Module 이름을 짧게 만들어 코드가 간결해집니다.
권장: 별칭은 Module의 목적과 관련 있는 이름으로 지정하는 것이 좋습니다.
4. Module의 모든 내용을 임포트 (from module import *)
Module 내의 모든 함수, 클래스, 변수를 전역 네임스페이스로 가져옵니다.
사용법
from math import *
# math Module의 함수 바로 사용
result = sqrt(16)
print(result)
특징
코드가 간결해지지만, 다른 Module과 이름 충돌의 위험이 큽니다.
대규모 프로젝트에서는 사용을 권장하지 않습니다.
방식
|
장점
|
단점
|
사용 상황
|
import module
|
코드 가독성이 높음. 충돌 위험이 적음.
|
함수 호출 시 Module 이름을 항상 명시해야 함.
|
대부분의 상황에서 권장.
|
from module import name
|
필요한 부분만 가져와 코드가 간결해짐.
|
이름 충돌 가능성 존재.
|
함수/클래스가 특정 작업에만 사용될 때.
|
import module as alias Module
|
이름을 짧게 만들어 반복 호출 시 편리함.
|
별칭이 직관적이지 않을 경우 가독성이 떨어질 수 있음.
|
Module 이름이 길거나 자주 사용될 때.
|
from module import *
|
모든 기능을 가져와 코드를 간결하게 작성 가능.
|
이름 충돌 가능성이 매우 큼.
|
작은 스크립트나 임시 코드에서만 사용.
|
결론
대규모 프로젝트에서는 충돌 방지를 위해 import module 방식이 가장 안전하고 권장됩니다.
필요한 경우에만 from module import name 또는 import module as alias 방식을 선택하세요.
from module import * 방식은 이름 충돌 가능성이 크므로 되도록 피하는 것이 좋습니다.
Ex. 8. os Module의 getcwd 함수를 호출하여 현재 디렉터리의 경로를 화면에 출력해보세요.
import os
# 현재 작업 디렉터리 경로 가져오기
current_directory = os.getcwd()
# 경로 출력
print(f"현재 작업 디렉터리: {current_directory}")
출력:
현재 작업 디렉터리: f:\초보자를 위한 파이썬 300제
Ex. 9. 바탕화면에 텍스트 파일을 하나 생성한 후 os Module의 rename 함수를 호출하여 해당 파일의 이름을 변경해보세요.
import os
# 사용자 바탕화면 경로 가져오기
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
# 생성할 파일 경로와 이름
original_file = os.path.join(desktop_path, "example.txt")
# 새 이름으로 변경할 파일 경로
new_file = os.path.join(desktop_path, "renamed_example.txt")
# 1. 바탕화면에 텍스트 파일 생성
with open(original_file, "w") as file:
file.write("This is a test file.") # 파일에 내용 작성
print(f"파일 생성됨: {original_file}")
# 2. 파일 이름 변경
os.rename(original_file, new_file)
print(f"파일 이름 변경됨: {original_file} → {new_file}")
Ex. 10. numpy Module의 arange 함수를 사용해서 0.0 부터 5.0까지 0.1씩 증가하는 값을 화면에 출력해보세요.
import numpy
for i in numpy.arange(0, 5, 0.1):
print(i)
출력:
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6000000000000001
0.7000000000000001
0.8
0.9
1.0
1.1
1.2000000000000002
1.3
1.4000000000000001
1.5
1.6
1.7000000000000002
1.8
1.9000000000000001
2.0
2.1
2.2
2.3000000000000003
2.4000000000000004
2.5
2.6
2.7
2.8000000000000003
2.9000000000000004
3.0
3.1
3.2
3.3000000000000003
3.4000000000000004
3.5
3.6
3.7
3.8000000000000003
3.9000000000000004
4.0
4.1000000000000005
4.2
4.3
4.4
4.5
4.6000000000000005
4.7
4.800000000000001
4.9
.
.
.
.
도움이 되셨으면 좋겠네요.
다른 강좌도 참고하시면 좋을 것 같습니다. 각 강좌의 Link는 아래를 참고하시기 바랍니다.
Python 강좌 01 - print()
Python 강좌 02 - 변수
Python 강좌 03 - 문자열
Python 강좌 04 - List
Python 강좌 05 - Tuple
Python 강좌 06 - Dictionary
Python 강좌 07 - 분기문
Python 강좌 08 - 반복문
Python 강좌 09 - 함수
Python 강좌 10 - Module
Python 강좌 11 - Class
Python 강좌 12 - File & Exception
'Development Tip' 카테고리의 다른 글
Python 강좌 12 - File & Exception (0) | 2024.12.23 |
---|---|
Python 강좌 11 - Class (0) | 2024.12.23 |
Python 강좌 09 - 함수 (0) | 2024.12.23 |
Python 강좌 08 - 반복문 (0) | 2024.12.23 |
Python 강좌 07 - 분기문 (0) | 2024.12.23 |