앞서 if / else 조건문과 비교 연산자를 알아보았다. 이번 글에서는 특정 변수의 값에 따라 깔끔하게 분기 처리하는 switch / case 문, 핵심 키워드인 break, 그리고 if - else 구문을 한 줄로 축약할 수 있는 삼항 연산자를 정리한다.
1. switch / case 구문의 기본 구조
switch 문은 기준이 되는 변수의 값과 일치하는 case 위치로 이동하여 코드를 실행하는 분기문이다.
int select = 2;
switch (select) {
case 1:
// select가 1일 때 실행
break;
case 2:
// select가 2일 때 실행
break;
default:
// 어떤 case에도 해당하지 않을 때 실행 (if문의 else 역할)
break;
}
-
case [값]:: 평가 대상 변수의 값과 일치하는 지점부터 실행한다. -
default:: 일치하는case가 하나도 없을 때 실행된다. (생략 가능)
2. if-else if vs switch-case 비교
| 구분 | if - else if | switch - case |
|---|---|---|
| 조건식 | 범위 지정 및 복잡한 논리식 가능 (x > 10 && y < 5) | 정수/문자 형태의 단일 변수 값 비교 위주 |
| 가독성 | 조건이 많아질수록 코드가 길어지고 복잡해짐 | 값이 딱 떨어지는 여러 조건 처리 시 가독성이 뛰어남 |
가령 게임에서 상태 값(0: 대기, 1: 이동, 2: 공격, 3: 사망)에 따라 연동되는 로직을 구현할 때는 switch-case 문을 사용하는 것이 훨씬 직관적이다.
3. switch 문의 핵심: break의 중요성
switch 문 내에서 break를 만나면 해당 switch 블록({})을 완전히 탈출한다.
break 누락 시 발생하는 현상 (Fall-Through)
만약 case 내부에 break를 작성하지 않으면, 문법 에러는 나지 않지만 다음 case의 코드까지 연속해서 실행되어 최종 default까지 도달하는 치명적인 논리 버그가 발생한다.
int input = 1;
switch (input) {
case 1:
// break가 없으면 case 2로 내려감
case 2:
// break가 없으면 default로 내려감
default:
// 결국 여기까지 모두 실행됨
}
⭕ 의도적인 break 생략 (OR 연산 효과)
여러 case에 대해 동일한 로직을 수행해야 할 때는 의도적으로 break를 생략하여 로직을 하나로 묶을 수 있다. 이는 if 문에서 논리합(||) 연산자를 사용하는 것과 같다.
char key = 'w';
switch (key) {
case 'w':
case 'W': // 'w' 또는 'W' 입력 시 공통 실행
moveUp();
break;
}
4. 한 줄 조건문: 삼항 연산자 (?:)
삼항 연산자는 간단한 if - else 구문을 단 한 줄로 축약할 수 있는 연산자다.
[조건식] ? [참일 때의 값] : [거짓일 때의 값]
int hp = 80;
// if - else 구문 사용 시
int status;
if (hp > 0) {
status = 1; // 생존
} else {
status = 0; // 사망
}
// 삼항 연산자 사용 시 (한 줄로 축약)
int status = (hp > 0) ? 1 : 0;
삼항 연산자 사용 시 주의사항
-
삼항 연산자는 코드를 간결하게 만들어 주지만, 조건이 중첩되거나 길어지면 오히려 코드 가독성이 크게 떨어진다.
-
따라서 단순히 값을 대입하거나 반환하는 직관적이고 명확한 상황에서만 선택적으로 사용하는 것이 좋다.
마무리하며
-
값이 깔끔하게 떨어지는 다중 분기에는
if-else if보다switch-case가 가독성 측면에서 유리하다. -
switch문 작성 시break누락으로 인한 논리 오류를 항상 경계하자. -
삼항 연산자는 간단한 대입식에서만 한정적으로 사용하여 코드 깔끔함과 가독성을 모두 챙기자.