파이썬에서 switch 조건 이용하기

자바로 짜여진 코드가 다음과 같다고 가정해 봅시다.

import java.util.Scanner;

public class GFRIEND_AlbumInfo {
	public static void main(String[] args) {
		int n;
		
		Scanner in = new Scanner(System.in);
		
		System.out.println("1. EP 1집");
		System.out.println("2. EP 2집");
		System.out.println("3. EP 3집");
		System.out.println("4. 정규 1집");
		System.out.println("5. EP 4집");
		System.out.println("Select a number. (1-5)");
		n = in.nextInt();
		
		switch (n) {
			case 1:
				System.out.println("EP 1집: Season of Glass / 유리구슬 (Glass Bead)");
				break;
			case 2:
				System.out.println("EP 2집: Flower Bud / 오늘부터 우리는 (Me Gustas Tu)");
				break;
			case 3:
				System.out.println("EP 3집: SNOWFLAKE / 시간을 달려서 (Rough)");
				break;
			case 4:
				System.out.println("정규 1집: LOL / 너 그리고 나 (NAVILLERA)");
				break;
			case 5:
				System.out.println("EP 4집: THE AWAKENING / FINGERTIP");
				break;
			default:
				System.out.println("No data");
		}
	}
}
1. EP 1집
2. EP 2집
3. EP 3집
4. 정규 1집
5. EP 4집
Select a number. (1-5)
 2
EP 2집: Flower Bud / 오늘부터 우리는 (Me Gustas Tu)

이 코드는 1부터 4까지의 숫자 중 하나를 입력받으면 그 숫자에 해당하는 데이터를 출력하기 위한 코드로 여기서 16번 줄부터 31번 줄까지가 switch 조건문입니다. 이 예제에서는 2를 입력하고 엔터를 친 결과 2에 해당하는 코드를 수행하기 위해 21번 줄로 가서 코드를 실행시키고 조건문을 빠져나오게 됩니다.

이 코드를 파이썬으로 옮기고자 합니다. 그런데 문제가 하나 있습니다. 파이썬에서는 if … elif … else 조건문은 존재하지만, 위의 16번 줄부터 31번 줄까지의 부분에 해당하는 switch 조건문이 존재하지 않는다는 점입니다. 그렇다면, 파이썬에서는 switch 조건식을 쓸 수 없는 것일까요?

그렇지 않습니다. 파이썬에서 switch 조건문이 없다는 문제점을 우회적으로 해결할 수 있는 방법이 있는데, 그 방법들은 다음과 같습니다.

첫째: if문을 여러 개 중첩하는 방법

print("1. EP 1집")
print("2. EP 2집")
print("3. EP 3집")
print("4. 정규 1집")
print("5. EP 4집")
a = int(input("Select a number. (1-5)") )

if a == 1:
	print("EP 1집: Season of Glass / 유리구슬 (Glass Bead)")
elif a == 2:
	print("EP 2집: Flower Bud / 오늘부터 우리는 (Me Gustas Tu)")
elif a == 3:
	print("EP 3집: SNOWFLAKE / 시간을 달려서 (Rough)")
elif a == 4:
	print("정규 1집: LOL / 너 그리고 나 (NAVILLERA)")
elif a == 5:
	print("EP 4집: THE AWAKENING / FINGERTIP")
else:
	print("No data")

말 그대로 if … elif … else 조건문을 여러 개 중첩하는 방법입니다. 파이썬 문법 구조의 특성상 if문을 중첩해 쓰더라도 가독성이 크게 떨어지지는 않기 때문에 이 방법도 무리없이 쓸 수 있습니다. 하지만 단점이라면 모든 분기에 조건식 형태로 조건을 지정해 주어야 한다는 점입니다.

둘째: 딕셔너리를 이용하는 방법

albums = {1: "EP 1집: Season of Glass / 유리구슬 (Glass Bead)",
          2: "EP 2집: Flower Bud / 오늘부터 우리는 (Me Gustas Tu)",
          3: "EP 3집: SNOWFLAKE / 시간을 달려서 (Rough)",
          4: "정규 1집: LOL / 너 그리고 나 (NAVILLERA)",
          5: "EP 4집: THE AWAKENING / FINGERTIP"}

print("1. EP 1집")
print("2. EP 2집")
print("3. EP 3집")
print("4. 정규 1집")
print("5. EP 4집")
a = int(input("Select a number. (1-5)") )

print(albums.get(a, "No data") )

파이썬에서도 자바스크립트나 PHP 등에서 쓰이는 키와 데이터 값을 한 쌍으로 갖는 딕셔너리 자료형이 있습니다. 이 딕셔너리 자료형을 이용하여 마치 switch 조건문과 비슷한 처리를 구현할 수 있습니다.

def album(x):
	return {1: "EP 1집: Season of Glass / 유리구슬 (Glass Bead)",
	        2: "EP 2집: Flower Bud / 오늘부터 우리는 (Me Gustas Tu)",
	        3: "EP 3집: SNOWFLAKE / 시간을 달려서 (Rough)",
	        4: "정규 1집: LOL / 너 그리고 나 (NAVILLERA)",
	        5: "EP 4집: THE AWAKENING / FINGERTIP"
	        }.get(x, "No data")

print("1. EP 1집")
print("2. EP 2집")
print("3. EP 3집")
print("4. 정규 1집")
print("5. EP 4집")
a = int(input("Select a number. (1-5)") )

print(album(a) )

이렇게 함수를 선언해서 처리할 수도 있습니다.

def album_glass():
	print("EP 1집: Season of Glass / 유리구슬 (Glass Bead)")

def album_flower():
	print("EP 2집: Flower Bud / 오늘부터 우리는 (Me Gustas Tu)")

def album_snow():
	print("EP 3집: SNOWFLAKE / 시간을 달려서 (Rough)")

def album_lol():
	print("정규 1집: LOL / 너 그리고 나 (NAVILLERA)")

def album_awakening():
	print("EP 4집: THE AWAKENING / FINGERTIP")

print("1. EP 1집")
print("2. EP 2집")
print("3. EP 3집")
print("4. 정규 1집")
print("5. EP 4집")
a = int(input("Select a number. (1-5)") )

albums = {1: album_glass,
          2: album_flower,
          3: album_snow,
          4: album_lol,
          5: album_awakening}

try:
	albums[a]()
except KeyError:
	print("No data")

조건에 따라 다른 처리를 하고 싶다면 이런 식으로 쓸 수도 있습니다.

이와 같이 파이썬에서는 switch 조건문이 없어도 switch 조건문이 있는 것처럼 코딩을 할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다.