점프 투 파이썬 DAY14(5장 문제)

정지범·2026년 9월 22일

점프 투 파이썬

목록 보기
26/37

05장 되새김 문제

목차

  • Q1. 클래스 상속과 메서드 추가
  • Q2. 메서드 오버라이딩
  • Q3. 내장 함수 결과 예측
  • Q4. filter와 lambda
  • Q5. 16진수 → 10진수 변환
  • Q6. map과 lambda
  • Q7. 최댓값과 최솟값
  • Q8. round를 이용한 반올림
  • Q9. sys.argv 활용하기
  • Q10. os 모듈 활용하기
  • Q11. glob 모듈 활용하기
  • Q12. time 모듈 활용하기
  • Q13. 로또 번호 생성하기

Q1. 클래스 상속과 메서드 추가

다음 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

상속을 사용하면 기존 클래스의 기능을 그대로 사용하면서 새로운 기능을 추가할 수 있다.


Q2. 메서드 오버라이딩

객체변수 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)

이라고 한다.


Q3. 내장 함수 결과 예측

다음 코드의 결과를 예측해 보자.

1번

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

가 된다.


2번

chr(ord("a")) == "a"

정답

True

💡 풀이

ord()는 문자를 유니코드 숫자로 변환한다.

ord("a")

결과

97

반대로 chr()는 숫자를 문자로 변환한다.

chr(97)

결과

a

따라서

chr(ord("a"))

는 결국

"a"

가 된다.

즉,

"a" == "a"

이므로 결과는

True

이다.

정리

ord() → 문자 → 숫자
chr() → 숫자 → 문자

Q4. 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 → 간단한 함수를 한 줄로 만든다.

Q5. 16진수 → 10진수 변환

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

Q6. 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과 filter

map
→ 모든 요소를 변환

filter
→ 조건에 맞는 요소만 선택

Q7. 최댓값과 최솟값

다음 리스트에서 최댓값과 최솟값의 합을 구해 보자.

[-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

이다.


Q8. round를 이용한 반올림

다음 계산 결과를 소수점 넷째 자리까지 반올림해 보자.

17 / 3

정답

print(round(17 / 3, 4))

실행 결과

5.6667

💡 풀이

round()의 기본 구조는

round(숫자, 자릿수)

이다.

따라서

round(17 / 3, 4)

는 결과를 소수점 넷째 자리까지 표현하도록 반올림한다.

17 / 3
→ 5.666666...

round(..., 4)
→ 5.6667

Q9. 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:]
→ 사용자가 전달한 인수

Q10. os 모듈 활용하기

os 모듈을 사용하여 다음 작업을 수행해 보자.

1. C:\doit 디렉터리로 이동
2. dir 명령 실행
3. dir 명령의 결과 출력

1. 디렉터리 이동

import os

os.chdir("C:/doit")

chdir()는 현재 작업 디렉터리를 변경한다.

chdir
→ Change Directory

2. dir 명령 실행

result = os.popen("dir")

os.popen()을 사용하면 운영체제의 명령어를 실행하고 결과를 받아올 수 있다.


3. 결과 출력

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()
   ↓
결과 출력

Q11. 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인 파일

을 의미한다.


Q12. 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()은 날짜와 시간을 원하는 문자열 형식으로 표현할 때 사용한다.


Q13. 로또 번호 생성하기

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개 선택

이라는 의미이다.


💡 05장 되새김 문제 핵심 정리

문제핵심 개념
Q1클래스 상속
Q2메서드 오버라이딩
Q3all(), abs(), ord(), chr()
Q4filter(), lambda
Q5int(), 진수 변환
Q6map(), lambda
Q7max(), min()
Q8round()
Q9sys.argv
Q10os.chdir(), os.popen()
Q11glob.glob()
Q12time.strftime()
Q13random.randint()

💡 특히 기억할 부분

상속과 오버라이딩

상속
→ 부모 클래스의 기능을 물려받음

오버라이딩
→ 부모의 메서드를 자식 클래스에서 다시 정의

filter와 map

filter()
→ 조건에 맞는 값만 선택

map()
→ 모든 값에 같은 작업 적용

chr와 ord

ord()
→ 문자 → 숫자

chr()
→ 숫자 → 문자

sys.argv

sys.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장은 클래스와 파이썬에서 제공하는 여러 함수·라이브러리를 실제 코드에서 어떻게 활용하는지를 익히는 것이 가장 중요하다.

profile
성실하자:)

0개의 댓글