Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python Switch 문 완벽 가이드: 딕셔너리로 switch-case 구현하기

Java나 C#과 달리 Python에는 내장 switch 문이 없습니다. 따라서 "switch…case" 문을 대신하는 코드를 직접 작성하지 않는 한 switch 표현식을 평가할 수 없습니다.

이 가이드에서는 Python에서 "switch…case"를 구현하는 방법을 설명하고, 두 가지 실제 예제를 통해 여러분의 코드에 바로 적용할 수 있도록 안내합니다.

Switch 문 핵심 개념 복습

switch 문은 여러 개의 코드 블록 중 하나를 골라 실행할 수 있게 해주는 제어문입니다. 프로그램에서 다양한 조건의 표현식을 평가할 때 유용하게 사용됩니다.

switch 문은 먼저 switch 표현식을 평가한 뒤, 그 결과를 각 "case" 문에 명시된 값들과 비교하는 방식으로 동작합니다. 일치하는 case를 찾으면 해당 코드 블록이 실행되고, 찾지 못하면 아무것도 실행되지 않습니다.

선택 사항으로 "default" 키워드를 사용하면 어떤 case와도 일치하지 않을 때 실행할 기본 코드 블록을 지정할 수 있습니다.

Python Switch 문: 개별 값 반환하기

숫자 값을 요일 이름으로 변환하는 프로그램을 만들어 보겠습니다.

먼저 사용자에게 변환하고 싶은 요일 번호를 입력받습니다:

convert_to_day = int(input("요일 번호를 입력하세요: "))

사용자가 입력한 값을 정수(int)로 변환했습니다. 그 이유는 잠시 후 자세히 설명하겠습니다.

다음으로 요일 정보를 담은 딕셔너리를 정의합니다. 각 키(key)에는 숫자 형태의 요일 번호를, 각 값(value)에는 해당 요일의 이름을 저장합니다:

days = {
    1: "월요일",
    2: "화요일",
    3: "수요일",
    4: "목요일",
    5: "금요일",
    6: "토요일",
    7: "일요일"
}

딕셔너리에는 7개의 키와 값이 들어 있습니다. 키 "1"은 "월요일"을 나타내며, 이런 식으로 일주일의 마지막 날까지 차례대로 매핑됩니다.

다음으로 딕셔너리의 get() 메서드를 사용해 사용자가 입력한 값에 해당하는 항목을 조회합니다:

day_as_written = days.get(convert_to_day, "해당 숫자에 일치하는 요일이 없습니다.")
print(day_as_written)

사용자가 입력한 값을 정수로 변환한 이유는 get() 메서드에서 바로 사용할 수 있도록 하기 위함입니다. 만약 "convert_to_day" 변수에 저장된 값과 같은 키가 딕셔너리에 없다면, 코드는 "해당 숫자에 일치하는 요일이 없습니다."라는 메시지를 반환합니다.

사용자가 "1"을 입력했다면 코드는 다음을 평가합니다:

days[1]

이 코드는 딕셔너리에서 키 "1"에 연결된 값을 가져옵니다.

코드를 실행해 결과를 확인해 보겠습니다:

요일 번호를 입력하세요: 1
월요일

코드가 사용자가 입력한 숫자를 성공적으로 요일 문자열로 변환했습니다. 이번에는 딕셔너리에 존재하지 않는 요일 번호로 실행해 보겠습니다:

요일 번호를 입력하세요: 8
해당 숫자에 일치하는 요일이 없습니다.

사용자가 잘못된 값을 입력해도 코드가 정상적으로 처리되는 것을 확인할 수 있습니다.

Python Switch 문: 함수 호출하기

같은 문법을 활용해 함수를 호출할 수도 있습니다. 이번에는 샌드위치 가게의 구매 목록 정보를 보여주는 애플리케이션을 만들어 보겠습니다.

먼저 구매 목록을 정의합니다:

purchases = [2.50, 2.50, 2.75, 3.90, 5.60, 2.40]

다음으로 세 개의 함수를 정의합니다. 각 함수는 다음을 계산합니다:

  • 목록에 있는 구매 건수
  • 구매 금액의 평균값
  • 가장 큰 구매 금액

함수를 정의해 보겠습니다:

def number_of_purchases():
    total = len(purchases)
    print(total)

def average_value():
    average = sum(purchases) / len(purchases)
    print(average)

def largest_purchase():
    largest = max(purchases)
    print(largest)

함수 정의가 끝났으니 이제 가짜(fake) switch 문을 작성해 보겠습니다. 첫 번째 예제와 마찬가지로 사용자에게 값을 입력받는 것부터 시작합니다. 사용자가 입력하는 값은 실행할 함수에 해당하는 번호여야 합니다.

print("[1] 오늘의 구매 건수 보기")
print("[2] 오늘 구매 금액의 평균 보기")
print("[3] 오늘의 최대 구매 금액 보기")
to_run = int(input("무엇을 하시겠습니까? "))

코드는 세 개의 메시지를 출력해 사용자에게 선택 가능한 옵션을 알려준 뒤, 값을 입력받아 숫자로 변환합니다. 이 값은 프로그램 뒷부분에서 사용됩니다.

다음으로 함수와 숫자를 매핑하는 딕셔너리를 정의합니다:

options = {
    1: number_of_purchases,
    2: average_value,
    3: largest_purchase
}

값 "1"은 number_of_purchases 함수에, 값 "2"는 average_value 함수에, 값 "3"은 largest_purchase 함수에 각각 매핑됩니다.

다음으로 get() 메서드를 사용해 프로그램이 실행할 함수를 선택합니다:

function_to_execute = options.get(to_run)
function_to_execute()

이 코드는 딕셔너리에서 실행하고자 하는 함수를 가져옵니다. get() 메서드에 두 번째 인자(기본값)를 지정하지 않았는데, 그 이유는 코드가 정상 동작하려면 반드시 함수를 호출해야 하기 때문입니다. 따라서 사용자가 잘못된 값을 입력하면 코드는 에러를 반환합니다. 이런 상황을 처리하는 방법도 있지만, 이번 튜토리얼의 범위를 벗어나므로 다루지 않겠습니다.

코드를 실행해 보겠습니다:

[1] 오늘의 구매 건수 보기
[2] 오늘 구매 금액의 평균 보기
[3] 오늘의 최대 구매 금액 보기
무엇을 하시겠습니까? 3
5.6

목록에서 옵션 3을 선택했더니, 코드가 당일의 최대 구매 금액을 성공적으로 출력했습니다. 이번에는 옵션 2를 선택해 보겠습니다:

[1] 오늘의 구매 건수 보기
[2] 오늘 구매 금액의 평균 보기
[3] 오늘의 최대 구매 금액 보기
무엇을 하시겠습니까? 2
3.275

코드가 목록에 있는 구매 금액의 평균값을 반환했습니다.

참고: Python 3.10 이상이라면 match 문을 사용하세요

Python 3.10부터는 match/case라는 구조적 패턴 매칭(structural pattern matching) 문법이 공식적으로 도입되었습니다. 이를 활용하면 딕셔너리 없이도 C 계열 언어의 switch 문과 유사한 코드를 작성할 수 있습니다:

day = 1

match day:
    case 1:
        print("월요일")
    case 2:
        print("화요일")
    case _:
        print("잘못된 요일입니다")

밑줄(_)은 default 역할을 하며, 어떤 case와도 일치하지 않을 때 실행됩니다. 다만 이전 버전의 Python과의 호환성이 필요하다면 이 글에서 소개한 딕셔너리 방식이 여전히 유용합니다.

마무리

Python에는 내장 switch 문이 없지만, 딕셔너리와 get() 메서드를 조합하면 손쉽게 만들 수 있습니다.

switch 문은 하나의 표현식을 여러 가능한 결과와 비교해 평가해야 할 때 유용합니다.

지정한 키에 따라 딕셔너리에서 값을 가져오는 가짜 switch 문을 작성할 수 있고, 마찬가지로 특정 키를 참조해 딕셔너리에서 함수를 꺼내 호출하는 가짜 switch 문도 작성할 수 있습니다.

이제 여러분도 전문 개발자처럼 Python으로 자신만의 switch 문을 만들 준비가 되었습니다!