기본 콘텐츠로 건너뛰기

방송대 방통대 파이썬프로그래밍기초 11강 - 모듈의 이해와 유용한 모듈 - 요약 노트 시험족보 예상문제 - 올에이클래스

파이썬프로그래밍기초 11강 - 모듈의 이해와 유용한 모듈

파이썬프로그래밍기초 11강 - 모듈의 이해와 유용한 모듈

코드를 재사용하고 체계적으로 관리하는 모듈·패키지·라이브러리의 관계를 학습한다. 모듈 등록과 네임스페이스, 확인·제거·갱신 방법을 익히고 math, random, time 모듈을 계산과 게임, 실행 시간 측정에 적용한다.

제1장 모듈과 소프트웨어 구성 요소

1. 모듈의 개념

모듈(module)은 서로 관련된 함수, 상수 또는 변수, 클래스를 모아 놓은 집합체이다. 함수는 특정 작업을 처리하고, 클래스는 다른 모듈에서 확장할 수 있는 자료형과 동작을 제공하며, 상수와 변수는 여러 코드에서 함께 사용할 값을 보관한다. 이 구성 요소들을 하나의 단위로 묶으면 필요한 기능을 다른 프로그램에서 다시 사용할 수 있다.

파이썬에서 모듈은 일반적으로 .py 파일 하나에 해당한다. 프로그램을 기능별 모듈로 나누면 하나의 긴 파일에 모든 코드를 넣는 것보다 구조를 파악하기 쉽고, 이미 검증한 기능을 반복해서 작성하지 않아도 된다.

2. 모듈, 패키지, 라이브러리

구분구성의미
모듈함수·클래스·상수 등을 담은 파이썬 파일기능을 재사용하는 기본 단위
패키지하위 패키지와 여러 모듈을 담은 폴더관련 모듈을 계층적으로 조직
라이브러리여러 패키지와 모듈의 큰 집합특정 분야나 다양한 작업에 필요한 기능을 종합 제공

작은 단위인 함수·클래스·상수가 모듈을 이루고, 여러 모듈이 패키지에 묶이며, 패키지와 모듈의 더 큰 집합이 라이브러리를 이룬다. 강의록의 과학 계산 생태계처럼 NumPy, SciPy, pandas, Matplotlib 등 다양한 도구가 서로 연결되어 풍부한 라이브러리 환경을 만든다.

3. 라이브러리와 프레임워크

라이브러리는 개발자가 필요할 때 기능을 호출하여 사용하는 재사용 코드의 집합이다. 프레임워크도 재사용 가능한 구성 요소를 제공하지만, 프로그램의 전체 구조와 실행 흐름에 대한 규칙을 더 강하게 제시한다. 두 개념 모두 개발 생산성을 높이지만, 라이브러리는 개발자 코드가 필요한 기능을 호출한다는 관점이 중심이고 프레임워크는 정해진 구조 안에 개발자 코드를 배치한다는 관점이 중심이다.

제2장 모듈 등록과 네임스페이스

1. import로 모듈 등록하기

import는 모듈을 프로그램 안에서 사용할 수 있도록 네임스페이스에 등록하는 명령이다. 기본 형식은 import 모듈이름이며 필요하면 as로 별칭을 붙인다. 이 방식에서는 모듈의 멤버를 모듈이름.변수, 모듈이름.함수(), 모듈이름.클래스처럼 점 표기법으로 사용한다.

import math
import math as m

print(math.pi)
print(m.sqrt(16))

모듈 이름을 앞에 붙이면 같은 이름을 가진 다른 변수나 함수와 구별하기 쉽고, 기능이 어느 모듈에서 왔는지도 명확하게 드러난다. 별칭은 긴 모듈 이름을 반복해서 입력하는 불편을 줄인다.

2. from-import 방식

특정 멤버만 가져오려면 from 모듈이름 import 멤버를 사용한다. 가져온 멤버는 모듈 이름 없이 직접 사용할 수 있다. from 모듈이름 import *는 여러 공개 이름을 한꺼번에 가져오지만, 현재 네임스페이스에 어떤 이름이 들어왔는지 파악하기 어렵고 기존 이름과 충돌할 수 있다.

from math import pi, sqrt

print(pi)
print(sqrt(25))

두 등록 방식의 차이

import mathmath.sqrt()처럼 출처를 표시하고, from math import sqrtsqrt()로 바로 호출한다. 명확한 출처와 이름 충돌 방지를 중시한다면 모듈 이름을 유지하는 방식이 유리하다.

3. 네임스페이스의 이해

네임스페이스(namespace)는 변수, 함수, 클래스 등의 이름이 저장되고 관리되는 공간이며, 특정 객체를 이름에 따라 구별할 수 있는 범위이다. 함수나 메서드 내부의 이름은 지역 네임스페이스, 모듈 전체에 등록된 이름은 전역 네임스페이스, 파이썬이 기본 제공하는 이름은 빌트인 네임스페이스에 속한다.

파이썬은 이름을 사용할 때 지역, 전역, 빌트인 순으로 탐색한다. 서로 다른 범위에 같은 이름이 있으면 더 가까운 범위의 이름이 먼저 선택된다. 모듈을 등록한다는 것은 현재 프로그램의 네임스페이스에서 그 모듈이나 멤버를 식별할 이름을 마련하는 과정이다.

4. 모듈 확인, 제거와 갱신

dir() 함수는 네임스페이스에 등록된 이름을 리스트로 반환한다. 인수 없이 호출하면 현재 범위의 이름을, dir(math)처럼 객체를 전달하면 해당 모듈의 멤버를 확인할 수 있다. help()는 모듈, 함수, 클래스나 메서드의 사용법을 보여주는 대화형 도움말 시스템이다.

dir()
dir(math)
help(math.exp)
help("python".upper)

del 등록된모듈이름을 사용하면 현재 네임스페이스에서 모듈 식별자를 제거한다. 다만 파이썬은 효율성을 위해 불러온 모듈을 메모리에 저장하므로 같은 모듈을 다시 import해도 파일의 변경 사항이 자동 반영되지 않을 수 있다. 이때 importlib.reload(모듈이름)으로 모듈을 명시적으로 다시 불러온다.

del math

import importlib
importlib.reload(모듈이름)

제3장 math 모듈

1. 수학 함수와 상수

math 모듈은 C 언어에 정의된 수학 계산 함수와 상수의 집합이다. 원주율 pi, 자연로그의 밑 e와 함께 최대공약수, 팩토리얼, 지수·로그, 제곱근, 삼각함수 등 다양한 기능을 제공한다. 직접 근삿값과 계산식을 반복 작성하는 대신 표준 모듈의 검증된 기능을 사용할 수 있다.

멤버의미
pi, e원주율과 자연로그의 밑
fabs(x)x의 절댓값
ceil(x)x 이상인 가장 가까운 정수로 올림
floor(x)x 이하인 가장 가까운 정수로 내림
exp(x), log(x)e의 x제곱과 x의 자연로그
sqrt(x)x의 제곱근
sin(x), cos(x), tan(x)라디안 각도의 삼각함수 값
asin(x)사인값 x에 대응하는 라디안 각도
degrees(x)라디안 각도를 도 단위로 변환
gcd(a, b), factorial(n)최대공약수와 팩토리얼

2. 계산 프로그램 개선

원뿔의 부피와 겉넓이를 계산할 때 3.14 대신 math.pi를 사용하면 더 정확한 원주율 상수를 활용할 수 있고, 모선 계산에는 math.sqrt()를 사용할 수 있다. 모듈은 기존 클래스나 함수의 계산 정확도와 표현을 개선하는 데 유용하다.

두 변의 길이가 a, b이고 끼인각이 α인 삼각형의 넓이는 1 / 2 × a × b × sin(α)이다. math.sin()은 라디안 각도를 받으므로 도 단위 입력이라면 먼저 math.radians()에 해당하는 변환이나 적절한 환산을 적용해야 한다.

import math

area = 0.5 * a * b * math.sin(angle)
print(area)

제4장 random 모듈과 난수 응용

1. 난수와 주요 함수

난수(random number)는 특정한 순서나 규칙적인 의미가 없는 임의의 수이다. random 모듈은 특정 범위의 난수를 생성하거나 시퀀스에서 항목을 선택하고 순서를 섞는 기능을 제공한다. 난수 발생기는 시드에서 출발해 값을 생성하며 게임, 모의실험, 표본 추출 등에 활용된다.

멤버의미
random()0 이상 1 미만의 실수 난수 생성
randint(a, b)a부터 b 사이의 정수 난수 생성
randrange(a, b, c)a부터 b 미만 범위에서 c 간격에 맞는 정수 난수 생성
choice(sequence)시퀀스에서 항목 하나를 무작위로 반환
sample(sequence, k)시퀀스에서 k개의 서로 다른 항목을 선택
shuffle(sequence)시퀀스의 항목 순서를 무작위로 섞음

2. 가위바위보 게임

컴퓨터의 선택은 choice(["가위", "바위", "보"])로 만들 수 있다. 사용자와 컴퓨터의 값이 같으면 비기고, 사용자가 이기는 세 조합을 조건식으로 검사하면 승패를 판정할 수 있다. 난수 생성은 같은 입력에도 매번 다른 게임 흐름을 만드는 핵심이다.

import random

options = ["가위", "바위", "보"]
user = input("가위, 바위, 보를 입력: ")
com = random.choice(options)

if user == com:
    print("비겼다!")
elif (user == "바위" and com == "가위") or \
     (user == "보" and com == "바위") or \
     (user == "가위" and com == "보"):
    print("이겼다!")
else:
    print("졌다!")

3. 로또와 스무고개

로또 추첨 프로그램은 1부터 45 사이에서 중복되지 않는 숫자 6개를 고르고 사용자가 입력한 숫자와 비교한다. 이때 sample(range(1, 46), 6)는 서로 다른 항목을 선택하므로 목적에 잘 맞는다. 두 집합의 공통 원소 수를 세어 맞힌 개수를 출력할 수 있다.

스무고개 프로그램은 1부터 100 사이의 비밀 숫자를 난수로 정하고 사용자에게 최대 20번의 기회를 제공한다. 입력값이 정답보다 작으면 “더 큽니다”, 크면 “더 작습니다”라는 힌트를 주며, 같으면 반복을 종료한다. 난수, 반복 구조, 비교와 선택 구조가 함께 결합되는 응용이다.

제5장 time 모듈과 실행 시간 측정

1. 에포크 시간

time 모듈은 에포크 시간을 얻고 다양한 형식으로 표시하는 기능을 제공한다. 시간 측정, 프로그램 실행 지연, 시간 형식 변환 등을 처리한다. 유닉스 에포크는 1970년 1월 1일 00:00:00 GMT를 기준으로 하며, 현재 시각은 이 기준 이후 누적된 초로 표현할 수 있다.

멤버의미
time()1970년 1월 1일 자정 이후 누적된 초를 실수로 반환
gmtime()기준 시각을 struct_time 형식으로 변환
localtime(time)입력된 초를 지방 표준시 기준의 시간으로 변환
strftime(str, time)시간을 지정된 문자열 형식으로 변환
ctime()현재 시간을 읽기 쉬운 문자열로 반환
sleep(n)현재 실행 프로세스를 n초 동안 멈춤

2. 소수 찾기 프로그램의 시간 측정

1부터 50,000 사이의 소수를 찾는 프로그램에서는 계산 직전과 직후에 time.time()을 호출하고 두 값의 차이를 구하면 실행 시간을 측정할 수 있다. 강의록의 실행 예는 시작과 종료 시각, 찾은 소수 일부와 약 9.022초의 실행 시간을 출력한다.

import time

start = time.time()
# 1부터 50000 사이의 소수를 찾는 처리
end = time.time()
print(f"{end - start:.3f}초 실행했습니다.")

실행 시간 측정은 알고리즘이나 구현 방법의 성능을 비교하는 기초 자료가 된다. 동일한 조건에서 여러 번 측정하고 입력 크기와 실행 환경을 함께 고려해야 의미 있는 비교가 된다.

핵심 개념 정리

모듈: 함수·클래스·상수 등을 하나의 재사용 단위로 묶은 파이썬 파일이다.

계층: 관련 모듈을 패키지로 조직하고, 여러 패키지와 모듈의 큰 집합이 라이브러리를 이룬다.

등록: import는 모듈 이름을 유지하고, from-import는 선택한 멤버를 현재 네임스페이스로 가져온다.

네임스페이스: 이름을 저장하고 구별하는 범위이며 지역, 전역, 빌트인 순으로 탐색한다.

도구: dir()은 이름 목록, help()는 사용법, importlib.reload()는 변경된 모듈의 갱신에 사용한다.

표준 모듈: math는 수학 계산, random은 난수와 무작위 선택, time은 시각 변환·지연·실행 시간 측정을 담당한다.

최종 정리

모듈을 사용하는 목적은 코드를 단순히 파일로 나누는 데 그치지 않는다. 검증된 기능을 명확한 네임스페이스 안에서 재사용하고, 프로그램을 작은 책임 단위로 조직하여 유지보수성과 확장성을 높이는 것이 핵심이다.

예상문제 20선

1. 파이썬 모듈의 정의로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
모듈은 관련 함수, 클래스와 값 등을 하나의 파일 단위로 묶어 재사용할 수 있게 한다.

2. 모듈, 패키지, 라이브러리를 작은 단위부터 나열한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
모듈들이 패키지에 조직되고 여러 패키지와 모듈이 더 큰 라이브러리를 이룬다.

3. import math as m에서 m의 역할은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
as는 등록한 모듈을 더 짧거나 구별되는 이름으로 참조할 별칭을 만든다.

4. import math 후 제곱근 함수를 호출하는 올바른 표현은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
모듈 전체를 등록하면 점 표기법으로 모듈 이름과 멤버 이름을 연결한다.

5. from math import pi 이후 원주율을 사용하는 표현은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
from-import로 가져온 멤버는 현재 네임스페이스에서 모듈 접두사 없이 사용한다.

6. from 모듈 import *의 주된 주의점은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
많은 이름을 직접 등록하면 어떤 모듈에서 왔는지 파악하기 어렵고 기존 이름을 가릴 수 있다.

7. 네임스페이스의 의미는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
네임스페이스는 변수, 함수, 클래스 등의 이름과 대상을 연결하고 범위별로 관리한다.

8. 이름 탐색 순서로 알맞은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
파이썬은 가까운 지역 범위부터 전역, 빌트인 네임스페이스 순으로 이름을 찾는다.

9. 모듈에 등록된 멤버 이름을 확인하는 함수는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
dir(모듈)은 해당 모듈의 네임스페이스에 등록된 이름들을 리스트로 돌려준다.

10. 함수나 메서드의 사용법을 확인하는 함수는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
help()는 객체의 설명과 사용 방법을 제공하는 대화형 도움말 기능이다.

11. 변경된 모듈을 다시 읽어들이는 방법은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
메모리에 캐시된 모듈에 파일 변경을 반영하려면 importlib.reload()을 사용한다.

12. math.ceil(3.2)의 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
ceil()은 입력값 이상인 가장 가까운 정수 방향으로 올림한다.

13. 원주율 상수를 제공하는 math 모듈의 멤버는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
math.pi는 원주율을, math.e는 자연로그의 밑을 제공한다.

14. 시퀀스에서 중복 없이 k개를 무작위 선택하는 함수는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
sample(sequence, k)는 주어진 시퀀스에서 서로 다른 항목 k개를 선택한다.

15. random.randint(1, 10)의 결과 범위는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
randint(a, b)는 양 끝값을 포함한 a부터 b 사이의 정수를 생성한다.

16. 목록의 원래 항목 순서를 무작위로 섞는 함수는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
shuffle()은 전달된 변경 가능한 시퀀스의 항목 순서를 무작위로 바꾼다.

17. 로또 숫자 6개를 중복 없이 뽑는 데 적합한 표현은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
1부터 45까지의 범위에서 sample로 6개를 선택하면 중복 없는 표본을 얻는다.

18. 유닉스 에포크의 기준 시점은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
유닉스 계열의 에포크 시간은 1970년 1월 1일 00:00:00 GMT 이후의 경과 초를 기준으로 한다.

19. 현재 프로세스를 2초 동안 멈추는 표현은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
sleep(n)은 현재 실행 중인 프로세스를 지정한 n초 동안 일시 정지한다.

20. 프로그램 실행 시간을 측정하는 기본 방법은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
작업 직전과 직후의 에포크 초를 얻어 종료값에서 시작값을 빼면 경과 시간을 계산할 수 있다.

댓글