본문 바로가기
코딩교육/Python 초등교육에서 전문가까지

2단계 : 5. 리스트와 반복문 (실습:도서관리시스템)

by 제리토리 2025. 3. 26.
728x90
반응형

 

 

📚 도서 관리 시스템: 리스트와 반복문 실습 예제

 

 

✅ 학습 목표

 

이 실습 예제를 통해 다음 개념을 익힐 수 있습니다:

리스트(List)의 활용

딕셔너리(Dictionary)와 함께 사용하는 리스트

반복문(for, while)의 실전 적용

조건문(if)과 리스트 검색

사용자 입력 처리

 

 

🧩 예제 소개

 

도서 관리 시스템은 도서 목록을 관리하고, 검색하거나, 대출/반납 기록을 저장하는 프로그램입니다. 실습을 통해 리스트에 데이터를 추가하거나 반복문을 통해 목록을 출력하는 등의 기능을 구현해 볼 수 있습니다.

 

 

🔸 1. 도서 리스트 구성

 

도서는 딕셔너리로 구성되어 있으며, 여러 권의 책을 리스트로 관리합니다.

books = [
    {"id": 1, "title": "파이썬 프로그래밍 기초", "author": "김파이", "status": "대출 가능"},
    {"id": 2, "title": "리스트와 반복문의 모든 것", "author": "이루프", "status": "대출 가능"},
    {"id": 3, "title": "데이터 분석 입문", "author": "박데이터", "status": "대출 중"}
]

 

이처럼 리스트 안에 딕셔너리를 넣어, 각각의 책 정보를 담고 관리합니다.

 

 

 

🔸 2. 도서 목록 전체 출력

 

for 반복문을 사용하여 모든 도서를 출력할 수 있습니다.

for book in books:
    print(f"{book['id']} | {book['title']} | {book['author']} | {book['status']}")

 

💡 설명:

  • books 리스트를 순회하면서 각 book 딕셔너리를 가져옵니다.

  • book['title']처럼 딕셔너리의 값을 꺼내 출력합니다.

 

 

🔸 3. 도서 검색 (리스트 컴프리헨션)

 

사용자가 입력한 검색어에 따라, 제목 또는 저자 이름에 해당 키워드가 포함된 책을 찾습니다.

keyword = input("검색어를 입력하세요: ")
found_books = [book for book in books if keyword in book['title'] or keyword in book['author']]

 

💡 리스트 컴프리헨션:

  • 리스트를 새로 만들면서 조건에 맞는 항목만 골라낼 수 있습니다.

  • 위 코드는 keyword가 포함된 책만 새 리스트에 담습니다.

 

 

🔸 4. 도서 추가

 

리스트에 새 도서 정보를 append() 메서드로 추가합니다.

new_book = {
    "id": max(book['id'] for book in books) + 1,
    "title": input("제목 입력: "),
    "author": input("저자 입력: "),
    "status": "대출 가능"
}
books.append(new_book)

 

💡 설명:

  • max()와 리스트 컴프리헨션을 이용해 가장 큰 ID를 찾아서 새로운 ID를 자동 생성합니다.

  • append()는 리스트 끝에 새 요소를 추가하는 메서드입니다.

 

 

🔸 5. 도서 대출 및 반납 처리

 

특정 도서를 찾기 위해 for 반복문을 사용하고, 조건문으로 대출 상태를 확인합니다.

book_id = int(input("도서 ID를 입력하세요: "))
for book in books:
    if book['id'] == book_id:
        if book['status'] == "대출 가능":
            book['status'] = "대출 중"
            print("도서를 대출했습니다.")
        else:
            book['status'] = "대출 가능"
            print("도서를 반납했습니다.")
        break

 

 

 

🔸 6. 대출/반납 기록 저장

 

대출/반납 시 기록을 리스트에 추가해 추후 확인이 가능합니다.

loan_history = []
loan_record = {
    "book_id": book_id,
    "title": book['title'],
    "action": "대출",
    "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
loan_history.append(loan_record)

 

 

📌 마무리: 리스트와 반복문의 조화

 

이 예제를 통해 여러분은 다음과 같은 Python 기법을 실전에서 익혔습니다.

개념 적용 예시
리스트 books, loan_history 등 데이터 저장
반복문 (for) 도서 전체 출력, 도서 검색 등
리스트 컴프리헨션 조건에 맞는 도서 검색
딕셔너리 각 도서의 정보를 저장하는 구조
append() 리스트에 새 항목 추가
조건문 (if) 대출 상태 확인 및 처리

 

 

🔍 도전 과제

  • 책 제목을 오름차순 또는 내림차순 정렬해 출력해 보세요.

  • 특정 저자가 쓴 모든 책을 모아보는 기능을 만들어 보세요.

  • 반납 기한이 지난 도서를 찾아 경고 메시지를 출력하도록 개선해 보세요.

 

 

전체 소스코드

import os
import sys
import time
from datetime import datetime

# 화면 지우기 함수
def clear_screen():
    if sys.platform == 'win32':
        os.system('cls')
    else:
        os.system('clear')

# 초기 도서 목록
books = [
    {"id": 1, "title": "파이썬 프로그래밍 기초", "author": "김파이", "status": "대출 가능"},
    {"id": 2, "title": "리스트와 반복문의 모든 것", "author": "이루프", "status": "대출 가능"},
    {"id": 3, "title": "데이터 분석 입문", "author": "박데이터", "status": "대출 중"},
    {"id": 4, "title": "알고리즘의 이해", "author": "최알고", "status": "대출 가능"},
    {"id": 5, "title": "웹 개발 첫걸음", "author": "정웹", "status": "대출 중"}
]

# 대출 기록 리스트
loan_history = []

# 도서 관리 시스템 메인 루프
def book_management_system():
    while True:
        clear_screen()
        print("\n" + "=" * 50)
        print(" " * 15 + "도서 관리 시스템")
        print("=" * 50)
        print("\n1. 전체 도서 목록 보기")
        print("2. 도서 검색")
        print("3. 새 도서 추가")
        print("4. 도서 대출/반납")
        print("5. 대출 기록 보기")
        print("6. 프로그램 종료")
        print("\n" + "=" * 50)

        choice = input("\n메뉴를 선택하세요 (1-6): ")

        if choice == '1':
            show_all_books()
        elif choice == '2':
            search_book()
        elif choice == '3':
            add_new_book()
        elif choice == '4':
            loan_return_book()
        elif choice == '5':
            show_loan_history()
        elif choice == '6':
            print("\n프로그램을 종료합니다.")
            time.sleep(1)
            break
        else:
            print("\n잘못된 선택입니다. 다시 시도해주세요.")
            time.sleep(1.5)

def show_all_books():
    clear_screen()
    print("\n" + "=" * 70)
    print(" " * 25 + "전체 도서 목록")
    print("=" * 70)
    print(f"{'ID':^5}|{'제목':^30}|{'저자':^15}|{'상태':^15}")
    print("-" * 70)

    for book in books:
        print(f"{book['id']:^5}|{book['title']:^30}|{book['author']:^15}|{book['status']:^15}")

    input("\n메인 메뉴로 돌아가려면 Enter를 누르세요...")

def search_book():
    clear_screen()
    print("\n" + "=" * 50)
    print(" " * 15 + "도서 검색")
    print("=" * 50)

    keyword = input("\n검색어를 입력하세요 (제목 또는 저자): ")
    found_books = [book for book in books if keyword.lower() in book['title'].lower() or keyword.lower() in book['author'].lower()]

    if found_books:
        print("\n검색 결과:")
        print(f"{'ID':^5}|{'제목':^30}|{'저자':^15}|{'상태':^15}")
        print("-" * 70)

        for book in found_books:
            print(f"{book['id']:^5}|{book['title']:^30}|{book['author']:^15}|{book['status']:^15}")
    else:
        print("\n검색 결과가 없습니다.")

    input("\n메인 메뉴로 돌아가려면 Enter를 누르세요...")

def add_new_book():
    clear_screen()
    print("\n" + "=" * 50)
    print(" " * 15 + "새 도서 추가")
    print("=" * 50)

    new_id = max(book['id'] for book in books) + 1
    title = input("\n제목을 입력하세요: ")
    author = input("저자를 입력하세요: ")

    new_book = {"id": new_id, "title": title, "author": author, "status": "대출 가능"}
    books.append(new_book)

    print(f"\n'{title}' 도서가 성공적으로 추가되었습니다.")
    input("\n메인 메뉴로 돌아가려면 Enter를 누르세요...")

def loan_return_book():
    clear_screen()
    print("\n" + "=" * 50)
    print(" " * 15 + "도서 대출/반납")
    print("=" * 50)

    book_id = input("\n도서 ID를 입력하세요: ")

    try:
        book_id = int(book_id)
        found = False

        for book in books:
            if book['id'] == book_id:
                found = True
                now_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                if book['status'] == "대출 가능":
                    book['status'] = "대출 중"
                    loan_record = {"book_id": book_id, "title": book['title'], "action": "대출", "time": now_time}
                    loan_history.append(loan_record)
                    print(f"\n'{book['title']}' 도서가 성공적으로 대출되었습니다.")
                else:
                    book['status'] = "대출 가능"
                    return_record = {"book_id": book_id, "title": book['title'], "action": "반납", "time": now_time}
                    loan_history.append(return_record)
                    print(f"\n'{book['title']}' 도서가 성공적으로 반납되었습니다.")
                break

        if not found:
            print("\n해당 ID의 도서를 찾을 수 없습니다.")
    except ValueError:
        print("\n유효한 숫자를 입력하세요.")

    input("\n메인 메뉴로 돌아가려면 Enter를 누르세요...")

def show_loan_history():
    clear_screen()
    print("\n" + "=" * 70)
    print(" " * 25 + "대출/반납 기록")
    print("=" * 70)

    if loan_history:
        print(f"{'ID':^5}|{'제목':^30}|{'동작':^10}|{'시간':^20}")
        print("-" * 70)
        for record in reversed(loan_history):
            print(f"{record['book_id']:^5}|{record['title']:^30}|{record['action']:^10}|{record['time']:^20}")
    else:
        print("\n대출/반납 기록이 없습니다.")

    input("\n메인 메뉴로 돌아가려면 Enter를 누르세요...")

# 실행 시작
if __name__ == "__main__":
    book_management_system()

 

728x90
반응형