Python - 2. Vending Machine Class

Fox 🦊·2023년 10월 22일

마지막 강의

목록 보기
3/3

Vending Machine Class

3주차 수업에서는 Python 으로 객체지향을 구현해 보았습니다.

Item Class


class Item: 
    def __init__(self, name, price, number=0, count=0):
        # Class나 Function에서 내부 구현 없이 이름을 전달해줄 필요가 있을 때 사용 (코드 작성시 제거)
        self.name = name
        self.price = price
        self.number = number
        self.count = count

    def __lt__(self, item1):
        return self.price < item1.price
    
    def __add__(self, item1):
        combo_name = f"{self.name} + {item1.name}"
        combo_price = (self.price + item1.price)*0.9
        return Item(combo_name, combo_price)

📚Operator Overloading


  • Operator overloading is a feature in object-oriented programming languages that allows you to define multiple behaviors for a single operator based on the types of its operands. This means that you can use operators like +, -, *, /, and others to perform custom operations on objects of user-defined classes.

  • 위의 설명처럼, 연산에 대한 작업을 Class의 메서드로 정의하면,

    Item1 + Item2, Item1*Item2, Item1>Item2 와 같이 연산자를 인스턴스 사이에 사용할 수 있습니다.

Vending Machine Class



class VendingMachine:
    def __init__(self):
        self.item_list = []
        self.input_money = 0
        
    
    # 자판기에서 판매할 제품 등록 (제품명, 가격, 번호)
    def initialize(self):
        number = 1
        print("1. 제품 등록")
        print("-" * 70)
        
        while True:
            # 제품명과 가격을 입력할 때 콤마(,)를 사용하여 구분
            # Item 클레스의 인스턴스를 생성하여 제품명, 가격, 번호를 기입한 후 item_list 리스트에 저장
            inputStr = input("자판기에서 판매할 제품의 제품명과 제품가격 입력(종료시 0 입력) : ")
            
            if inputStr == "0":
                break
            
            name, price = inputStr.split(",")
            price = float(price)
            item = Item(name,price,number)
            self.item_list.append(item)
            number += 1
            

        print("제품 등록 완료")
        print("-" * 70)
        print('\n')

    # Operator Overloading을 활용하여 두 개 제품의 조합을 생성 (가격은 10% 할인 적용)   
    # 추가된 제품의 number는 0번으로 설정 
    def add_combo_menu(self):
        combo_list = []
        for item1 in self.item_list:
            for item2 in self.item_list:
                if item1.number < item2.number:
                    combo_item = item1+item2
                    combo_item.number  = 0

                    combo_list.append(combo_item)
        
        self.item_list += combo_list 

    # Operator Overloading을 활용하여 제품의 가격을 기준으로 오름차순 정렬
    # 오름차순으로 정렬된 제품 순서대로 1번부터 number를 설정
    def numbering(self):
        self.item_list.sort()
        number = 1
        for item in self.item_list:
            item.number = number
            number += 1
        
    
    # 자판기에서 판매하는 제품 목록 확인
    def show_menu(self): 
        print("2. 제품 목록 확인")
        print("-" * 70)
        
        
        for item in self.item_list:
            print("번호: {}, 제품명: {}, 가격: {}".format(item.number,item.name,item.price))
            

        print("-" * 70)
        print('\n')
    
    
    # 현금 투입
    def insert_money(self):
        print("3. 현금 투입") 
        print("-" * 70)

        while True:
            money = input("투입할 금액(종료시 0 입력) : ")
            
            if money == "0":
                break
            
            self.input_money += int(money)
                
        print("총 투입 금액 : {}".format(self.input_money))
        print("-" * 70)
        print('\n')
    
    
    # 제품 구매
    def buy_item(self):
        print("4. 제품 구매")
        print("-" * 70)
        
        while True:
            num = input("제품 번호 선택(종료시 0 입력) : ")
            
            if num == "0":
                break
            num = float(num)

                
            selected_item = None
            for item in self.item_list:
                if item.number == num:
                    selected_item = item
                    break

            selected_item.count += 1
            self.input_money -= selected_item.price
            print("{} 구입완료".format(selected_item.name))
            print("남은잔액: {}".format(self.input_money))
            print('\n')

        print("-" * 70)
        print('\n')
        
    # 구매 목록 및 남은 잔액 출력
    def receipt(self):
        print("5. 구매 목록")
        print("-" * 70)
        for item in self.item_list:
            if item.count > 0:
                print("{}: {}개 구입".format(item.name,item.count))
        print("거스름돈: {}원".format(self.input_money))
        print("-" * 70)

실행 예시


1. Initialize

2. Add Combo Menu

3. Numbering

4. Show Menu

5. Insert Money

6. Buy Item

7. Receipt

profile
Frontend

0개의 댓글