해결된 질문
작성
·
147
0
안녕하세요. 3분 40초대에 나오는 switch - case에 관련된 예제를 푸는 과정에서 질문이 생겨서 글을 작성하게 되었습니다.
제가 기존에 알던 switch - case는 if - else를 조금 더 편리하게 사용하기 위해 도입된 조건문이었습니다.
그런데, 해당 강의에서 배운 내용은 조금 달랐습니다.
여기 나온 예제를 들어 설명한다면,
변수 len에 저장된 값은 5이다.
switch문의 기준은 len(=5)가 된다.
각 case에 대하여 len과 값을 비교했을 때의 결과를 기준으로 다음과 같이 실행한다.
3-1. case의 값이 참일 경우, (case의 값 == len) 해당 case를 기준으로 하여 break를 만날 때 까지 하위에 위치한 case들에 있는 statement들을 모두 실핸한다.
3-2. case의 값이 거짓일 경우, 다음 case로 넘어간다(처음으로 case의 값이 참일 경우를 만날 때 까지)
실행하는 statement에 break가 포함될 경우, 해당 switch문을 종료하고 빠져나온다.
끝까지 break를 만나지 못했을 경우, default의 statement를 실행 후 해당 switch문을 종료하고 빠져나온다.
이러한 논리 구조에 따라
case 3, 4는 건너뛰고
case 5에서 true이기 때문에 statement를 실행(len -= 1 -> len = 4)
처음으로 true인 case를 만났기 때문에, 해당 case 기준 아래에 위치한 모든 case를 실행
--> case 6 실행(len에 저장된 값은 6이 아님에도 불구하고) (len += 3 -> len = 7)
--> case 6에서 break를 만남 -> 종료
결과 : len = 7
이런 식으로 진행 되는 것 맞는 건가요?
그렇다면,
case 5의 statement가 len+=2;일 경우에도 case 7을 찾아가는 것이 아닌, case 6을 찾아가서 실행 후 break가 되는 것인가요??
마지막으로, default 키워드는 switch에서 모든 case가 false가 나왔을 때 실행되는 것이 아닌, break를 한 번도 만나지 못했을 경우 가장 마지막에 실행되는 것인가요??
긴 질문 읽어주셔서 감사합니다!
답변 2
1
안녕하세요, 인프런 AI 인턴입니다. 김민규님.
질문 주셔서 감사합니다. switch-case
문은 조건문 구조 중 하나로, if-else
보다 각 조건에 대한 명확한 분기를 통해 코드의 가독성을 높이는 역할을 합니다. 주로 C, Java와 같은 언어에서 사용됩니다. 설명해주신 것처럼 조금 헷갈릴 수 있는 구조를 갖고 있어 이 질문에 대해 자세히 설명드리겠습니다.
switch-case
문 동작 방식의 핵심:switch
문이 case
문을 만나는 방식:
len
의 값이 해당 case
와 맞는 경우부터 아래의 모든 case
문이 실행됩니다. 이를 “fall-through” 현상이라고 부르며, break
문을 만나기 전까지는 계속해서 실행이 진행됩니다.break
문의 역할:
case
문 내에서 break
를 만나면 현재 switch-case
문 블록이 종료되어 빠져 나가게 됩니다. break
가 없으면 다음 case
문으로 계속 진행됩니다.default
문의 역할:
switch
문 내에 조건을 만족하는 case
가 없어 case
문을 전부 지나칠 때나, case
문을 실행하고도 break
를 만나지 못했을 때 default
문이 실행됩니다.질문 1: case 5의 statement가 len += 2; 일 경우에도 case 7을 찾아가는 것이 아닌, case 6을 찾아가서 실행 후 break가 되는 것인가요?
case 5
의 조건이 참이 되어 실행된 이후에는 아래로 “fall-through” 하여 case 6
이 실행됩니다. len
값에 관계없이 case 6
은 break
를 만날 때까지 실행됩니다.질문 2: default 키워드는 모든 case가 false가 나왔을 때 실행되는 것인가요?
default
는 사실 case
문들이 시작되기 전까지만 충족되지 않았을 때가 아니라, break
문이 전혀 없는 경우에도 마지막에 실행될 수 있습니다.switch-case
문과 관련된 질문을 다룬 답변들이 있습니다. 아래 링크를 통해 보다 자세한 설명과 예제를 보실 수 있습니다.
이 링크들을 확인하시면, 김민규님께서 switch-case
문의 동작 방식에 대해 더 명확한 이해를 얻으실 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
안녕하세요,
해당 값에 대해서는 처음에 switch
에서만 판단하고 그 다음부터는 코드 상에서 아래로 죽 흐릅니다.
len += 2;
의 경우에도 바로 아래의 코드가 실행될 겁니다. case
안에서 발생하는 값으로 다시 다른 case
로 간다고 생각하지 마시고, 단순히 아래 case
로만 넘어가시면 됩니다.
default
는 단순합니다. 모든 case
에서 매칭이 안되어야 합니다.
default
는 case
문 어디든 위치할 수 있지만, 일반적으로 마지막에 배치됩니다.
default
가 실행되면, break
가 있는 경우 switch
문이 종료됩니다.
break
가 없다면, 아래의 case
문이 없더라도 계속 실행됩니다. (fall-through 발생)
중간에 위치할 수 있다는 점에서 예제 3개를 드립니다.
예제 1: default
가 마지막에 위치하고, break
있음
public class SwitchExample {
public static void main(String[] args) {
int num = 5;
switch (num) {
case 1:
System.out.println("One");
break;
case 2:
System.out.println("Two");
break;
default:
System.out.println("Not One or Two");
break; // switch 종료
}
}
}
출력값: Not One or Two -- 매칭되는 것이 없으니 default 실행
예제 2: default
가 중간에 위치하고, break
없음
public class SwitchExample {
public static void main(String[] args) {
int num = 3;
switch (num) {
case 1:
System.out.println("One");
break;
default:
System.out.println("Default case");
case 2:
System.out.println("Two");
break;
case 3:
System.out.println("Three");
break;
}
}
}
출력값: Three -- 매칭되는 것이 있으니 default 무시
예제 3: default
가 중간에 있고, break
없음 (fall-through: 아래 케이스로 흘러가는 현상 발생)
public class SwitchExample {
public static void main(String[] args) {
int num = 4;
switch (num) {
case 1:
System.out.println("One");
break;
default:
System.out.println("Default case"); // 실행됨
case 2:
System.out.println("Two"); // fall-through 발생
case 3:
System.out.println("Three"); // fall-through 발생
break;
}
}
}
출력값:
Default case
Two
Three
-- 매칭되는 것이 없어서 default가 실행되었으나, break가 중간에 없어 아래 case로 흐름
모든 case에 해당하지 않으면 default가 실행되고, 중간에 break가 없으면 아래 케이스로 흐른다고 생각하시면 됩니다.
네 다르게 이해하셔야 합니다. if는 해당 조건이 참인지를 봅니다.
예를 들어 python에서는 True도 참이고 1 < 2도 참이죠. C언어에서는 0을 제외한 숫자가 오면 참입니다. 이런 경우 case로 생각하면 다르게 생각할 수도 있습니다. 해당 값이 없으면 갈 case가 없을 수 있으니까요.
특정 조건이 되면 갈라진다(분기)는 것은 똑같은데, switch-case는 참/거짓 여부로 가는 것은 아닙니다.
결론적으로 말하면, switch - case는 if - else if - else를 축약한, 완전히 기능이 똑같은 제어문이라고 파악하면 안된다는 것일까요??
결국, switch에서 제공한 비교군(조건문)과 각 case 별로 제공한 대조군(값)들에 대하여, 처음 같아지는 순간 이후에는 break를 만날 때 까지 계속해서 첫 true가 나오는 case를 포함한 아래의 case들(default 포함)에 달려있는 statement를 실행하고, 그 중 break 키워드가 포함된 statement가 존재할 경우, 해당 코드까지만 실행 후 종료한다. 라고 이해가 됩니다!
친절한 답변 감사드립니다!