스위치 구문 수정하기
Java SE 14부터 새로운 스위치 표현식(switch expression) 구문을 사용할 수 있게 되었습니다. 이 새로운 구문은 기존의 스위치 문법을 대체하거나 보완하는 역할을 합니다.
동기
새로운 구문이 도입된 이유는 다음과 같습니다:
- 기존 스위치 문에서 레이블 사이의 기본 제어 흐름은 'fall-through'입니다. 이는 오류를 일으키고 애플리케이션 버그의 원인이 될 수 있습니다.
- 스위치 블록은 하나의 블록으로 취급됩니다. 특정 케이스에서만 변수를 정의해야 하는 경우에는 방해가 될 수 있습니다.
- 스위치 문은 문장(statement)입니다. 앞서 본 예제들처럼 각 케이스에서 변수에 값을 할당했습니다. 이를 표현식(expression)으로 만듦으로써 더 나은 코드 구조를 만들 수 있습니다.
새로운 구문 특징
- switch 키워드 뒤에 괄호가 추가되었습니다.
- 각 case는 화살표(->)를 사용하여 값이나 블록을 반환합니다.
- break 키워드가 더 이상 필요하지 않습니다.
- 여러 값을 하나의 case로 그룹화할 수 있습니다.
- 각 case는 하나의 블록으로 취급되어, 해당 블록 내에서 지역 변수를 정의할 수 있습니다.
코드 비교
기존 스위치 문:
Day day = ...;
int len = 0;
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
len = 6;
break;
case TUESDAY:
len = 7;
break;
case THURSDAY:
case SATURDAY:
len = 8;
break;
case WEDNESDAY:
len = 9;
break;
}
새로운 스위치 표현식:
Day day = ...;
int len =
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
장점
- 코드 가독성이 크게 향상됩니다.
- 불필요한 중괄호와 break 문을 제거하여 코드를 더 간결하게 만듭니다.
- 각 case가 독립적인 블록으로 작동하므로, 로컬 변수 선언이 가능해집니다.
- 여러 값을 쉽게 그룹화할 수 있어 논리적 연결성을 명확히 할 수 있습니다.
주의사항
- 스위치 표현식을 사용할 때는 반드시 모든 가능한 경우를 다루거나 기본값을 제공해야 합니다. 그렇지 않으면 컴파일 오류가 발생할 수 있습니다.
- 복잡한 로직이 필요한 경우, 각 case에 블록을 사용할 수 있으며, 이 블록 내에서 여러 줄의 코드를 실행할 수 있습니다.
값 생성하기
스위치 표현식은 값을 생성할 수 있는 강력한 기능을 제공합니다. 이 기능을 통해 코드를 더욱 간결하고 효율적으로 만들 수 있습니다.
간단한 값 생성 예시
enum Season { SPRING, SUMMER, AUTUMN, WINTER }
Season season = Season.SPRING;
String seasonDescription = switch (season) {
case SPRING -> "봄 - 따뜻하고 햇살이 좋은 계절";
case SUMMER -> "여름 - 더운 날씨와 휴가철";
case AUTUMN -> "가을 - 낙엽과 추억의 계절";
case WINTER -> "겨울 - 눈꽃과 추위의 계절";
};
System.out.println(seasonDescription);
이 예제에서:
- switch 표현식이 직접 seasonDescription 변수에 할당됩니다.
- 각 case는 화살표(->)를 사용하여 결과 문자열을 반환합니다.
- break 문이 필요 없어 코드가 간결해졌습니다.
복잡한 로직에서의 활용
복잡한 계산이 필요한 경우에도 스위치 표현식을 사용할 수 있습니다:
enum PaymentMethod { CASH, CARD, MOBILE_PAY }
PaymentMethod paymentMethod = PaymentMethod.CARD;
double discountRate = switch (paymentMethod) {
case CASH -> 0.05;
case CARD -> 0.03;
case MOBILE_PAY -> 0.02;
};
System.out.printf("할인율: %.2f%%\n", discountRate * 100);
이 예제에서:
- 스위치 표현식이 직접 discountRate 변수에 할당됩니다.
- 각 케이스에 따라 다른 할인율을 계산하고 반환합니다.
블록을 사용한 복잡한 로직
복잡한 로직이 필요한 경우, 각 case에 블록을 사용할 수 있습니다:
enum ProductType { ELECTRONICS, FURNITURE, CLOTHING }
ProductType productType = ProductType.ELECTRONICS;
String warrantyInfo = switch (productType) {
case ELECTRONICS -> {
String duration = "1년";
String coverage = "부품 및 노동비 포함";
yield "전자제품: " + duration + ", " + coverage;
}
case FURNITURE -> "가구: 5년, 부품 및 노동비 포함";
case CLOTHING -> "의류: 교환/반품 가능";
};
System.out.println(warrantyInfo);
이 예제에서:
- ELECTRONICS 케이스는 블록을 사용하여 복잡한 로직을 수행합니다.
- yield 키워드를 사용하여 블록의 결과를 반환합니다.
장점
- 코드 간결성: 복잡한 조건문을 간결하게 표현할 수 있습니다.
- 가독성 향상: 값 생성 로직을 한 곳에 집중시켜 전체 코드의 가독성이 높아집니다.
- 유연성: 단순한 값 반환부터 복잡한 로직까지 다양한 상황에 적용할 수 있습니다.
주의사항
- 모든 가능한 경우를 다루거나 기본값을 제공해야 합니다. 그렇지 않으면 컴파일 오류가 발생할 수 있습니다.
- 복잡한 로직의 경우, yield 키워드를 사용하여 블록의 결과를 명시적으로 반환해야 합니다.
편히 모아진 글 보시려면 아래 위키독스 링크 >>
https://wikidocs.net/book/17111
'JAVA' 카테고리의 다른 글
JAVA: switch - null 값 처리 [코딩백과 with JAVA] (1) | 2024.12.22 |
---|---|
JAVA: switch문의 완성성 보장, 케이스 블록 사용한 switch [코딩백과 with JAVA] (1) | 2024.12.22 |
JAVA: Case에 String 타입 사용, Null 선택자 변수[코딩백과 with JAVA] (0) | 2024.12.22 |
JAVA: Switch문과 If-then-else 선택 [코딩백과 with JAVA] (0) | 2024.12.22 |
JAVA Switch문 [코딩백과 with JAVA] (0) | 2024.12.22 |