본문 바로가기
JAVA

JAVA: switch 표현식의 값 생성[코딩백과 with JAVA]

by GangDev 2024. 12. 22.

스위치 구문 수정하기

Java SE 14부터 새로운 스위치 표현식(switch expression) 구문을 사용할 수 있게 되었습니다. 이 새로운 구문은 기존의 스위치 문법을 대체하거나 보완하는 역할을 합니다.

동기

새로운 구문이 도입된 이유는 다음과 같습니다:

  1. 기존 스위치 문에서 레이블 사이의 기본 제어 흐름은 'fall-through'입니다. 이는 오류를 일으키고 애플리케이션 버그의 원인이 될 수 있습니다.
  2. 스위치 블록은 하나의 블록으로 취급됩니다. 특정 케이스에서만 변수를 정의해야 하는 경우에는 방해가 될 수 있습니다.
  3. 스위치 문은 문장(statement)입니다. 앞서 본 예제들처럼 각 케이스에서 변수에 값을 할당했습니다. 이를 표현식(expression)으로 만듦으로써 더 나은 코드 구조를 만들 수 있습니다.

새로운 구문 특징

  1. switch 키워드 뒤에 괄호가 추가되었습니다.
  2. 각 case는 화살표(->)를 사용하여 값이나 블록을 반환합니다.
  3. break 키워드가 더 이상 필요하지 않습니다.
  4. 여러 값을 하나의 case로 그룹화할 수 있습니다.
  5. 각 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;
    };

장점

  1. 코드 가독성이 크게 향상됩니다.
  2. 불필요한 중괄호와 break 문을 제거하여 코드를 더 간결하게 만듭니다.
  3. 각 case가 독립적인 블록으로 작동하므로, 로컬 변수 선언이 가능해집니다.
  4. 여러 값을 쉽게 그룹화할 수 있어 논리적 연결성을 명확히 할 수 있습니다.

주의사항

  • 스위치 표현식을 사용할 때는 반드시 모든 가능한 경우를 다루거나 기본값을 제공해야 합니다. 그렇지 않으면 컴파일 오류가 발생할 수 있습니다.
  • 복잡한 로직이 필요한 경우, 각 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 키워드를 사용하여 블록의 결과를 반환합니다.

장점

  1. 코드 간결성: 복잡한 조건문을 간결하게 표현할 수 있습니다.
  2. 가독성 향상: 값 생성 로직을 한 곳에 집중시켜 전체 코드의 가독성이 높아집니다.
  3. 유연성: 단순한 값 반환부터 복잡한 로직까지 다양한 상황에 적용할 수 있습니다.

주의사항

  • 모든 가능한 경우를 다루거나 기본값을 제공해야 합니다. 그렇지 않으면 컴파일 오류가 발생할 수 있습니다.
  • 복잡한 로직의 경우, yield 키워드를 사용하여 블록의 결과를 명시적으로 반환해야 합니다.

편히 모아진 글 보시려면 아래 위키독스 링크 >>
https://wikidocs.net/book/17111