본문 바로가기

Back-End/Python

[Python] 파이썬 실습 - 도서 입고/대출/반납 관리를 위한 키오스크 만들기

~ 목차 ~

고객정보 관리 시스템에 이어 두번째 실습은 도서관리 프로그램이다. 

주어진 조건은 다음과 같았다.


 

[미션]
- 도서 목록 : 새로운 책이 도서관에 [입고]되었을 때 프로그램 작성
- 도서 대출 : 도서 목록에서 임의 책을 빌리고자 할 때 [대출] 프로그램 작성
- 도서 반납 : 대출한 도서를 [반납]하고자 할 때 프로그램 작성
- 상태 확인 : 대출하고자 하는 도서가 도서 목록에 있는지?(생략)
- 종료하기 : 종료하기에 대한 프로그램 작성
- 도서 입고/대출/반납/종료 중 원하는 것을 선택했을 때 위 내용 수행합니다.
- 프로그램을 종료하기 전까지는 위 내용은 누구든지 서비스를 받을 수 있도록...반복 실행
- 도서에 대한 확인 값은 자유롭게 정의하셔서 진행

[조건]
- class 생성하여 처리

 


내가 적어본 코드

우선 내가 무엇을 만들어야 할지 크게 틀을 먼저 잡고 시작하였다. (클래스 명, 함수 명 등등)

1. class 생성(Library)
2. 메뉴 함수 : def menu
3. 입고 함수 : def store
4. 대출 함수 : def borrow
5. 반납 함수 : def returned
6. 종료 함수 : def exit
7. 변수 : 책(book)list, 고객(?)
8. 책  : 넘버, 책이름, 작가, 전체 수량, 빌려간 수량, 남아있는 수량

 

 

class Library:

    def __init__(self):
        self.customers = list()
        self.books = list()

    def print_menu(self):
        return input('''
        다음 중 하실 작업을 입력하세요.
        store - 새로운 책 등록
        borrow - 도서 대출
        return - 도서 반납
        exit - 프로그램 종료
        ''').lower()

    def store(self, books):
        print('새로운 책 정보를 입력하세요')
        book = {'number':'','title':'','author':'','totalcount':'', 'borrowcount':'', 'remaincount':''}

        book['number'] = input('책 넘버를 입력하세요 : ')
        book['title'] = input('책 이름을 입력하세요 : ')
        book['author'] = input('책 저자를 입력하세요 : ')
        book['totalcount'] = input('총 수량을 입력하세요 : ')
        book['borrowcount'] = int(input('빌려간 수량을 입력하세요 : '))
        book['remaincount'] = int(book['totalcount'])-int(book['borrowcount'])
        books.append(book)
        print('책 등록이 완료되었습니다.')
        print(books)

    def borrow(self, books):
        print('도서 대출')
        print(f'도서 리스트 : {books}')
        num_book = input('대출할 책 넘버를 입력하세요 : ')
        nums = [book['number'] for book in books]
        
        if num_book in nums:
            for book in books:
                if book['number'] == num_book:
                    remaincount_book = int(book['remaincount'])
                    print(f'해당 {num_book}번의 책이 {remaincount_book}권 남아있습니다.')
                    if remaincount_book > 0:
                        borrow_check = input('대여하시겠습니까? Y/N').upper()
                        if borrow_check == 'Y':
                            print('대여 완료되었습니다.')
                            book['borrowcount'] += 1
                            book['remaincount'] -= 1
                            print(f'대여 후 : {books}')
                        else:
                            print('대여를 취소합니다.')
                    else:
                        print('대여할 수량이 없습니다.')
                    break
        else:
            print('해당 넘버에 해당하는 책이 없습니다.')
            

    def returned(self, books):
        print('도서 반납')
        returned_num = input('반납할 책 넘버를 입력하세요 : ')
        nums = [book['number'] for book in books]
        for book in books:
            if returned_num in nums:
                returned_check = input('반납하시겠습니까? Y/N').upper()
                if returned_check == 'Y':
                    print('반납이 완료되었습니다.')
                    book['borrowcount'] -= 1
                    book['remaincount'] += 1
                    print(f'대여 후 : {books}')
                else:
                    print('반납을 취소합니다.')
            else:
                print('해당 책이 없습니다.')
            break


    def main(self):
        while True:
            menu = self.print_menu()
            if menu == 'store':
                self.store(self.books)
            elif menu == 'borrow':
                self.borrow(self.books)
            elif menu == 'return':
                self.returned(self.books)
            elif menu == 'exit':
                print('안녕히가세요 :)')
                break
            else:
                print('잘못 입력하셨습니다. 다시 입력 해주세요.')

if __name__ == '__main__':
    a = Library()
    a.main()

 

실행 결과:

다음 중 하실 작업을 입력하세요.
        store - 새로운 책 등록
        borrow - 도서 대출
        return - 도서 반납
        exit - 프로그램 종료
         store

새로운 책 정보를 입력하세요

책 넘버를 입력하세요 :  1
책 이름을 입력하세요 :  파이썬기초
책 저자를 입력하세요 :  호이
총 수량을 입력하세요 :  5
빌려간 수량을 입력하세요 :  2

책 등록이 완료되었습니다.
[{'number': '1', 'title': '파이썬기초', 'author': '호이', 'totalcount': '5', 'borrowcount': 2, 'remaincount': 3}]

        다음 중 하실 작업을 입력하세요.
        store - 새로운 책 등록
        borrow - 도서 대출
        return - 도서 반납
        exit - 프로그램 종료
         store

새로운 책 정보를 입력하세요

책 넘버를 입력하세요 :  2
책 이름을 입력하세요 :  정보처리기능사
책 저자를 입력하세요 :  영진
총 수량을 입력하세요 :  1
빌려간 수량을 입력하세요 :  0

책 등록이 완료되었습니다.
[{'number': '1', 'title': '파이썬기초', 'author': '호이', 'totalcount': '5', 'borrowcount': 2, 'remaincount': 3}, {'number': '2', 'title': '정보처리기능사', 'author': '영진', 'totalcount': '1', 'borrowcount': 0, 'remaincount': 1}]

        다음 중 하실 작업을 입력하세요.
        store - 새로운 책 등록
        borrow - 도서 대출
        return - 도서 반납
        exit - 프로그램 종료
         Borrow

도서 대출
도서 리스트 : [{'number': '1', 'title': '파이썬기초', 'author': '호이', 'totalcount': '5', 'borrowcount': 2, 'remaincount': 3}, {'number': '2', 'title': '정보처리기능사', 'author': '영진', 'totalcount': '1', 'borrowcount': 0, 'remaincount': 1}]

대출할 책 넘버를 입력하세요 :  2

해당 2번의 책이 1권 남아있습니다.

대여하시겠습니까? Y/N y

대여 완료되었습니다.
대여 후 : [{'number': '1', 'title': '파이썬기초', 'author': '호이', 'totalcount': '5', 'borrowcount': 2, 'remaincount': 3}, {'number': '2', 'title': '정보처리기능사', 'author': '영진', 'totalcount': '1', 'borrowcount': 1, 'remaincount': 0}]

        다음 중 하실 작업을 입력하세요.
        store - 새로운 책 등록
        borrow - 도서 대출
        return - 도서 반납
        exit - 프로그램 종료
         borro

잘못 입력하셨습니다. 다시 입력 해주세요.

       다음 중 하실 작업을 입력하세요.
        store - 새로운 책 등록
        borrow - 도서 대출
        return - 도서 반납
        exit - 프로그램 종료
         borrow
도서 대출
도서 리스트 : [{'number': '1', 'title': '파이썬기초', 'author': '호이', 'totalcount': '5', 'borrowcount': 2, 'remaincount': 3}, {'number': '2', 'title': '정보처리기능사', 'author': '영진', 'totalcount': '1', 'borrowcount': 1, 'remaincount': 0}]
대출할 책 넘버를 입력하세요 :  2
해당 2번의 책이 0권 남아있습니다.
대여할 수량이 없습니다.

        다음 중 하실 작업을 입력하세요.
        store - 새로운 책 등록
        borrow - 도서 대출
        return - 도서 반납
        exit - 프로그램 종료
         return
도서 반납
반납할 책 넘버를 입력하세요 :  2
반납하시겠습니까? Y/N y
반납이 완료되었습니다.
대여 후 : [{'number': '1', 'title': '파이썬기초', 'author': '호이', 'totalcount': '5', 'borrowcount': 1, 'remaincount': 4}, {'number': '2', 'title': '정보처리기능사', 'author': '영진', 'totalcount': '1', 'borrowcount': 1, 'remaincount': 0}]
(왜 count가 안변하지...?)
        다음 중 하실 작업을 입력하세요.
        store - 새로운 책 등록
        borrow - 도서 대출
        return - 도서 반납
        exit - 프로그램 종료

 exit
안녕히가세요 :)

 


교수님 코드

### 기능을 수행할 클래스(모듈 or 라이브러리) 정의 =>메모리 공간 생성 >메모리영역에 저장해서 따로 관리 가능
class LibraryKiosk: 
     ### 클래스 생성자 정의
    def __init__(self):
         ### 도서 목록을 저장할 딕셔너리 변수 생성
         # - 도서번호, 도서제목, 도서재고수량 정보 담기
         self.books = {}
         print('클래스 생성 되었습니다.')

    ### 도서입고 기능 정의하기
    def add_book(self, book_id, title, quantity):
        ### 입고할 도서번호가 존재하는지 확인
        # - 존재한다면 수량만 증가시키기
        # - self.books : books의 key값을 모두 가져옴(리스트 형태로)
        if book_id in self.books:
            # self.books[book_id]['quantity'] = self.books[book_id]['quantity'] + quantity  
            self.books[book_id]['quantity'] += quantity  
        # - 존재하지 않는다면.. 값 넣어주기
        else:
            # {'001' : {'title':'파이썬 기초', 'quantity':4} }
            self.books[book_id] = {'title':title, 'quantity':quantity}
        print(f"도서번호 : {book_id} /제목 : {title} / 입고수량 : {quantity} 입고 성공!!")

    ### 도서 대출 기능 정의하기
    def borrow_book(self, book_id):
        ### 대출하고자 하는 도서번호에 해당하는 재고수량 확인
        if (book_id in self.books) and (self.books[book_id]['quantity']) > 0 :
            self.books[book_id]['quantity'] -= 1
            print("대출이 완료되었습니다.")
            print(f"도서번호:{book_id} / 제목:{self.books[book_id]['title']} / 남은재고수량:{self.books[book_id]['quantity']}")
        else:
            print("도서가 존재하지 않거나, 대출할 재고가 없습니다.")

    ### 도서 반납 기능 정의하기
    def return_book(self, book_id):
        ### 반납하고자 하는 도서번호에 해당하는 도서 정보 확인
        if book_id in self.books:
            self.books[book_id]['quantity'] += 1
            print(f"도서번호:{book_id} / 제목:{self.books[book_id]['title']} / 남은재고수량:{self.books[book_id]['quantity']}")

        # - 해당 도서가 목록에 없다면
        else:
            print("해당 도서가 존재하지 않습니다.")
### 2. 최초에 실행할 기능(함수) 정의
def main():
    ### 클래스 생성하기
    # - 최초 한번 : 프로그램이 종료되면 클래스는 소멸(메모리 공간 삭제)됩니다.
    kiosk = LibraryKiosk()
    print(kiosk)
    
    #print('성공!')
    ###3. 메뉴 선택 보여주기
    while True:
        print('<도서 키오스크 메뉴>')
        print('1. 도서 입고')
        print('2. 도서 대출')
        print('3. 도서 반납')
        print('4. 종료')

        choice = input('원하는 번호(1~4)를 선택하세요 : ')

        if choice == '1':
            # print('입고 선택')
            book_id = input('도서 번호를 입력해 주세요 : ')
            title = input('도서 제목을 입력해 주세요 : ')
            quantity = int(input('입고할 권수를 입력해 주세요 : '))
            # print(f"{book_id} / {title} / {quantity}")
            # - 클래스 내부의 입고 기능 호출하기
            kiosk.add_book(book_id, title, quantity)
            
        elif choice == '2':
            # print('대출 선택')
            book_id = input("대출할 도서번호를 입력해주세요 : ")
            # - 클래스 내부의 대출 기능 호출하기
            kiosk.borrow_book(book_id)
            
        elif choice == '3':
            # print('반납 선택')
            book_id = input("반납할 도서번호를 입력해주세요 : ")
            # - 클래스 내부의 반납 기능 호출하기
            kiosk.return_book(book_id)
            
        elif choice == '4':
            print('종료 선택')
            break
            
        else:
            print('잘못 선택하였습니다. 다시 선택해 주세요!')

### 1. 최초 코드 시작
if __name__ == "__main__":
    ### 최초에 실행할 기능(함수) 호출
    main()

 

 

결과

 

클래스 생성 되었습니다.
<__main__.LibraryKiosk object at 0x000001D0CA163350>
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 :  1
도서 번호를 입력해 주세요 :  1
도서 제목을 입력해 주세요 :  vkdlTjs
입고할 권수를 입력해 주세요 :  5
도서번호 : 1 /제목 : vkdlTjs / 입고수량 : 5 입고 성공!!
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 :  2
대출할 도서번호를 입력해주세요 :  1
대출이 완료되었습니다.
도서번호:1 / 제목:vkdlTjs / 남은재고수량:4
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 :  3
반납할 도서번호를 입력해주세요 :  1
도서번호:1 / 제목:vkdlTjs / 남은재고수량:5
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 :  3
반납할 도서번호를 입력해주세요 :  1
도서번호:1 / 제목:vkdlTjs / 남은재고수량:6
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 :  4
종료 선택

 

※ 해결해야할 문제 : 반납을 계속시도하면 반납 count가 계속 늘어남, 유저 정보 넣지 않은 상태라서 누가 빌렸는지 모른다.

728x90