Java 14에서 도입된 switch 문은 **switch 표현식(switch expression)**으로, 기존의 switch 문을 더 간결하고 유용하게 개선한 기능입니다. 주요 특징은 switch 문을 문(statement) 뿐만 아니라 **표현식(expression)**으로도 사용할 수 있게 되어 더 강력해졌다는 점입니다.
JDK 14에서의 switch 문 주요 특징:
- 화살표 문법 (->): 기존 switch 문에서는 case와 :를 사용했습니다. Java 14에서는 ->를 사용하여 더 간결하고 명확한 문법을 제공합니다. 이로 인해 break 문이 필요 없어졌습니다.
- 값 반환 가능: switch가 이제 표현식으로 사용될 수 있기 때문에, 값을 직접 반환할 수 있습니다. case마다 값을 반환하는 방식으로 더 유연하게 사용할 수 있습니다.
- 다중 레이블을 하나의 case에 지정 가능: 여러 개의 case를 하나로 묶을 수 있어 코드가 더 간결해집니다.
- break 불필요: -> 문법을 사용할 경우, break 문이 필요하지 않습니다. case가 끝날 때 자동으로 흐름이 종료됩니다.
- yield 키워드: switch를 표현식으로 사용할 때는 yield 키워드를 사용하여 값을 반환합니다. 이전 버전에서는 return을 사용했지만, switch 표현식에서는 yield로 값을 반환합니다.
JDK 14에서의 switch 예시:
public class SwitchExample {
public static void main(String[] args) {
String day = "MONDAY";
// switch를 표현식으로 사용
int dayNumber = switch (day) {
case "MONDAY" -> 1;
case "TUESDAY" -> 2;
case "WEDNESDAY" -> 3;
case "THURSDAY" -> 4;
case "FRIDAY" -> 5;
case "SATURDAY" -> 6;
case "SUNDAY" -> 7;
default -> throw new IllegalArgumentException("Invalid day: " + day);
};
System.out.println("Day number is: " + dayNumber);
}
}
설명:
- switch 표현식: switch 문을 표현식으로 사용하여, dayNumber에 값을 직접 할당합니다.
- -> 문법: case는 이제 -> 문법으로 간결하게 표현됩니다.
- yield: 여러 개의 문을 처리하는 복잡한 case에서는 yield를 사용하여 값을 반환할 수 있습니다. (예시에서는 단순한 값 반환이기 때문에 yield는 사용되지 않았습니다.)
이 기능의 장점:
- switch 문을 더 유연하게 사용할 수 있습니다.
- break 문을 생략할 수 있어 실수를 줄일 수 있습니다.
- 함수형 프로그래밍 스타일로 switch를 활용할 수 있게 되어 더 직관적이고 간결한 코드 작성이 가능합니다.
이 기능은 Java 12에서 미리보기로 도입되었고, Java 14에서 정식으로 포함되었습니다.
yield 키워드 설명
yield 키워드는 Java 14에서 switch 표현식을 사용할 때, case 블록 내에서 값을 반환하는 데 사용됩니다. switch 문을 표현식으로 사용할 때는 각 case에서 yield를 사용하여 반환값을 명시적으로 지정해야 합니다.
기존의 switch 문에서는 각 case에 대해 값을 반환하려면 break 문을 사용하거나 여러 문을 실행하는 방식으로 처리해야 했지만, switch 표현식에서는 yield를 사용하여 보다 간결하고 명확하게 값을 반환할 수 있습니다.
yield 사용법
yield는 switch 표현식 내에서 값을 반환하려면 반드시 사용해야 합니다.
switch 표현식은 값을 반환해야 하기 때문에, 각 case 내에서 yield 키워드를 통해 반환할 값을 지정합니다.
예시:
public class YieldExample {
public static void main(String[] args) {
String day = "MONDAY";
// switch 표현식에서 yield 사용
int dayNumber = switch (day) {
case "MONDAY" -> {
yield 1;
}
case "TUESDAY" -> {
yield 2;
}
case "WEDNESDAY" -> {
yield 3;
}
case "THURSDAY" -> {
yield 4;
}
case "FRIDAY" -> {
yield 5;
}
case "SATURDAY" -> {
yield 6;
}
case "SUNDAY" -> {
yield 7;
}
default -> throw new IllegalArgumentException("Invalid day: " + day);
};
System.out.println("Day number is: " + dayNumber);
}
}
설명:
- yield 사용: 각 case 내에서 yield를 사용하여 값을 반환합니다. case는 ->로 시작하지만, 여러 문을 실행할 때는 {} 안에 yield를 사용하여 반환값을 지정해야 합니다.
- switch 표현식: switch 문이 표현식으로 사용되므로, dayNumber에 값을 직접 할당할 수 있습니다.
- default: default 구문에서 예외를 던져 day가 유효하지 않으면 오류를 발생시킵니다.
yield의 필요성
- switch 표현식에서 여러 문을 실행하려면 {} 블록을 사용해야 하며, 이 경우 yield를 통해 반환값을 지정해야 합니다.
- 단일 값 반환이 아닌 여러 문을 실행하는 경우에도 yield를 사용하여 반환값을 지정하는 것이 필수적입니다.
yield가 필요한 경우:
- 여러 문을 실행하는 case: 복잡한 논리가 필요한 경우.
- 값을 반환하는 case: switch를 표현식으로 사용하면서 값을 반환하려는 경우.
예를 들어, 조건에 따라 복잡한 연산을 하고 그 결과를 반환하는 경우 yield를 사용하여 값을 반환할 수 있습니다.
public class YieldComplexExample {
public static void main(String[] args) {
String day = "MONDAY";
int dayNumber = switch (day) {
case "MONDAY" -> {
int temp = 1; // 예시로 추가된 복잡한 연산
yield temp;
}
case "TUESDAY" -> 2;
case "WEDNESDAY" -> 3;
default -> throw new IllegalArgumentException("Invalid day: " + day);
};
System.out.println("Day number is: " + dayNumber);
}
}
위 예시에서처럼 switch 표현식 내에서 여러 문을 실행할 때 yield가 필요합니다.
Switch를 표현식이 아닌 문으로 사용할 때
반환 값이 없는 경우는 기존 처럼 switch 문(switch statement)으로 처리하면 됩니다.
public class SwitchStatementExample {
public static void main(String[] args) {
String day = "MONDAY";
// switch 문에서 로직만 처리하고 반환값은 없음
switch (day) {
case "MONDAY":
System.out.println("It's Monday!");
break;
case "TUESDAY":
System.out.println("It's Tuesday!");
break;
case "WEDNESDAY":
System.out.println("It's Wednesday!");
break;
case "THURSDAY":
System.out.println("It's Thursday!");
break;
case "FRIDAY":
System.out.println("It's Friday!");
break;
case "SATURDAY":
System.out.println("It's Saturday!");
break;
case "SUNDAY":
System.out.println("It's Sunday!");
break;
default:
System.out.println("Invalid day!");
}
}
}
'개발 > 자바' 카테고리의 다른 글
| Java8 : LocalDate, LocalTime, LocalDateTime 날짜 및 시간 관련 클래스 (0) | 2025.02.19 |
|---|---|
| Java의 Wrapper 클래스 개요 및 차이점 (0) | 2025.02.19 |
| Java 8의 Predicate 인터페이스 (0) | 2025.02.18 |
| Java 추상 클래스 (abstract class) (0) | 2025.02.18 |
| Java Enum (열거형) (0) | 2025.02.18 |