본문 바로가기
Language/Python

[고등학생부터, 파이썬] 16. 함수 종합 프로젝트

by kellis 2026. 9. 1.
반응형
고등학생부터, 파이썬 · 16화

함수 종합 프로젝트 — 도서 관리 프로그램 리팩터링

지금까지 배운 함수·딕셔너리·반복문·조건문을 모두 모아서,

하나로 길게 이어져 있던 코드를 기능별로 나눠 정리하는 실전 프로젝트를 만들어봅니다.

새 문법은 없어요 — 지금까지 배운 것을 어떻게 조합하는지가 핵심이에요.

이 시리즈를 시작하며

요즘은 고등학교에서도 코딩을 정규 과목으로 가르치는 시대입니다. 전공자가 아니어도 바이브 코딩(Vibe Coding)이나 생성형 AI(Generative AI)를 활용하면 누구나 그럴듯한 코드 결과물을 만들어낼 수 있게 되었죠. 

개발 언어를 접하는, 전공자가 아닌 일반인 입문자가 많아진 것입니다.

이 시리즈는 글쓴이가 실제로 일반인, 고등학생 등 비전공자·입문자에게 파이썬을 가르치면서 정리한 내용들을 교재 형식으로 엮은 글입니다.최대한 쉽고 친절하게 설명하면서도, 컴퓨터와 프로그래밍 언어에 대한 기초 이론까지 함께 짚고 넘어가려 합니다.

 

고등학생, 비전공자, 완전 입문자도 따라올 수 있게끔 만든 시리즈이고, 실제 과외 수업 자료를 바탕으로 만들어서 학교 시험처럼 개념 확인 문제도 그대로 들어있어요.

중간중간 빈칸 채우기학교 시험 유형 문제가 나오는데, 정답은 바로 안 보이게 접어뒀습니다. 먼저 스스로 생각해본 다음 "보기"를 눌러서 확인해보세요.

 

Chapter 35
함수 종합 프로젝트 · 도서 관리 프로그램 리팩터링

지금까지 만든 프로그램은 코드가 한 곳에 모두 이어져 있었습니다. 모든 코드가 쭉 붙어있으면 프로그램이 길어질수록 읽기 어려워져요. 이번에는 기능별로 함수를 만들어 프로그램을 더 보기 쉽게 정리해봅니다.

선생님 설명 · 축제 준비 이야기

학교 축제를 준비한다고 생각해봅시다. 한 사람이 포스터 만들기·음식 준비·사회 보기·청소를 전부 다 하면 너무 힘듭니다. 그래서 역할을 나눠요. 프로그램도 똑같습니다 — 기능별로 나누는 것이 함수입니다.

완성 화면
===== 도서 관리 =====
1. 전체 도서 보기
2. 대출 가능한 도서
3. 책 대출
4. 종료
문제이런 프로그램을 만들어보세요

위 화면처럼 동작하는 도서 관리 프로그램을 함수로 나눠서 만들어보세요. 지금까지 배운 함수·딕셔너리·리스트·반복문·조건문만으로 충분히 만들 수 있습니다. 아래 요구사항을 하나씩 채워나가면 됩니다.

 

  1. 도서 데이터 — 책 정보를 담은 books 리스트를 만드세요. 책 한 권은 "제목", "저자", "대출"(True/False) 키를 가진 딕셔너리이고, 최소 3권 이상 준비하며 대출 상태는 True/False가 섞여 있어야 합니다.
  2. show_menu() 함수 — 위 완성 화면처럼 메뉴 4개를 출력하는 함수를 만드세요.
  3. show_books() 함수 — books 안의 모든 책에 대해 제목, 저자, 그리고 대출 여부에 따라 "대출 중" 또는 "대출 가능"을 출력하는 함수를 만드세요.
  4. show_available() 함수 — books 중에서 아직 대출되지 않은 책의 제목만 골라 출력하는 함수를 만드세요.
  5. rent_book() 함수 — 사용자에게 책 제목을 입력받아, books에서 찾아 대출 처리하는 함수를 만드세요.
    • 이미 대출 중인 책이면 "이미 대출 중입니다."를 출력합니다.
    • 대출 가능한 책이면 대출 상태를 True로 바꾸고 "대출 완료"를 출력합니다.
    • 입력한 제목이 books에 아예 없으면 "없는 책입니다."를 출력합니다.
  6. 메인 프로그램while True:로 무한히 메뉴를 보여주고 입력을 받아, 1~3번 선택 시 각 함수를 호출하고, 4번을 선택하면 종료 메시지를 출력한 뒤 반복문을 빠져나가고, 그 외의 입력이면 "잘못 입력했습니다."를 출력하도록 만드세요.

직접 만들어보고, 막히는 부분이 있으면 아래 정답 해설을 참고하세요.

정답 해설한 단계씩 뜯어보기
Step 1 · 도서 데이터 만들기
python
books = [
    {"제목": "파이썬 입문", "저자": "홍길동", "대출": False},
    {"제목": "HTML 기초", "저자": "김철수", "대출": True},
    {"제목": "CSS 완전정복", "저자": "이영희", "대출": False}
]

13화에서 배운 "딕셔너리를 담은 리스트"예요. 책 한 권이 딕셔너리 하나, 그 책들을 리스트로 묶었습니다.

Step 2 · 메뉴 함수
python
def show_menu():
    print()
    print("===== 도서 관리 =====")
    print("1. 전체 도서")
    print("2. 대출 가능한 도서")
    print("3. 책 대출")
    print("4. 종료")
Step 3 · 전체 도서 출력 함수
python
def show_books():
    print()
    for book in books:
        print("제목 :", book["제목"])
        print("저자 :", book["저자"])
        if book["대출"]:
            print("상태 : 대출 중")
        else:
            print("상태 : 대출 가능")
        print()

book 딕셔너리 안에 이미 True/False 값이 들어있으니, book["대출"]이 참이면 바로 "대출 중"으로 판단할 수 있어요.

Step 4 · 대출 가능한 책 출력
python
def show_available():
    print()
    for book in books:
        if book["대출"] == False:
            print(book["제목"])
Step 5 · 책 대출 함수
python
def rent_book():
    name = input("대출할 책 제목 : ")
    find = False

    for book in books:
        if book["제목"] == name:
            find = True

            if book["대출"]:
                print("이미 대출 중입니다.")
            else:
                book["대출"] = True
                print("대출 완료")

    if find == False:
        print("없는 책입니다.")
find 변수의 역할

find는 처음엔 False로 시작해서, 리스트를 돌다가 제목이 일치하는 책을 찾으면 True로 바뀝니다. 반복문이 다 끝난 뒤에도 find가 여전히 False라면 "그런 제목의 책 자체가 없다"는 뜻이에요. 이렇게 "찾았는지 여부"를 True/False 변수 하나로 기억해두는 방식은 검색 로직에서 자주 쓰이는 패턴입니다.

Step 6 · 메인 프로그램
python
while True:
    show_menu()
    menu = input("선택 : ")

    if menu == "1":
        show_books()
    elif menu == "2":
        show_available()
    elif menu == "3":
        rent_book()
    elif menu == "4":
        print("프로그램을 종료합니다.")
        break
    else:
        print("잘못 입력했습니다.")

메인 프로그램은 메뉴를 보여주고, 입력을 받고, 맞는 함수를 호출하는 일만 합니다. 실제 로직은 전부 각 함수 안에 있어요. 이렇게 나눠두면 나중에 "대출 취소" 기능을 추가하고 싶을 때도, 메인 루프를 건드리지 않고 함수 하나만 새로 만들어서 elif를 한 줄 추가하면 됩니다.

실행해보기
python
# 1 → 전체 도서 보기 → 3 → "파이썬 입문" 대출 → 3 → "파이썬 입문" 다시 대출 시도
# → 3 → "없는책" 대출 시도 → 1 → 전체 도서 다시 보기 → 4 → 종료
실행 결과 (일부 발췌)
제목 : 파이썬 입문 저자 : 홍길동 상태 : 대출 가능
제목 : HTML 기초 저자 : 김철수 상태 : 대출 중
제목 : CSS 완전정복 저자 : 이영희 상태 : 대출 가능

대출할 책 제목 :
대출 완료
대출할 책 제목 :
이미 대출 중입니다.
대출할 책 제목 :
없는 책입니다.

제목 : 파이썬 입문 저자 : 홍길동 상태 : 대출 중

...

처음엔 "파이썬 입문"이 대출 가능이었다가, 대출 후 다시 확인하면 대출 중으로 바뀌어 있어요.

book["대출"] = True로 딕셔너리 값을 직접 바꿔놓았기 때문에, books 리스트 자체가 계속 최신 상태를 유지합니다.

왜 굳이 함수로 나눴을까

사실 이 프로그램은 함수 없이 코드를 쭉 이어써도 똑같이 동작합니다. 하지만 기능이 4개, 5개, 10개로 늘어날수록 코드를 찾기도, 고치기도, 테스트하기도 점점 어려워져요. 기능별로 함수를 나눠두면 "대출 관련 버그면 rent_book()만 보면 된다"처럼 문제를 좁혀서 찾을 수 있고, 각 함수를 따로 테스트할 수도 있습니다.

코드 읽기
  1. rent_book() 함수에서 find 변수가 하는 역할을 한 문장으로 설명하시오.
정답
입력한 제목의 책이 books 리스트 안에 실제로 존재하는지 여부를 기억해두는 변수입니다. 반복문이 끝난 뒤에도 False라면 일치하는 책을 하나도 찾지 못했다는 뜻입니다.
학교 시험 유형
  1. 이 프로그램에서 while True:break가 하는 역할을 서술하시오.
  2. 메인 프로그램(Step 6)이 각 기능의 세부 로직을 직접 담고 있지 않고 함수 호출만 하고 있다. 이렇게 설계했을 때의 장점을 한 가지 서술하시오.
정답
1. while True:는 사용자가 종료를 선택하기 전까지 메뉴를 계속 보여주기 위한 무한 반복이고, break는 메뉴 "4"(종료)를 선택했을 때 그 반복을 빠져나오기 위해 사용됩니다.

2. 각 기능이 함수로 분리되어 있어서 코드를 읽기 쉽고, 특정 기능에 문제가 생기면 해당 함수만 확인하면 되며, 새 기능을 추가할 때도 메인 루프를 거의 건드리지 않고 함수 추가 + elif 한 줄로 확장할 수 있습니다.
다음 화 예고 — 17화에서는 다른 사람이 미리 만들어둔 기능을 가져와 쓰는 모듈(Module)을 배웁니다. import 한 줄로 파이썬이 기본 제공하는 다양한 기능을 바로 사용하는 법을 다뤄볼게요.
반응형

댓글