목차
다음 Calculator 클래스를 상속받아 값을 뺄 수 있는 minus() 메서드를 가진 UpgradeCalculator 클래스를 만들어 보자.
class Calculator:
def __init__(self):
self.value = 0
def add(self, val):
self.value += val
class UpgradeCalculator(Calculator):
def minus(self, val):
self.value -= val
사용
cal = UpgradeCalculator()
cal.add(10)
cal.minus(7)
print(cal.value)
실행 결과
3
UpgradeCalculator는
class UpgradeCalculator(Calculator):
처럼 Calculator 클래스를 상속받는다.
따라서 부모 클래스의
add()
메서드를 그대로 사용할 수 있다.
그리고 새로운 기능인
def minus(self, val):
self.value -= val
을 추가한다.
동작 과정
value = 0
↓
add(10)
↓
value = 10
↓
minus(7)
↓
value = 3
상속을 사용하면 기존 클래스의 기능을 그대로 사용하면서 새로운 기능을 추가할 수 있다.
객체변수 value가 100보다 큰 값을 가질 수 없도록 MaxLimitCalculator 클래스를 만들어 보자.
단, 반드시 Calculator 클래스를 상속해야 한다.
class Calculator:
def __init__(self):
self.value = 0
def add(self, val):
self.value += val
class MaxLimitCalculator(Calculator):
def add(self, val):
self.value += val
if self.value > 100:
self.value = 100
사용
cal = MaxLimitCalculator()
cal.add(50)
cal.add(60)
print(cal.value)
실행 결과
100
부모 클래스의 add()는 단순히 값을 더한다.
def add(self, val):
self.value += val
하지만 자식 클래스에서는 add()를 다시 정의한다.
def add(self, val):
self.value += val
if self.value > 100:
self.value = 100
계산 과정
value = 0
add(50)
→ 50
add(60)
→ 110
110 > 100
→ value = 100
부모 클래스의 메서드를 자식 클래스에서 같은 이름으로 다시 정의하는 것을
메서드 오버라이딩(Method Overriding)
이라고 한다.
다음 코드의 결과를 예측해 보자.
all([1, 2, abs(-3) - 3])
False
먼저
abs(-3)
은 절댓값을 반환하므로
3
이다.
따라서
all([1, 2, abs(-3) - 3])
은
all([1, 2, 0])
이 된다.
all()은 모든 값이 참일 경우에만 True를 반환한다.
하지만 0은 False로 판단되므로
False
가 된다.
chr(ord("a")) == "a"
True
ord()는 문자를 유니코드 숫자로 변환한다.
ord("a")
결과
97
반대로 chr()는 숫자를 문자로 변환한다.
chr(97)
결과
a
따라서
chr(ord("a"))
는 결국
"a"
가 된다.
즉,
"a" == "a"
이므로 결과는
True
이다.
ord() → 문자 → 숫자
chr() → 숫자 → 문자
filter와 lambda다음 리스트에서 음수를 제거해 보자.
[1, -2, 3, -5, 8, -3]
filter와 lambda를 사용한다.
result = list(
filter(
lambda x: x > 0,
[1, -2, 3, -5, 8, -3]
)
)
print(result)
실행 결과
[1, 3, 8]
조건은
x > 0
이다.
각 요소를 확인하면
1 → True → 포함
-2 → False → 제외
3 → True → 포함
-5 → False → 제외
8 → True → 포함
-3 → False → 제외
따라서
[1, 3, 8]
만 남는다.
filter → 조건에 맞는 값만 거른다.
lambda → 간단한 함수를 한 줄로 만든다.
10진수 234를 16진수로 변경하면 다음과 같다.
hex(234)
실행 결과
'0xea'
이번에는 반대로 "0xea"를 10진수로 변경해 보자.
print(int("0xea", 16))
실행 결과
234
int()는 문자열을 정수로 변환할 수 있다.
int("10")
10
두 번째 인수를 사용하면 문자열이 몇 진수인지 지정할 수 있다.
int("0xea", 16)
의 의미는
"0xea"를 16진수로 해석해서
10진수 정수로 변환
이다.
print(int("11", 2))
print(int("10", 8))
print(int("0xea", 16))
실행 결과
3
8
234
map과 lambda다음 리스트의 각 값에 3을 곱해 보자.
[1, 2, 3, 4]
결과
[3, 6, 9, 12]
가 되어야 한다.
result = list(
map(
lambda x: x * 3,
[1, 2, 3, 4]
)
)
print(result)
실행 결과
[3, 6, 9, 12]
map()은 모든 요소에 같은 함수를 적용한다.
1 × 3 → 3
2 × 3 → 6
3 × 3 → 9
4 × 3 → 12
따라서
[3, 6, 9, 12]
가 된다.
map과 filtermap
→ 모든 요소를 변환
filter
→ 조건에 맞는 요소만 선택
다음 리스트에서 최댓값과 최솟값의 합을 구해 보자.
[-8, 2, 7, 5, -3, 5, 0, 1]
a = [-8, 2, 7, 5, -3, 5, 0, 1]
result = max(a) + min(a)
print(result)
실행 결과
-1
최댓값
max(a)
7
최솟값
min(a)
-8
따라서
7 + (-8)
= -1
이다.
round를 이용한 반올림다음 계산 결과를 소수점 넷째 자리까지 반올림해 보자.
17 / 3
print(round(17 / 3, 4))
실행 결과
5.6667
round()의 기본 구조는
round(숫자, 자릿수)
이다.
따라서
round(17 / 3, 4)
는 결과를 소수점 넷째 자리까지 표현하도록 반올림한다.
17 / 3
→ 5.666666...
round(..., 4)
→ 5.6667
sys.argv 활용하기다음과 같이 프로그램을 실행했을 때 입력한 숫자를 모두 더하도록 만들어 보자.
python myargv.py 1 2 3 4 5 6 7 8 9 10
실행 결과
55
import sys
numbers = sys.argv[1:]
result = 0
for number in numbers:
result += int(number)
print(result)
다음과 같이 실행했다고 해보자.
python myargv.py 1 2 3
sys.argv에는 다음과 같이 저장된다.
[
"myargv.py",
"1",
"2",
"3"
]
여기서
sys.argv[0]
은
myargv.py
즉 실행한 파일 이름이다.
따라서 실제 입력한 값만 가져오려면
sys.argv[1:]
을 사용한다.
결과
["1", "2", "3"]
그리고 sys.argv에 저장된 값은 문자열이므로
int(number)
를 사용해 정수로 변환한 뒤 더한다.
sys.argv[0]
→ 실행 파일 이름
sys.argv[1:]
→ 사용자가 전달한 인수
os 모듈 활용하기os 모듈을 사용하여 다음 작업을 수행해 보자.
1. C:\doit 디렉터리로 이동
2. dir 명령 실행
3. dir 명령의 결과 출력
import os
os.chdir("C:/doit")
chdir()는 현재 작업 디렉터리를 변경한다.
chdir
→ Change Directory
dir 명령 실행result = os.popen("dir")
os.popen()을 사용하면 운영체제의 명령어를 실행하고 결과를 받아올 수 있다.
print(result.read())
import os
os.chdir("C:/doit")
result = os.popen("dir")
print(result.read())
os.chdir()
↓
C:/doit로 이동
↓
os.popen("dir")
↓
Windows의 dir 명령 실행
↓
read()
↓
결과 출력
glob 모듈 활용하기C:\doit 디렉터리에서 확장자가 .py인 파일만 찾아보자.
import glob
result = glob.glob("C:/doit/*.py")
print(result)
예를 들어 폴더에
hello.py
test.py
main.py
note.txt
image.jpg
가 있다면 결과는
[
'C:/doit/hello.py',
'C:/doit/test.py',
'C:/doit/main.py'
]
처럼 .py 파일만 나온다.
*.py
에서
*
은 어떤 이름이든 올 수 있다는 의미이다.
따라서
*.py
는
이름과 상관없이 확장자가
.py인 파일
을 의미한다.
time 모듈 활용하기현재 날짜와 시간을 다음 형태로 출력해 보자.
2026/09/22 12:30:00
import time
result = time.strftime("%Y/%m/%d %H:%M:%S")
print(result)
| 표현 | 의미 |
|---|---|
%Y | 연도 |
%m | 월 |
%d | 일 |
%H | 시 |
%M | 분 |
%S | 초 |
따라서
"%Y/%m/%d %H:%M:%S"
는
연도/월/일 시:분:초
를 의미한다.
예시
2026/09/22 12:30:00
strftime()은 날짜와 시간을 원하는 문자열 형식으로 표현할 때 사용한다.
random 모듈을 이용하여 로또 번호를 만들어 보자.
조건
1 ~ 45 사이의 숫자
6개 선택
중복 X
import random
result = []
while len(result) < 6:
num = random.randint(1, 45)
if num not in result:
result.append(num)
print(result)
실행 예
[7, 13, 22, 31, 38, 44]
실행할 때마다 다른 결과가 나올 수 있다.
먼저 빈 리스트를 만든다.
result = []
로또 번호가 6개가 될 때까지 반복한다.
while len(result) < 6:
1~45 사이의 임의의 숫자를 만든다.
num = random.randint(1, 45)
그 숫자가 이미 리스트에 있는지 확인한다.
if num not in result:
없다면 추가한다.
result.append(num)
랜덤 숫자 생성
↓
이미 result에 있는가?
↙ ↘
YES NO
↓ ↓
무시 리스트 추가
↓
6개가 될 때까지 반복
random.sample()을 사용하면 중복 없이 여러 값을 한 번에 뽑을 수 있다.
import random
result = random.sample(
range(1, 46),
6
)
print(result)
range(1, 46)은
1 ~ 45
를 의미한다.
sample()은 중복 없이 지정한 개수만큼 선택한다.
따라서
random.sample(range(1, 46), 6)
은
1~45 중 중복 없이 6개 선택
이라는 의미이다.
| 문제 | 핵심 개념 |
|---|---|
| Q1 | 클래스 상속 |
| Q2 | 메서드 오버라이딩 |
| Q3 | all(), abs(), ord(), chr() |
| Q4 | filter(), lambda |
| Q5 | int(), 진수 변환 |
| Q6 | map(), lambda |
| Q7 | max(), min() |
| Q8 | round() |
| Q9 | sys.argv |
| Q10 | os.chdir(), os.popen() |
| Q11 | glob.glob() |
| Q12 | time.strftime() |
| Q13 | random.randint() |
상속
→ 부모 클래스의 기능을 물려받음
오버라이딩
→ 부모의 메서드를 자식 클래스에서 다시 정의
filter와 mapfilter()
→ 조건에 맞는 값만 선택
map()
→ 모든 값에 같은 작업 적용
chr와 ordord()
→ 문자 → 숫자
chr()
→ 숫자 → 문자
sys.argvsys.argv[0]
→ 실행 파일 이름
sys.argv[1:]
→ 명령행에서 전달한 값
glob.glob("*.py")
→ .py 파일 검색
time.strftime("%Y/%m/%d %H:%M:%S")
→ 연/월/일 시:분:초
random.sample(range(1, 46), 6)
→ 1~45 중 중복 없이 6개 선택
05장에서는 지금까지 배운
클래스
상속
오버라이딩
내장 함수
sys
os
glob
time
random
등을 실제 문제에 적용해 보는 것이 핵심이다.
특히 다음 코드는 기억해 두면 좋다.
# 상속
class Child(Parent):
pass
# 조건에 맞는 값만 선택
filter(lambda x: 조건, data)
# 모든 값 변환
map(lambda x: 변환식, data)
# 명령행 인수
sys.argv[1:]
# 파일 검색
glob.glob("*.py")
# 날짜 및 시간
time.strftime("%Y/%m/%d %H:%M:%S")
# 중복 없는 랜덤 추출
random.sample(range(1, 46), 6)
05장은 클래스와 파이썬에서 제공하는 여러 함수·라이브러리를 실제 코드에서 어떻게 활용하는지를 익히는 것이 가장 중요하다.