4.1.2 if 선택 제어문

jh·2022년 1월 12일
0

Do it! 자바 완전 정복

목록 보기
23/70

4.1.2 if 선택 제어문

if문은 조건식에 따라 실행문의 실행 여부를 결정하는 선택 제어문이다. 기본적인 문법 구조는 크게 3가지 유형으로 나뉜다.

유형 ① if 단일 구문

먼저 유형 ①은 조건식 1개, 중괄호 1개가 있는 구조로, '조건식 = true'일 때 중괄호 안을 실행하고 '조건식 = false'일 때 중괄호 안을 실행하지 않는다.


if 조건식 // (boolean 타입(true, false)만 가능)
{실행 구문; // (조건식이 true일 때만 실행)
}

유형 ① 단일 구문의 예

if(5 > 3) {
System.out.println("출력1"); // 실행됨
}
if(5 < 3) {
System.out.println("출력2"); // 실행 안 됨
}
int a = 3;
if(a == 3) {
System.out.println("출력3"); // 실행됨 
}
boolean b = false 
if(b){
System.out.println("출력4"); // 실행 안 됨

유형 ①은 if 문 중 가장 간단한 형태로 단순히 조건식의 참, 거짓 여부에 따라 중괄호 안의 실행 여부를 결정하므로 매우 직관적이다.

참고로 첫 번째와 두 번째 조건문으로 사용된 (5 > 3) 또는 (5 < 3)은 이미 실행 여부가 확정되므로 실제에서는 거의 사용할 일이 없고, 세 번째와 네 번째 조건문과 같이 변수가 포함된 조건식이 주로 사용된다.


+)중괄호를 생략했을 때 제어문의 동작
if 문을 포함한 모든 제어문은 중괄호를 포함하며, 생략했을 때는 컴파일러가 자동으로 삽입한다. 이때 주의해야 할 점은 컴파일러가 삽입하는 중괄호는 반드시 하나의 실행 구문만 감싼다는 것이다.

컴파일러가 삽입하는 제어문의 중괄호

if(3 > 5) {
System.out.println("안녕"); // 출력 안 됨
System.out.println("방가"); // 출력 안 됨
}

if(3 > 5) {
System.out.println("안녕"); // 출력 안 됨. } -> 컴파일러가 자동으로 삽입한 중괄호
System.out.println("방가"); // 출력됨. 

유형 ② if-else 구문

유형 ②는 조건식 하나와 중괄호 2개가 있는 형태로 if 구문의 조건식이 true일 때 if 구문의 중괄호가 실행되고 false일 때 else 구문의 중괄호가 실행된다. 모든 조건식은 true가 아니면 false이므로 둘 중 하나는 반드시 실행되며, 둘 중 하나만 실행된다. 유형 ②의 else 구문은 생략할 수 있으며 이때 유형 ②의 문법 구조는 유형 ①과 같다.


if(조건식) {
실행 구문; // 조건식이 true일 때만 실행
}

else {
실행 구문; // 조건식이 false일 때만 실행 
} 

else~ 생략 가능 (생략했을 때 유형 ①)

유형 ②는 조건식의 결괏값에 따라 둘 중 하나를 선택하는 제어문이므로 앞에서 배운 삼항 연산자와 상호 변환할 수 있다.

유형 ② if-else 구문의 예

//if 문 유형 ② if-else 구문
if (5 > 3) {
System.out.println("실행1"); // 실행됨 
} else {
System.out.println("실행2"); // 실행 안 됨
}

//if 문 유형 ② if-else 구문
int a, b; 
a = 5; b = 0;
if(a > 5){
b = 10; // 실행 안 됨
}else  {
b =20; // 실행됨
}
System.out.println(b); // 20

//삼항 연산자로 전환
a = 5; b = 0;
b = (a > 5) ? 10 : 20;
System.out.println(b); // 20

유형 ③ if-else if-else 구문
마지막으로 유형 ③은 N개의 조건식과 N + 1개의 중괄호를 포함하고 있는 형태로, if-else if-else의 구조이다. 중간의 else if 구문도 생략할 수 있으며 이를 생략하면 유형 ②의 형태가 된다. 물론 else 구문까지 생략하면 유형 ①의 형태가 될 것이다.


if(조건식 1) { 
실행 구문; // 조건식 1이 true일 때 실행한 후 제어문 탈출
} 
--else if (조건식 2)
실행 구문;  // 조건식 2가 true일 때 실행한 후 제어문 탈출 
...
else if (조건식 N) {
실행 구문; // 조건식 N이 true일 때 실행한 후 제어문 탈출
}-- // -- ~ -- 생략 가능(생략했을 때 유형 ②)
else { 
실행 구문; // 모든 조건식이 false일 때만 실행
} 

else if 구문은 개수에 상관없이 추가할 수 있으며 if 구문처럼 소괄호 안에 조건식이 들어간다. 유형 ③에서 반드시 기억해야 할 내용은 조건식을 검색할 때 항상 위에서부터 진행하며 처음으로 조건식이 true가 나오는 중괄호 블록을 만나면 해당 블록의 중괄호를 실행하고 if 문을 탈출한다는 것이다. 즉, 중괄호가 100개 있다 하더라도 처음 참이 되는 블록 하나만 실행되는 것이다. 물론 모든 조건식이 false라면 마지막 else 구문이 실행될 것이다.

🌳유형 ③ if-else if-else 구문을 이용해 점수를 학점으로 변환하는 예 1

//90 이상 : A, 80 이상 ~ 90 미만 : B, 70 이상 80 미만 : C, 70 미만 F
int a = 85;
if(a > 90) {
System.out.println("A학점");
}
else if(a >= 80) {
System.out.println("B학점"); // 처음 조건식이 참인 블록을 실행한 후 if 문 탈출 
}
else if(a >= 70) {
System.out.println("C학점");
}
else { 
System.out.println("F학점");
}

모든 조건식은 위에서부터 차례대로 검사하며, 처음 참이 나오는 조건식은 a >= 80이다. 따라서 해당 조건식의 실행 블록인 System.out.println("B학점")이 출력되고 전체 if 문을 탈출한다. 즉, 다음 조건식 (a >= 70)도 참이지만, 이 조건식은 아예 읽지도 않는다는 말이다.

그렇다면 다음 코드를 살펴보자. 조금 전에 알아본 코드와 완벽히 동일하며, A학점과 C학점을 출력하는 조건식의 순서만 바꿔 놓았다.

🌳유형 ③ if-else if-else 구문을 이용해 점수를 학점으로 변환하는 예 2

int a = 85;
if(a >= 70) {
System.out,println("C학점"); // 처음 조건식이 참인 블록을 실행한 후 if 문 탈출
}
else if(a >= 80) {
System.out.println("B학점");
}
else if(a >= 90) {
System.out.println("A학점");
}
else { 
System.out.println("F학점");
}

여기에서는 첫 번째 참인 조건식이 a >= 70이므로 "C학점"이 출력된다. 단순히 순서만 바꿔놓았지만, 조건식을 위에서부터 확인하는 if문 유형 ③의 특징 때문에 전혀 다른 결과가 나온다. 따라서 if 문 유형 ③을 작성할 때 다수의 조건식이 참이 나올 수 있는 때는 순서에 유의해 작성해야 한다.
조건식의 순서에 상관없이 항상 동일한 결과가 나타나도록 하려면 다음 예제와 같이 모든 조건식 중 하나의 조건식만 참이 나오도록 하면 된다. 당연히 첫 번째 참이 나오는 조건식이 유일한 조건식이므로 순서에 상관 없이 항상 해당 블록만 실행될 것이다.

🌳유형 ③ if-else if-else 구문을 이용해 점수를 학점으로 변환하는 예 3

int a = 85;
if(a >= 70 && a < 80) {
System.out.println("C학점");
}
else if(a >= 80 && a <90) {
System.out.println("B학점");
}
else if(a >= 90) {
System.out.println("A학점");
}
else {
System.out.println("F학점");
}

+) 변수의 범위 표현
변숫값의 범위를 지정할 때 수학식에선 70 <= a < 80과 같이 표현할 수 있지만 자바 코드에서는 반드시 각각을 분리하고, 논리 연산자로 연결해 줘야 한다. 즉, 70 <= a <80은 a >= 70 && a < 80으로 바꿔 작성해야 한다.

실습

        // 유형 1 : if
        int value1 = 5;
        if(value1 > 3) {
            System.out.println("실행1");
        }
        if(value1 < 5) {
            System.out.println("실행2");
        }

        boolean bool1 = true;
        boolean bool2 = false;
        if(bool1){
            System.out.println("실행3");
        }
        if(bool2){
            System.out.println("실행4");
        }

        //유형 2 : if-else
        int value2 = 5;
        if(value2 > 3) {
            System.out.println("실행5");
        }
        else {
            System.out.println("실행6");
        }

        //cf. 삼항 연산자와 변환 가능
        System.out.println((value2 > 3) ? "실행5" : "실행6");
        System.out.println();

        //유형 3 : if-else if-else if-...-else
        int value3 = 85;
        if(value3 >= 90) {
            System.out.println("A학점");
        }
        else if(value3 >= 80){
            System.out.println("B학점"); // 실행한 후 탈출
        }
        else if(value3 >= 70){
            System.out.println("C학점");
        }
        else {
            System.out.println("F학점");
        }

        if(value3 >= 70) {
            System.out.println("C학점"); // 실행한 후 탈출
        }
        else if(value3 >= 80) {
            System.out.println("B학점");
        }
        else if(value3 >= 90) {
            System.out.println("A학점");
        }
        else {
            System.out.println("F학점");
        }

        if(value3 >= 70 && value3 < 80) {
            System.out.println("C학점");
        }
        else if(value3 >= 80 && value3 < 90) {
            System.out.println("B학점"); // 실행한 후 탈출
        }
        else if(value3 >= 90) {
            System.out.println("A학점"); 
        }
        else {
            System.out.println("F학점");
        }

결과

profile
코딩 공부 중...

0개의 댓글