[Java] if-else문 보다 switch문이 더 효율적인 이유
by 무작정 개발결론은 과거에는 if-else / switch 성능을 따졌지만 현재(2022년)에는 많이 발전하며 성능 자체를 따지는 것이 의미가 없어졌다.
이번에는 if문, swtich문과 if-else문 보다 switch문이 더 효율적인 이유에 대해 정리할 것이다.
if-else문을 어느 정도 쓸 때 switch문이 유리한지, 굳이 switch문으로 바꿔서 써야 하나 라는 궁금증이 생겨서 이 글을 작성하게 되었습니다.
경우의 수(if-else)가 많아지면 if-else문 대신 switch문으로 작성하는 것이 더 효율적으로 동작하고 가독성이 좋아진다고 합니다.
그리고 컴파일러가 최적화할 때 switch문이 더 유리하다는 글을 보았고, 많은 구현체들이 switch문을 jump table로 구현하기 때문에
switch문이 더 좋은 성능을 나타낼 때가 많다고 합니다. 마지막으로 컴파일러나 코드 상황에 따라 다르지만 보통 if문이 3개 일 때까지는
if-else문이 더 빠르지만 그 이상이 된다면 switch-case문을 사용하는 것이 더 효율적이라고 합니다.
Java를 보다 깊게 이해하기 위해 다시 한번 복습하면서 글을 작성 중입니다.
기초적인 내용은 다루지 않을 예정입니다.
if문
// if문
if (조건식) {
수행문 1; // 조건식이 참일 경우 수행.
}
// 블럭 안에 수행문이 1개일 경우 괄호 {} 생략이 가능함
if (조건식) 수행문;
// if-else 문
if (조건식) {
수행문 1; // 조건식이 참일 경우 수행.
} else {
수행문 2; // 조건식이 거짓일 경우 수행.
}
기본 if문은 위와 같이 동작합니다. 조건식이 '참' 일 경우 블록 안의 수행문이 수행됩니다.
보통 if문은 위의 코드처럼 if-else 붙여서 자주 사용합니다. 조건식이 참일 경우는 수행문 1을 수행하고, 거짓일 경우는
아래 else 안에 있는 수행문 2를 수행합니다.
조건식의 결과가 반드시 true(참) 또는 false(거짓)이어야 하므로 비교 연산자와 논리 연산자로 구성됩니다.
if (조건식 1) {
수행문 1; // 조건식 1이 참일 경우 수행
} else if (조건식 2)
수행문 2; // 조건식 2가 참일 경우 수행
} else if (조건식 3) {
수행문 3; // 조건식 3이 참일 경우 수행
} else {
수행문 4; // 조건식 1~3에 모두 해당하지 않을 경우 수행
};
하지만 위의 코드처럼 조건이 여러 개일 경우 if-else문을 여러 개로 표현이 가능합니다.
다만 if-else 조건이 많아진다면 맨 위부터 아래까지 최악의 경우에는 처음부터 끝까지 조건을 검증하며 내려와야 할 수 있습니다.
Switch 문
switch (조건) {
case 값1:
수행문1;
break;
case 값2:
수행문2;
break;
case 값3:
수행문3;
break;
default:
수행문4;
}
Switch문의 조건식은 결괏값이 반드시 정수(문자)이거나 문자열이어야 하며, case문의 값은 중복되면 안 됩니다.
[Switch문 동작 과정]
- 조건식을 계산한다.
- 조건식의 결과와 일치하는 case문으로 이동한다.
- 해당하는 문장을 수행한다.
- break문을 만나면 switch문을 빠져나간다. -> 끝
break문은 각 case문의 영역을 구분하는 역할을 합니다. 만약 break문을 생략하면 다른 break문을 만나거나 switch문의 끝을 만날 때까지 수행합니다. case문은 여러 경우를 동시에 처리할 때 break문을 생략해 사용하기도 합니다.
만약 조건식의 결과와 일치하는 case문이 없다면 default문으로 이동하게 됩니다.(if문의 else블록과 같은 역할)
if-else문, switch문 둘 중 어떤 것을 써야 할까? 어떤 상황에 써야 효율적인가?
이 부분에 대해서는 글의 서론 부분에 작성하였지만 다시 정리해보자.
먼저 모든 switch문은 if-else문으로 대체될 수 있지만, if-else문을 사용할 수 있는 모든 상황에 switch문을 사용할 수 있는 것은 아닙니다.
switch문은 변수를 입력받아 미리 정해놓은 여러 값들과의 일치 여부를 판단해 switch문 내의 control flow를 결정합니다.
if-else문은 boolean(참-거짓)의 결과 값을 내놓은 조건문에 따라 true, false에 해당하는 각각 2개의 흐름(control flow)으로 갈라집니다.
if else문을 중첩되게 배치하면 2개 이상의 control flow를 가질 수 있게 됩니다.
[결론]
코드의 최적화 및 성능 개선을 위해서는 if-else문보다 switch문이 더 효율적이지만 서론에서 말했듯이 컴파일러나 코드 상황에 따라
다르고 보통 if문이 3개일 때까지는 if-else문이 더 빠르고, 그 이상이면 switch-case문을 사용하는 것이 더 효율적이고, 코드 최적화에 좋다.
이 글을 제가 아직 실력이 부족해서 추후에 다시 한번 깊게 정리할 예정입니다.
혹시 잘못된 부분이 있다면 댓글로 남겨주시면 감사하겠습니다!
References
'Language > Java' 카테고리의 다른 글
[Java8] 인터페이스의 변화 - default method, static method (1) | 2022.11.10 |
---|---|
[Java8] 함수형 인터페이스, 람다 표현식 (1) | 2022.11.08 |
[Java] 자료형(묵시적 형변환, 명시적 형변환) (2) | 2022.10.30 |
[Java] main 함수 (1) | 2022.10.24 |
[Java] Call by Value, Call by Reference (1) | 2022.10.11 |
블로그의 정보
무작정 개발
무작정 개발