자바로 짜여진 코드가 다음과 같다고 가정해 봅시다.
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 조건문이 있는 것처럼 코딩을 할 수 있습니다.