Stay Hungry Stay Foolish

자바/자바 입문

[자바 기초] 03. 조건문(if/else if/switch/삼항 연산)

dev스카이 2024. 3. 21. 00:07

조건문

  • if문
  • switch문

🔘 if문

if 문은 특정 조건이 인지 확인하고, 그 조건이 참( true )일 경우 특정 코드 블록을 실행한다.

 

형식

if (condition) {
    // 조건이 참일 때 실행되는 코드
}

 

예제 - 나이가 18세 이상일 경우 "성인입니다." 라는 문구를 출력하고, 18세 미만일 경우 "미성년자입니다."라는 문구를 if문을 사용해서 출력하라. 변수는 age라고 하고 초기값은 20으로 한다.

 

 

If1

package cond;

public class If1 {
    public static void main(String[] args) {
        int age = 20; 

        if(age >= 18){
            System.out.println("성인입니다.");
        }
        if(age <= 18){
            System.out.println("미성년자입니다");
        }
    }
}

 

실행 결과

성인입니다.
  • 첫 번째 if문에서 age의 값이 20이기 때문에 조건이 맞으므로 블록 안에 있는 출력 코드를 실행하게 된다. 그리고 다음 if문으로 넘어간다.
    • if(20 >= 18) - 참
  • 두 번째 if문에서는 조건이 맞지 않으므로 블록 안에 있는 출력 코드를 실행하지 않는다.
    • if(20 <= 18) - 거짓

🔘 else문

else 문은 if 문에서 만족하는 조건이 없을 때 실행하는 코드를 제공한다.

if (condition) {
 // 조건이 참일 때 실행되는 코드
} else {
 // 만족하는 조건이 없을 때 실행되는 코드
}

 

예제 - else문을 사용하여 If1을 고쳐보자.

 

 

If2

package cond;

public class If2 {
    public static void main(String[] args) {
        int age = 20;
        if(age >= 18){
            System.out.println("성인입니다."); //참일 때 실행
        }else{
            System.out.println("미성년자입니다."); //만족하는 조건이 없을 때 실행
        }
    }
}

 

이렇게 해도 If1과 실행 결과가 같은 걸 볼 수 있다.


else if문

else if 문은 앞선 if 문의 조건이 거짓일 때 다음 조건을 검사한다. 만약 앞선 if 문이 참이라면 else if 를 실행하지 않는다.

 

형식

if (condition1) {
	// 조건1이 참일 때 실행되는 코드
} else if (condition2) {
	// 조건1이 거짓이고, 조건2가 참일 때 실행되는 코드
} else if (condition3) {
	// 조건2이 거짓이고, 조건3이 참일 때 실행되는 코드
} else {
	// 모든 조건이 거짓일 때 실행되는 코드
}

 

특정 조건이 만족하면 해당 코드를 실행하고 if 문 전체를 빠져나온다. 특정 조건을 만족하지 않으면 다음 조건을 검사한다. 여기서 핵심은 순서대로 맞는 조건을 찾아보고, 맞는 조건이 있으면 딱 1개만 실행이 되는 것이다.

 

참고로 else 는 생략할 수 있다.

 

else if문의 필요성

왜 else if 문을 사용하는가? 어떤 상황일 때 사용하는가? 아래의 예제를 보고 if문으로만 작성해보자.

예제 - if문을 사용하여 연령에 따라 나이별로 문구를 다르게 출력하라. 변수는 age라고 하고 초기값은 12이다.
●  7세 이하일 경우 : "미취학"    
● 8세 이상 13세 이하일 경우 : "초등학생"
● 14세 이상 16세 이하일 경우: "중학생"
● 17세 이상 19세 이하일 경우: "고등학생"
● 20세 이상일 경우: "성인"

 

 

If3

package cond;

public class If3 {
    public static void main(String[] args) {
        int age = 12;
        if (age <= 7){
            System.out.println("미취학");
        }
        if (age >= 8 &&  age <= 13) {
            System.out.println("초등학생");
        }
        if (age >= 14 && age <= 16) {
            System.out.println("중학생");
        }
        if (age >= 17 && age <= 19) {
            System.out.println("고등학생");
        }
        if (age >= 20) {
            System.out.println("성인");
        }
    }
}

 

 

위 코드는 보기에는 깔끔하고 좋아 보이지만 다음과 같은 단점이 있다.

  • 불필요한 조건 검사
    • 첫 번째 if문(age <= 7)에서 조건을 만족하지 않으므로 if문을 빠져나온다.
    • 두 번째 if문(age >= 8 && age <= 13)에서 조건을 만족하므로 if문의 명령을 수행한 후  빠져나온다.
    • 앞에서 이미 조건을 만족하고 출력 코드를 실행했어도 나머지 아래의 if문도 모두 실행해야 한다. 
  • 코드 효율성
    • 예를 들어서 나이가 8살인 초등학생이라면 미취학을 체크하는 조건인 age <= 7 을 통해 나이가 이미 8살이 넘는 다는 사실을 알 수 있다.
    • 그런데 바로 다음에 있는 초등학생을 체크하는 조건에서 age >=  8 && age <= 13 라는 2가지 조건을 모두 수행한다.
    • 여기서 age >= 8 이라는 조건은 이미 앞의 age <= 7이라는 조건과 관련이 있다. 
    • 결과적으로 조건을 중복 체크한 것이다.

이러한 문제 때문에 else if문을 사용하는 것이다. 그럼 If3을 else if문으로 변경해보자.

 

If4

package cond;

public class If4 {
    public static void main(String[] args) {
        int age = 12;
        if(age <= 7) { //~7: 미취학
            System.out.println("미취학");
        } else if(age <= 13) { //8~13: 초등학생
            System.out.println("초등학생");
        } else if(age <= 16) { //14~16: 중학생
            System.out.println("중학생");
        } else if(age <= 19) { //17~19: 고등학생
            System.out.println("고등학생");
        } else { //20~: 성인
            System.out.println("성인");
        }
    }
}
  • age = 7인 경우
    • if(age <= 7) 의 조건이 참이다. "미취학"을 출력하고 전체 if 문 밖으로 나간다.
  • age = 13인 경우
    • if(age <= 7) 의 조건이 거짓이다. 다음 조건으로 넘어간다.
    • else if(age <= 13) 의 조건이 참이다. "초등학생"을 출력하고 전체 if 문 밖으로 나간다.
  • age = 50인 경우
    • if(age <= 7) 의 조건이 거짓이다. 다음 조건으로 넘어간다.
    • else if(age <= 13) 의 조건이 거짓이다. 다음 조건으로 넘어간다.
    • else if(age <= 16) 의 조건이 거짓이다. 다음 조건으로 넘어간다.
    • else if(age <= 19) 의 조건이 거짓이다. 다음 조건으로 넘어간다.
    • else 만족하는 조건 없이 else 까지 왔다. else 에 있는 "성인"을 출력하고 전체 if 문 밖으로 나간다.

if 문에 여러 조건이 있다고 항상 if-else 로 묶어서 사용할 수 있는 것은 아니다. 조건이 서로 영향을 주지 않고 각각 수행해야 하는 경우에는 else if 문을 사용하면 안되고, 대신에 여러 if 문을 분리해서 사용해야 한다. 

 

🌟 if 문을 각각 사용할지, if 와 else if 를 함께 묶어서 사용할지는 요구사항에 따라 다르다. 둘의 차이를 이해하고 적절하게 사용하면 된다.

 

if문 { } 중괄호 생략

if 문 다음에 실행할 명령이 하나만 있을 경우에는 {} 중괄호를 생략할 수 있다. else if , else 도 마찬가지이다.

if (true)
	System.out.println("if문에서 실행됨");

 

그러나 문장이 두 개 이상있을 경우, 중괄호를 생략하면 첫 번째 문장은 실행되나 두 번째 문장은 if문에서 실행이 되지 않는다. 즉, if문 바깥에서 실행되는 코드가 된다. 

 

🌟 그래도 if문의 명령이 한 개만 있어도 가독성과 유지보수성을 위하여 중괄호를 붙이도록 한다.


Switch문

switch 문은 앞서 배운 if 문을 조금 더 편리하게 사용할 수 있는 기능이다. if문은 비교 연산자를 사용할 수 있지만, 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문을 사용하여 회원 등급에 따라 다른 쿠폰을 발급하는 프로그램을 작성한다.
          변수는 int grade라고 하고 초기값은 2이다. 
● 1등급 : 쿠폰 1000
● 2등급 : 쿠폰 2000
● 3등급 : 쿠폰 3000
● 위의 등급에 해당하지 않는 경우 : 쿠폰 500
각 쿠폰이 할당된 후에는 "발급받은 쿠폰 " + 쿠폰값 을 출력해야 한다.

 

 

Switch1

package cond;

public class Switch2 {
    public static void main(String[] args) {
        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

삼항 연산자

삼항 연산자는 항이 3개라는 뜻이다. 조건 , 참_표현식 , 거짓_표현식 이렇게 항이 3개이다. 자바에서 유일하게 항이 3개인 연산자여서 삼항 연산자라 한다. 또는 특정 조건에 따라 결과가 나오기 때문에 조건 연산자라고도 한다. .

 

형식

(조건) ? 참_표현식 : 거짓_표현식

 

조건에 만족하면 참_표현식이 실행되고, 조건에 만족하지 않으면 거짓_표현식이 실행된다. 앞의 if , else 문과 유사하다. 참과 거짓에 따라서 특정 값을 구하는 경우 삼항 연산자 또는 조건 연산자라고 불리는 ? : 연산자를 사용할 수 있다. 이 연산자를 사용하면 if 문과 비교해서 코드를 단순화 할 수 있다.

 

예제 - 삼항 연산자를 사용하여 나이가 18세 이상이면 "성인", 18세 미만이면 "미성년자"를 출력하도록 한다.

 

 

CondOp2

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);
    }
}

 

실행 결과

age = 18 status = 성인

 

💡Tip

파일 전체를 그대로 복사하고 싶을 때, 복사하고 싶은 파일을 마우스로 선택한 후 <Ctrl-C → Ctrl-V>를 해주고 이름만 변경해주면 된다.

 

💡Tip

<Shift 키>를 누른 상태에서 방향키를 움직이면 원하는 만큼의 범위를 선택할 수 있다. 
좌우 방향키는 한 글자씩 선택, 상하 방향키는 한 줄씩 선택할 수 있다.
범위를 선택하고 복사 붙여넣기 가능!