티스토리 뷰

지금까지 배운 내용을 복습하기 위한 퀴즈를 드리겠습니다. 직접 한 번 풀어보시고 나서 정답을 확인해주세요.

Quiz) 동네에 항상 대기 손님이 있는 맛있는 치킨집이 있습니다.

대기 손님의 치킨 요리 시간을 줄이고자 자동 주문 시스템을 제작하였습니다.

시스템 코드를 확인하고 적절한 예외처리 구문을 넣으시오.

 

조건1 : 1보다 작거나 숫자가 아닌 입력값이 들어올 때는 ValueError 로 처리

        출력 메세지 : "잘못된 값을 입력하였습니다."

조건2 : 대기 손님이 주문할 수 있는 총 치킨량은 10마리로 한정

        치킨 소진 시 사용자 정의 에러[SoldOutError]를 발생시키고 프로그램 종료

        출력 메세지 : "재고가 소진되어 더 이상 주문을 받지 않습니다."

 

[코드]

chicken = 10 # 남은 치킨 수
waiting = 1 # 홀 안에는 현재 만석. 대기번호 1부터 시작

while(True):
    print("[남은 치킨 : {0}]".format(chicken))
    order = int(input("치킨 몇 마리 주문하시겠습니까?"))
    if order > chicken: # 남은 치킨보다 주문량이 많을 때
        print("재료가 부족합니다.")
    else:
        print("[대기번호 {0}] {1} 마리 주문이 완료되었습니다.".format(waiting, order))
        waiting += 1 # 대기번호 증가
        chicken -= order # 주문 수 만큼 남은 치킨 감소

 

주어진 코드를 살펴보면 먼저 남은 치킨 수 (chicken) 와 대기번호 (waiting) 를 각각 10 마리와 1 번으로 초기화합니다. 반복문 내에서 사용자로부터 치킨 주문을 받으며 이 때 주문 수가 남은 치킨 수를 초과하는 경우 "재료가 부족합니다" 를 출력합니다. 그렇지 않은 경우에는 현재 대기번호 손님이 몇 마리 치킨을 주문하였다는 내용을 출력하고 대기번호를 증가, 그리고 남은 치킨 수는 주문 수만큼 감소시킵니다.

 

코드를 실행하면서 동작을 자세히 살펴보겠습니다.

[남은 치킨 : 10]
치킨 몇 마리 주문하시겠습니까?

처음에는 치킨이 10 마리 남아있으므로 5 마리를 먼저 주문해보기 위해 5 를 입력 후 엔터를 칩니다.

[대기번호 1] 5 마리 주문이 완료되었습니다.
[남은 치킨 : 5]
치킨 몇 마리 주문하시겠습니까?

그랬더니 대기번호 1 번 손님에 대해 5 마리 주문이 완료되었다는 문구가 나오고 남은 치킨은 5 마리로 잘 출력이 되네요. 반복문을 통해 계속하여 주문은 받고 있는 상황입니다.

 

이번에는 2 마리를 더 주문해볼까요? 2 를 입력 후 엔터를 칩니다.

[대기번호 2] 2 마리 주문이 완료되었습니다.
[남은 치킨 : 3]
치킨 몇 마리 주문하시겠습니까?

대기번호가 증가하여 2 가 되고 남은 치킨은 3 마리가 됩니다.

 

이번에는 남은 치킨 수를 초과하는 상황을 만들기 위해 10 을 입력해보겠습니다.

재료가 부족합니다.
[남은 치킨 : 3]
치킨 몇 마리 주문하시겠습니까?

치킨은 3 마리 남았는데 10 마리 주문이 들어오니 재료가 부족하다는 메시지와 함께 남은 치킨 수는 그대로 있네요. 정상적인 동작입니다.

 

만약에 0 마리를 주문해보면 어떨까요?

[대기번호 3] 0 마리 주문이 완료되었습니다.
[남은 치킨 : 3]
치킨 몇 마리 주문하시겠습니까?

지금은 예외처리가 되어 있지 않아서 0 마리인데도 불구하고 주문이 되었다는 문구가 뜨네요.

 

그러면 음수로, -1 을 넣어볼까요?

[대기번호 4] -1 마리 주문이 완료되었습니다.
[남은 치킨 : 4]
치킨 몇 마리 주문하시겠습니까?

큰일이 생겼습니다. 없던 치킨이 생겨서 남은 치킨이 4 마리로 늘어나는 문제가 발생했네요.

 

마지막으로 한글로 주문을 해보겠습니다. "10마리" 라고 입력을 해볼게요

치킨 몇 마리 주문하시겠습니까?10마리
Traceback (most recent call last):
  File "파일경로", line 16, in <module>
    order = int(input("치킨 몇 마리 주문하시겠습니까?"))
ValueError: invalid literal for int() with base 10: '10마리'

그랬더니 ValueError 가 발생하면서 프로그램이 비정상 종료가 됩니다.

 

이와 같이 정상적이지 않은 입력값에 대한 처리, 그리고 남은 치킨 수가 0 이 되었을 때의 처리를 해주시면 됩니다.

 

▼ 해설 보기

더보기

먼저 조건1 에서 1보다 작거나 숫자가 아닌 입력값에 대한 예외처리를 해야 하므로 소스코드를 try ~ except 구문으로 감싸주겠습니다. 이 때 while 구문을 통째로 감싸게 되면 잘못된 값이 입력된 경우 while 구문 밖에 있는 except 에서 처리가 되어서 프로그램이 바로 종료되기 때문에 잘못된 값이 입력되더라도 계속하여 반복문이 실행되도록 하기 위해서는 while 구문 내부의 코드만 try ~ except 로 감싸도록 합니다.

chicken = 10
waiting = 1

while(True):
    try: # try 구문 추가
        print("[남은 치킨 : {0}]".format(chicken))
        order = int(input("치킨 몇 마리 주문하시겠습니까?"))
        if order > chicken:
            print("재료가 부족합니다.")        
        else:
            print("[대기번호 {0}] {1} 마리 주문이 완료되었습니다.".format(waiting, order))
            waiting += 1
            chicken -= order
    except ValueError: # ValueError 처리 추가
        print("잘못된 값을 입력하였습니다.")

이렇게만 해도 입력값이 숫자가 아닌 경우에는 정수형으로 변환하는 int(input(...)) 부분에서 에러가 발생하므로 except 에서 예외처리가 되겠네요. 

하지만 "1보다 작거나" 에 해당하는 조건은 아직 처리되지 않았으므로 코드를 보완하겠습니다. 입력값이 정수로 변환은 되는데 1보다 작은 경우는 if 구문을 수정하면 될 텐데요. 남은 치킨보다 주문량이 많은 경우를 제외한 모든 경우는 else: 에서 정상 주문으로 처리가 되므로 사이에 elif 구문을 추가하여 입력값이 1보다 작은지 비교하고 그렇다면 ValueError 를 발생시키도록 합니다.

chicken = 10
waiting = 1

while(True):
    try:
        print("[남은 치킨 : {0}]".format(chicken))
        order = int(input("치킨 몇 마리 주문하시겠습니까?"))
        if order > chicken:
            print("재료가 부족합니다.")    
        elif order <= 0: # 입력값이 1보다 작은 수일 때
            raise ValueError    
        else:
            print("[대기번호 {0}] {1} 마리 주문이 완료되었습니다.".format(waiting, order))
            waiting += 1
            chicken -= order
    except ValueError:
        print("잘못된 값을 입력하였습니다.")

 

이제 조건 1 은 모두 처리가 되었으니 조건 2 를 살펴보겠습니다. 대기 손님이 주문할 수 있는 치킨은 총 10마리로 한정되기 때문에 남은 치킨 수가 0 이 되면 사용자 정의 에러인 SoldOutError 를 발생시키고 안내 문구 출력 후 프로그램을 종료하도록 하면 되겠네요. 

 

우선 코드 맨 위에 SoldOutError 를 정의합니다. 세부 동작은 구현하지 않고 pass 로만 두겠습니다.

class SoldOutError(Exception): # 사용자 정의 에러 (재고 소진)
    pass

 

그리고 while 구문 내에서 남은 치킨 수가 0 이 되면 SoldOutError 를 발생시키면 되겠네요. 기존 if 구문 아래쪽에 새로운 if 를 추가하도록 합니다. 그리고 이 때 발생시킨 SoldOutError 를 처리하기 위해서 except SoldOutError: 구문을 추가하고 조건 2 에 제시된 안내 문구를 출력하도록 합니다. 그리고 이 상황에서는 더 이상 주문을 받을 수 없기 때문에 break 를 통해서 while 구문을 탈출하여 프로그램이 종료되도록 합니다.

chicken = 10
waiting = 1

while(True):
    try:
        print("[남은 치킨 : {0}]".format(chicken))
        order = int(input("치킨 몇 마리 주문하시겠습니까?"))
        if order > chicken:
            print("재료가 부족합니다.")    
        elif order <= 0:
            raise ValueError    
        else:
            print("[대기번호 {0}] {1} 마리 주문이 완료되었습니다.".format(waiting, order))
            waiting += 1
            chicken -= order

        if chicken == 0: # 남은 치킨 수가 0 이면
            raise SoldOutError # 더 이상 주문 불가하므로 재고 소진 에러 발생
    except ValueError:
        print("잘못된 값을 입력하였습니다.")
    except SoldOutError: # 재고 소진 에러 처리
        print("재고가 소진되어 더 이상 주문을 받지 않습니다.")
        break # while 반복문 탈출

 

동작 확인을 위해 프로그램을 실행시키고 먼저 5 를 입력합니다.

[남은 치킨 : 10]
치킨 몇 마리 주문하시겠습니까?5
[대기번호 1] 5 마리 주문이 완료되었습니다.
[남은 치킨 : 5]
치킨 몇 마리 주문하시겠습니까?

 

이어서 3 을 입력합니다. 아직까지는 정상적인 값들에 대한 입력입니다.

[대기번호 2] 3 마리 주문이 완료되었습니다.
[남은 치킨 : 2]
치킨 몇 마리 주문하시겠습니까?

 

이번에는 주문이 될 수 없는 0 을 입력해보겠습니다.

잘못된 값을 입력하였습니다.
[남은 치킨 : 2]
치킨 몇 마리 주문하시겠습니까?

 

예외처리가 잘 되었네요. 음수인 -10 을 입력하여 예외처리가 잘 되는지 확인합니다.

잘못된 값을 입력하였습니다.
[남은 치킨 : 2]
치킨 몇 마리 주문하시겠습니까?

 

이번에는 남은 치킨 수를 초과하는 주문을 확인하기 위해 4 를 입력합니다.

재료가 부족합니다.
[남은 치킨 : 2]
치킨 몇 마리 주문하시겠습니까?

 

한글도 입력해볼까요? "세마리" 라고 입력합니다.

잘못된 값을 입력하였습니다.
[남은 치킨 : 2]
치킨 몇 마리 주문하시겠습니까?

 

이제는 프로그램이 비정상 종료되지 않고 계속하여 주문을 받네요.

마지막으로 재고 소진을 위해 2 를 입력합니다.

[대기번호 3] 2 마리 주문이 완료되었습니다.
재고가 소진되어 더 이상 주문을 받지 않습니다.

 

그랬더니 정상적으로 주문 완료 후 재고 소진 안내 문구와 함께 프로그램이 종료되는 것을 확인할 수 있습니다. 예외 처리를 적용하여 보다 탄탄하고 신뢰할 수 있는 좋은 프로그램이 완성되었습니다.

 

지금까지 작성된 전체 코드입니다.

class SoldOutError(Exception):
    pass

chicken = 10
waiting = 1

while(True):
    try:
        print("[남은 치킨 : {0}]".format(chicken))
        order = int(input("치킨 몇 마리 주문하시겠습니까?"))
        if order > chicken:
            print("재료가 부족합니다.")    
        elif order <= 0:
            raise ValueError    
        else:
            print("[대기번호 {0}] {1} 마리 주문이 완료되었습니다.".format(waiting, order))
            waiting += 1
            chicken -= order

        if chicken == 0:
            raise SoldOutError
    except ValueError:
        print("잘못된 값을 입력하였습니다.")
    except SoldOutError:
        print("재고가 소진되어 더 이상 주문을 받지 않습니다.")
        break

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함