10 min read

<Java>조건문

<Java>조건문
  • if, else if, else ,for, while 위 다섯가지 단어들의 기능에 대해 설명만 해도 해당 챕터는 이해 가능하다고 봅니다.
  • 그만큼 영어와 닮아있고, 직관적으로 이해가능한 챕터라고 생각합니다.
  • 하지만 디테일한 부분을 간과하면 추후에 이해할 수 없는 코드를 만날 확률이 높습니다.

조건문 - If,Switch

If문

  • if문은 가장 기본적인 조건문이며, 아래와 같이 조건식과 괄호로 이루어져 있습니다.영문법의 뜻과 동일하게 조건식을 만족하면, 괄호안의 코드들을 실행합니다.
  • 아래와 같은 코드에서 변수 x가 10보다 큰 경우에만, “조건만족”이라는 문자열이 콘솔에 출력됩니다.
if(x>10){
	System.out.println("조건만족");
}
  • 아래 예제들을 통해 if문을 이해할 수 있습니다.
public class FlowEx1 {
    public static void main(String[] args) {
        int x = 0;
        System.out.printf("x=%d 일 때, 참인 것은 \n", x);
        if (x == 0) {
            System.out.println("x==0");
        }
        if (x != 0) {
            System.out.println("x!=0");
        }
        if (!(x == 0)) {
            System.out.println("!(x == 0)");
        }
        if (!(x != 0)) {
            System.out.println("!(x != 0)");
        }

		//{}블럭 없이 한문장을 넣을 수도 있습니다.
        x = 1;
        System.out.printf("x = %d 일때, 참인 것은 \n", x);
        if (x == 0) System.out.println("x==0");

        if (x != 0) System.out.println("x!=0");

        if (!(x == 0)) System.out.println("!(x == 0)");

        if (!(x != 0)) System.out.println("!(x != 0)");
    }
}
public class FlowEx2 {
    public static void main(String[] args) {
        System.out.print("숫자를 입력하세요 : ");

        Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();
        if (i == 0) {
            System.out.println("숫자는 0입니다.");
        }
        if (i != 0) {
            System.out.println("숫자는 0이 아닙니다.");
            System.out.printf("입력하신 숫자는 %d 입니다.\n", i);
        }
    }
}

if-else문

  • if문의 조건을 만족하지 않는 모든 경우에 대해서 else문의 문장이 수행됩니다.
  • FlowEx2를 아래와 같이 if-else문으로 변경 할 수 있습니다.
public class FlowEx3 {
    public static void main(String[] args) {
        System.out.print("숫자를 입력하세요 : ");
        Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();
        if (i == 0) {
            System.out.println("숫자는 0입니다.");
        }
        else{
            System.out.println("숫자는 0이 아닙니다.");
            System.out.printf("입력하신 숫자는 %d 입니다.\n", i);
        }
    }
}

if-else if문

  • 아마 가장 빈번하게 사용하게 될 조건문입니다.
  • if문의 조건을 만족하지 않는 경우, 다른 조건을 else if문에 넣어 조건에 대한 검사를 실시 할 수 있습니다.
  • else의 경우 if와 else if문, 모두에 해당 되지 않는 경우를 받아 문장을 실행시킵니다.즉, 결과가 참인 조건이 하나도 없으면 마지막에 있는 else블럭의 문장들이 수행됩니다.
public class FlowEx4 {
    public static void main(String[] args) {
        int score = 0;
        char grade = ' ';

        System.out.print("점수를 입력하세요 : ");
        Scanner sc = new Scanner(System.in);
        int s = sc.nextInt();
        if (s >= 90) {
            grade = 'A';
        } else if (s >= 80) {
            grade = 'B';
        } else if (s >= 70) {
            grade = 'C';
        } else {
            grade = 'D';
        }
        System.out.println("grade = " + grade);
    }
}

중첩 if문

  • if문의 블럭 내에 또 다른 if문을 포함시키는 것을 중첩 if문이라고 합니다.
  • 즉, 중첩 if문 내의 문장이 실행되려면 두가지 조건을 모두 만족해야 가능합니다.
  • 중첩에 대한 횟수 제한은 존재하지 않습니다.
  • 위의 학점 계산 예제를 좀 더 구체화해보겠습니다.
public class FlowEx5 {
    public static void main(String[] args) {
        int score = 0;
        char grade = ' ', opt = '0';

        System.out.print("점수를 입력해주세요 : ");

        Scanner sc = new Scanner(System.in);
        score = sc.nextInt();

        System.out.printf("당신의 점수는 %d입니다. \n", score);

        if (score >= 90) {
            grade = 'A';
            if (score >= 98) {
                opt = '+';
            } else if (score < 94) {
                opt = '-';
            }
        } else if (score >= 80) {
            grade = 'B';
            if (score >= 88) {
                opt = '+';
            } else if (score < 84) {
                opt = '-';
            }
        } else {
            grade = 'C';
        }
        System.out.printf("당신의 학점은 %c%c입니다. \n", grade,opt);
    }
}

If문 여러번 쓰기

  • 중첩 if가 if문 속에 if문을 넣는 개념이라면, 이번에 할 내용은 IF문 자체를 여러번 쓰는 상황에 대해 알려드리겠습니다.
public class DoubleIf {
    public static void main(String[] args) {
        int x = 12;
		//1st if문
        if (x > 0) {
            System.out.println("IF - satisfied");
        } else if (x > 5) {
            System.out.println("Else If - satisfied");
        }
		//2nd if문
        if (x > 5) {
            System.out.println("IF - satisfied");
        }
    }
}
  • 위 코드의 결과를 예측해봅시다. 이후 아래의 결과를 확인해봅시다.
  • 주석을 보시면 알 수 있듯이, 새롭게 if문을 만들면 무조건 앞의 코드와 상관없이 한번더 비교를 진행합니다.즉, 1st if문에서 else if의 조건이 만족되지만 if(x >0)가 우선적으로 나온 조건식이기에 해당 블럭의 코드를 실행합니다.
  • 그리고 나서 2nd if문의 경우, 완전히 새로운 if문이기에 새롭게 조건식에 대해 참 거짓을 판별하게 됩니다.
  • 종종 조건식을 처음 접하시는 분들은 else if와 else에 대해서도 독립적으로 사용된다라고 오해를 합니다.이러한 조건문들은 바로 앞에 나온 if문에 종속적이며, 해당 if문을 만족할 경우에는 제어 흐름이 완전히 if문 블럭으로 넘어갔기에 조건을 만족한다하더라도 블럭 내 코드가 실행되지 않습니다.

Switch문

  • 예를 들어 if문으로 조건 10개를 넣어야 하는 상황이 있다고 가정해봅시다.else if문으로 8개를 도배해야하는 상황이 발생합니다.이러한 복잡한 상황을 해결 하기 위한 방법으로 switch문이 있습니다.
  • 기본적인 switch문의 동작 방식을 알려드리겠습니다. 조건식을 먼저 계산한 다음, 그 결과와 일치하는 case문으로 이동합니다. 이동한 case문 아래에 있는 코드들을 수행하며, break문을 만나면 전체 switch문을 빠져나갑니다.
  • 새롭게 보는 용어들이 많아 이해가 안가실 수 있습니다. 코드를 통해 알아봅시다.
switch(조건식){
	case 값1 : 
		//조건식의 결과가 값1과 동일한 경우 수행될 문장들..
		//...
		break;//switch문 벗어남
	case 값2 : 
		//조건식의 결과가 값2과 동일한 경우 수행될 문장들..
		//...
		break;//switch문 벗어남
	default : 
		// 조건식의 결과와 일치하는 case문이 없을 경우 수행될 문장들..
}

Switch 제약조건

  • Switch 문을 사용하기 위해, 아래와 같은 조건식에 대한 제약사항이 있습니다.
  1. switch문의 조건식 결과는 정수 또는 문자열이여야 한다.
  2. case문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다.
  • 아래 예제를 통해 확실하게 이해해봅시다.
public class FlowEx6 {
    public static void main(String[] args) {
        System.out.print("현재 월을 입력하세요 : ");

        Scanner sc = new Scanner(System.in);
        int month = sc.nextInt();

        switch (month) {
            case 3: case 4: case 5:
                System.out.println("현재 계절은 봄입니다.");
                break;
            case 6: case 7: case 8:
                System.out.println("현재 계절은 여름입니다.");
                break;
            case 9: case 10: case 11:
                System.out.println("현재 계절은 가을입니다.");
                break;
            case 12: case 1: case 2:
                System.out.println("현재 계절은 겨울입니다.");
            default:
                System.out.println("존재하지 않는 월입니다.");
        }
    }
}
  • month의 값이 3,4,5인 경우에는 “현재 계절은 봄입니다.”라는 문자열이 출력됩니다.즉, month가 조건식이며 해당 조건식의 값에 따라 알맞은 case문으로 이동하여 코드를 실행합니다.
  • 만약 여기서 break문을 넣어주지 않을 경우, month값에 알맞은 case문으로 이동한 뒤 해당 case문의 뒤에 있는 모든 case문들을 실행합니다.아래의 결과가 break문을 넣지 않을 경우입니다.
  • Switch문 마지막 예제로 컴퓨터와 진행하는 가위바위보게임을 만들어 보겠습니다.
public class FlowEx7 {
    public static void main(String[] args) {
        System.out.print("가위(1), 바위(2), 보(3) 중 하나의 숫자를 입력하세요 : ");
        Scanner sc = new Scanner(System.in);
        int user = sc.nextInt();
        int com = (int) (Math.random() * 3) + 1;

        System.out.println("user = " + user);
        System.out.println("com = " + com);
        
        switch (user - com) {
            case 2: case -1:
                System.out.println("유저가 졌습니다.");
                break;
            case 1: case -2:
                System.out.println("유저가 이겼습니다.");
                break;
            default:
                System.out.println("비겼습니다.");
                //break; 마지막 문장이라 break 사용하지 않아도 됩니다.
        }
    }
}
  • Math.random() 함수는 0.0과 1.0 사이의 범위에 속하는 하나의 double값을 반환하는 기능을 수행합니다.
  • 즉, 해당 메서드를 이용해서 컴퓨터가 낼 경우의 수를 랜덤하게 지정할 수 있습니다.이러한 수를 난수(Random variable)이라 하며, 종종 사용되니 기억해두시면 좋습니다.
  • 이후, user의 정수값과 com의 정수값을 빼서 가위바위보의 결과를 도출 해 낼수 있습니다.

Switch 중첩

  • if의 중첩처럼 switch 또한 중첩으로 사용 가능합니다. 굉장히 직관적이니 아래 예제를 통해서 쉽게 이해 할 수 있습니다.
  • 일전에 진행한 주민등록번호로 성별을 판단하는 프로그램을 switch의 중첩을 통해 좀더 구체화 시켰습니다.
public class FlowEx11 {
    public static void main(String[] args) {
        System.out.print("당신의 주민번호를 입력하세요(123456-1234567) : ");

        Scanner sc = new Scanner(System.in);
        String regNum = sc.nextLine();
        char genderNum = regNum.charAt(7);

        switch (genderNum) {
            case '1': case '3':
                switch (genderNum) {
                    case '1':
                        System.out.println("당신은 2000년 이전에 출생한 남자입니다.");
                        break;
                    case '3':
                        System.out.println("당신은 2000년 이후에 출생한 남자입니다.");
                        break;
                }
            break;
            case '2': case '4':
                switch (genderNum) {
                    case '1':
                        System.out.println("당신은 2000년 이전에 출생한 여자입니다.");
                        break;
                    case '3':
                        System.out.println("당신은 2000년 이후에 출생한 여자입니다.");
                        break;
                }
            break;
            default:
                System.out.println("유효하지 않은 주민번호 입니다.");
        }
    }
}

Ref: 자바의 정석 - 남궁성