본문 바로가기
[JAVA]

[처음부터 다시 하는 JAVA] 조건문 switch, 삼항연산자

by 북방바다코끼리표범 2024. 1. 9.

처음부터 다시 하는 자바 공부는 인프런의 김영한 강사님의 강의를 참고해서 공부했다.

 

switch문

당신은 회원 등급에 따라 다른 쿠폰을 발급하는 프로그램을 작성해야 한다.
이 프로그램은 int grade 라는 변수를 사용하며, 회원 등급( grade )에 따라 다음의 쿠폰을 발급해야 한다.

  • 1등급: 쿠폰 1000
  • 2등급: 쿠폰 2000 
  • 3등급: 쿠폰 3000
  • 위의 등급이 아닐 경우: 쿠폰 500

각 쿠폰이 할당된 후에는 "발급받은 쿠폰 " + 쿠폰값을 출력해야 한다. 
2등급 사용자 출력 예)

발급받은 쿠폰 2000

 

if 문을 사용해서 코드를 작성해보자.

package cond;

public class Switch1 {
	public static void main(String[] args) { 
        //grade 1:1000, 2:2000, 3:3000, 나머지: 500 
        int grade = 2;
        
        int coupon;
        if (grade == 1) {
            coupon = 1000; 
        } else if (grade == 2) { 
            coupon = 2000; 
        } else if (grade == 3) { 
            coupon = 3000; 
        } else {
            coupon = 500; 
        }
		System.out.println("발급받은 쿠폰 " + coupon);
    } 
}

 

switch 문은 앞서 배운 if 문을 조금 더 편리하게 사용할 수 있는 기능이다.
참고로 if 문은 비교 연산자를 사용할 수 있지만, switch 문은 단순히 값이 같은지만 비교할 수 있다.

 

switch 문은 조건식에 해당하는 특정 값으로 실행할 코드를 선택한다.

switch (조건식) {
	case value1:
		// 조건식의 결과 값이 value1일 때 실행되는 코드 
		break;
	case value2:
		// 조건식의 결과 값이 value2일 때 실행되는 코드 
		break;
	default:
		// 조건식의 결과 값이 위의 어떤 값에도 해당하지 않을 때 실행되는 코드
  • 조건식의 결과 값이 어떤 case 의 값과 일치하면 해당 case 의 코드를 실행한다.
  • break 문은 현재 실행 중인 코드를 끝내고 switch 문을 빠져나가게 하는 역할을 한다.
  • 만약 break 문이 없으면, 일치하는 case 이후의 모든 case 코드들이 순서대로 실행된다. 
  • default 는 조건식의 결과값이 모든 case 의 값과 일치하지 않을 때 실행된다. if 문의 else 와 같다. 
    default 구문은 선택이다.
  • if , else-if , else 구조와 동일하다.

앞서 작성한 코드를 switch 문으로 변경해보자.

package cond;

public class Switch2 {

	public static void main(String[] args) { 
		//grade 1:1000, 2:2000, 3:3000, 나머지: 500 
		int grade = 2;
		
        int coupon; 
		switch (grade) {
			case 1:
                coupon = 1000;
				break; 
			case 2:
                coupon = 2000;
				break; 
			case 3:
                coupon = 3000;
				break;
			default:
                coupon = 500; 
        }
		System.out.println("발급받은 쿠폰 " + coupon);
    } 
}
실행 결과
발급받은 쿠폰 2000

 

break 문이 없으면?
만약 break 문이 없으면 어떻게 되는지 확인하기 위해 조건을 변경해보자.
비즈니스 요구사항이 변경되었다. 2등급도 3등급과 같이 3000원 쿠폰을 준다고 해보자.

package cond;

public class Switch3 {
	public static void main(String[] args) {
		//grade 1:1000, 2:3000(변경), 3:3000, 나머지: 500 
        int grade = 2;
        
        int coupon; 
        switch (grade) {
        	case 1:
                coupon = 1000;
				break;
			case 2:
			case 3:
                coupon = 3000;
				break; 
			default:
                coupon = 500;
				break;
        }
		System.out.println("발급받은 쿠폰 " + coupon);
    } 
}
  • 예를 들어서 grade 가 2등급이면 먼저 case 2 가 실행된다.
  • 그런데 case 2 에는 break 문이 없다. 그러면 중단하지 않고 바로 다음에 있는 case 3 의 코드를 실행한다. 
    여기서 coupon = 3000; 을 수행하고 break 문을 만나서 switch 문 밖으로 빠져나간다.
  • "발급받은 쿠폰 3000 이 출력된다.

if문 vs switch문

switch 문의 조건식을 넣는 부분을 잘 보면 x > 10 과 같은 참 거짓의 결과가 나오는 조건이 아니라, 단순히 값만 넣 
을 수 있다.
switch 문은 조건식이 특정 case 와 같은지만 체크할 수 있다. 쉽게 이야기해서 값이 같은지 확인하는 연산만 가능하 
다. (문자도 가능)
반면에 if 문은 참 거짓의 결과가 나오는 조건식을 자유롭게 적을 수 있다. 예) x > 10 , x == 10

 

정리하자면 swtich 문 없이 if 문만 사용해도 된다. 하지만 특정 값에 따라 코드를 실행할 때는 switch 문을 사용하 
면 if 문 보다 간결한 코드를 작성할 수 있다.

 

자바 14 새로운 switch문

switch 문은 if 문 보다 조금 덜 복잡한 것 같지만, 그래도 코드가 기대보다 깔끔하게나오지는 않는다. 
이런 문제를 해결하고자 자바14부터는 새로운 switch 문이 정식 도입되었다.

 

이런 문제를 해결하고자 자바14부터는 새로운 switch 문이 정식 도입되었다.

package cond;

public class Switch3 {
	public static void main(String[] args) { 
		//grade 1:1000, 2:2000, 3:3000, 나머지: 500 
        int grade = 2;
        int coupon = switch (grade) {
            case 1 -> 1000;
            case 2 -> 2000;
            case 3 -> 3000; 
            default -> 500;
        };
		System.out.println("발급받은 쿠폰 " + coupon);
    } 
}

기존 switch 문과 차이는 다음과 같다.

  • -> 를 사용한다.
  • 선택된 데이터를 반환할 수 있다.

새로운 switch문은 더 많은 내용을 담고 있다. 지금 이해하기에 어려운 내용들이 있으므로, 자세한 내용은 별도로 다룬다.

 

삼항 연산자

if 문을 사용할 때 다음과 같이 단순히 참과 거짓에 따라 특정 값을 구하는 경우가 있다.

package cond;

public class CondOp1 {
	public static void main(String[] args) { 
        int age = 18;
        String status;
        if (age >= 18) {
            status = "성인"; 
        } else {
            status = "미성년자"; 
        }
        System.out.println("age = " + age + " status = " + status);
    } 
}
실행 결과, age = 18
age = 18 status = 성인

실행 결과, age = 17
age = 17 status = 미성년자

이 예제는 참과 거짓에 따라 status 변수의 값이 달라진다.

 

이렇게 단순히 참과 거짓에 따라서 특정 값을 구하는 경우 삼항 연산자 또는 조건 연산자라고 불리는 ?: 연산자를 사용 
할 수 있다.
이 연산자를 사용하면 if 문과 비교해서 코드를 단순화 할 수 있다.


우선 코드부터 보자. 삼항 연산자를 사용하면 다음과 같이 코드를 간결하게 만들 수 있다.

package cond;

public class CondOp2 {
	public static void main(String[] args) { 
        int age = 18;
        String status = (age >= 18) ? "성인" : "미성년자";
        System.out.println("age = " + age + " status = " + status);
    } 
}

실행 결과 분석
String status = (age >= 18) ? "성인" : "미성년자"; //age=18
String status = (true) ? "성인" : "미성년자"; //조건이 참이므로 참 표현식 부분이 선택된다.
String status = "성인"; //결과

 

삼항 연산자
(조건) ? 참_표현식 : 거짓_표현식
  • 삼항 연산자는 항이 3개라는 뜻이다. 조건, 참_표현식, 거짓_표현식 이렇게 항이 3개이다. 자바에서 유일하게 항 
    이 3개인 연산자여서 삼항 연산자라 한다. 또는 특정 조건에 따라 결과가 나오기 때문에 조건 연산자라고도 한다. 
  • 조건에 만족하면 참_표현식이 실행되고, 조건에 만족하지 않으면 거짓_표현식이 실행된다. 앞의 if , else 문 
    과 유사하다.
  • if 문 처럼 코드 블럭을 넣을 수 있는 것이 아니라 단순한 표현식만 넣을 수 있다.

삼항 연산자 없이 if 문만 사용해도 된다. 하지만 단순히 참과 거짓에 따라서 특정 값을 구하는 삼항 연산자를 사용하면 
if 문 보다 간결한 코드를 작성할 수 있다.