조건이 많은 코드를 작성할 때 if-else 또는 switch 문을 사용했을 것입니다. 그러나 if-else 에 대한 이 대안에는 단점이 있습니다. 어떤 사람들은 스위치 문을 "안티 패턴"이라고 부르기도 합니다 .

저게 뭐야? 안티패턴은 불량 코드의 일반적인 패턴, 즉 문제에 대한 불량 솔루션입니다. 프로그래머는 코드 품질을 저하시키므로 코드에서 이를 피하려고 합니다.

그러나 좋은 소식이 있습니다. 새로운 버전의 Java는 언어 구문에 많은 변화를 가져왔고 이러한 변화 중 하나가 switch 에 영향을 미칩니다 . 흥미가 있습니까? 그럼 다이빙하러 갑시다.

우선 스위치가 안티패턴인 이유를 명확히 할 필요가 있습니다. 다음 코드를 고려하십시오.


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    default:
        seasonNumber = 0;
}

자, 이것이 왜 "안티 패턴"인지는 아직 완전히 명확하지 않습니다.

하지만 케이스 블록을 더 추가하면 코드가 다음과 같이 표시됩니다.


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    case “MARCH”:
        seasonNumber = 2;
        break;
    case “APRIL”:
        seasonNumber = 2;
        break;
    case “MAY”:
        seasonNumber = 2;
        break;
    default:
        seasonNumber = 0;
}

몇 줄을 더 추가해 보겠습니다. 코드가 길어집니다. 나중에 우리는 더 많은 줄을 추가할 수 있으며 아무도 우리가 이것을 하는 것을 막을 수 없습니다.

이것이 문제의 핵심입니다. 처음에 간결한 switch 문을 생성한 후 우리는 점점 더 많은 코드를 추가하고 점점 더 많은 공간(화면에 맞는 것보다 더 많은 공간)을 차지하며 코드를 읽고 유지하기 불편하게 만듭니다.

switch 문과 switch 식의 차이점

Java 14에서는 새롭고 향상된 스위치를 도입했습니다. 이것은 switch 문 이 아니라 switch 표현식 입니다 .

차이점이 무엇입니까? 차이점은 문은 특정 작업 집합을 수행하는 명령이지만 식은 일부 계산을 수행하고 결과를 반환하는 코드 조각이라는 것입니다.

즉, 이제 전환 결과를 변수에 저장할 수 있습니다.

충분한 이야기. 이제 새 스위치가 어떻게 생겼는지 살펴보겠습니다 .


var result = switch(month) {
     case DECEMBER, JANUARY, FEBRUARY -> 1;
     case MARCH, APRIL, MAY -> 2;
    case JUNE, JULY, AUGUST -> 3;
    case SEPTEMBER, OCTOBER, NOVEMBER -> 4;
    default -> 0; 
};

가장 먼저 눈에 띄는 것은 코드가 얼마나 간결한가입니다. 대부분의 화면을 차지했던 코드가 이제 몇 줄에 걸쳐 있으며 훨씬 더 읽기 쉬워 보입니다.

-> 연산자

-> 연산자(화살표 연산자) 도 주목해야 합니다 . 람다 식에 대한 경험이 있다면 이미 익숙할 것입니다.

즉, 이제 람다 문 스타일로 멋진 스위치를 작성할 수 있습니다. 화살표 연산자는 컴파일러가 다음 case 식으로 진행하지 않고(현재 case 블록에 break 또는 return 문이 없는 경우 ) 대신 화살표 오른쪽에 있는 식의 값을 제공함을 나타냅니다.

표현식이 아닌 코드를 작성하고 아무 것도 반환하지 않고 단순히 특정 작업을 수행할 수도 있습니다.


switch(condition) {
    case TRUE, FALSE -> System.out.println("True/false");
  
    default -> System.out.println("Another");
}

switch 에는 더 이상 break 문이 없습니다. Java 13에서 제거되었으며 yield 로 대체되었습니다 .

수율이란 무엇이며 어디에 사용할 수 있습니까?

스위치가 한 줄로 구성된 경우 -> 연산자 자체가 값을 반환합니다. 하지만 코드가 하나가 아니라 여러 줄이라면 어떻게 될까요? 이러한 경우 화살표 연산자는 값을 반환하지 않습니다. 한 줄이 아닌 여러 줄이 있기 때문입니다.

return 을 사용할 수 있을까요 ? 결국 Java에서 값을 반환하는 데 사용됩니다. 아아, 아니오, 리턴은 스위치와 함께 작동하지 않습니다. 그래서 우리는 무엇을 사용할 수 있습니까? 이전에는 break 가 있었지만 Java 13에서는 제거되었습니다. 그러나 이제 그 자리에 yield가 있습니다 . 스위치에서 값을 반환하는 데 도움이 되는 새로운 키워드입니다. 메소드의 return 문과 유사합니다 .


var result = switch(condition) {
//…
case "Hi" -> "greeting"
//…
};  

이 코드에는 한 줄이 포함되어 있으며 -> 연산자는 "인사말"을 반환합니다.

그러나 코드 블록이 있는 경우:


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 Here you need to return "greeting"
	}
};  

값을 반환하는 데 도움이 되는 키워드는 yield 입니다 .


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 yield "greeting";

	}
};

자바 13에서는 case 블록에 코드가 두 줄 이상 있고 결과를 반환해야 하는 경우를 위해 yield가 추가되었습니다.

코드에서 새 스위치를 사용해보고 싶을 수도 있지만 이를 위해서는 Java 14 이상이 필요하다는 점을 기억하세요. 이전 버전에서 이 스위치는 명령줄에 "--enable-preview" 플래그를 지정하는 경우에만 사용할 수 있습니다. 버전 14 이전에는 언어의 완전한 부분이 아니라 기술 미리 보기의 일부였기 때문입니다.

지금은 여기까지입니다! 또 봐요!