학생의 전체 평균점수에 대한 학점을 출력하는 프로그램을 작성하자. 학생의 성적이 90점 이상이면 A, 80점 이상이면 B, 70점 이상이면 C, 50점 이상이면 D 그리고 그 미만이면 F다! (후략)
- 열혈C프로그래밍 p.189, 문제 08-1[if~else문의 활용] 문제 3
if-else문을 연습할 때 열에 아홉 번은 튀어나오는 학점 예제라서 식상한 느낌이 들지만,
switch-case문이나 삼항연산자 중첩의 장점이 더욱 크게 와닿는 가장 좋은 예제라고 생각한다.
C의 if-else문으로는
#include "stdio.h"
int main(void) {
int score_num;
char score;
printf("학점을 입력하세요: ");
scanf("%d", &score_num);
if (score_num >= 90) {
score = 'A';
} else {
if (score_num >= 80) {
score = 'B';
} else {
if (score_num >= 70) {
score = 'C';
} else {
if (score_num >= 50) {
score = 'D';
} else {
score = 'F';
}
}
}
}
printf("%c", score);
}
이렇게 코드가 길어진다. 중괄호가 많아서 읽기도 쉽지 않다. 그런데..
C의 삼항연산자를 사용하면,
#include "stdio.h"
int main(void) {
int score_num;
char score;
printf("학점을 입력하세요: ");
scanf("%d", &score_num);
score = score_num >= 90 ? 'A' :
score_num >= 80 ? 'B' :
score_num >= 70 ? 'C' :
score_num >= 50 ? 'D' :
'F';
printf("%c", score);
}
위처럼 굉장히 깔끔하게 정리가 된다. 읽기도 굉장히 쉽다.
굳이 switch-case를 소개해야 하나 싶지만..
C의 switch-case문을 사용해보면,
#include "stdio.h"
int main(void) {
int score_num;
char score;
printf("학점을 입력하세요: ");
scanf("%d", &score_num);
switch (score_num / 10) {
case 10:
case 9: printf("A"); break;
case 8: printf("B"); break;
case 7: printf("C"); break;
case 6:
case 5: printf("D"); break;
default: printf("F");
}
}
반짝이는 아이디어를 사용한(참고한 포스팅) 멋진 코드이다.
그렇다면 파이썬은 어떨까?
파이썬에는 삼항연산자 및 중첩 문법은 파이썬 2에서부터 존재해 왔지만,
switch문의 도입은 파이썬 운영위에서 계속해서 반대해 오다가,
작년 출시된 3.10부터는 구조적 패턴 매칭(Structural Pattern Matching)을 도입하게 되었다.
이는 switch-case문과 매우 유사한 문법으로
단순한 스위치 형태 뿐만 아니라 더욱 광범위하게 활용할 수 있는 문법이기도 하다.
먼저 삼항연산자 중첩으로 if-else문을 작성해보면,
파이썬의 삼항연산자 중첩
score_num = int(input("학점을 입력하세요: "))
print("A" if score_num >= 90 else \
"B" if score_num >= 80 else \
"C" if score_num >= 70 else \
"D" if score_num >= 50 else \
"F")
C의 삼항연산자와 비슷한 모양이기는 하다.
이번에는 파이썬의 패턴매칭(match-case)문을 작성해보자.
(단, 파이썬 3.10 이상에서 실행해야 함)
파이썬의 "구조적 패턴매칭(Structural Pattern Matching)"
score_num = int(input("학점을 입력하세요: "))
match score_num // 10:
case 10 | 9: print("A")
case 8: print("B")
case 7: print("C")
case 6 | 5: print("D")
case _: print("F")
와~ 이 문법도 굉장히 깔끔하지 않은가?
파이썬의 구조적패턴매칭(Structural Pattern Matching) 문법에 대한 PEP 문서를 찾아보려면,
EP622, PEP634, PEP635, PEP636 등을 참고하면 된다.
대표적으로 PEP636을 열어보면 구조적패턴매칭의 튜토리얼을 소개하고 있다.
링크는 아래.
댓글