Java

조건문(conditional statements) - if & switch

제주니어 2022. 8. 19. 22:00

  • 자바 프로그램의 실행 흐름을 개발자가 원하는 방향으로 바꾸어주는 것이 제어문이다.
  • 제어문은 조건식과 중괄호({}) 블록으로 구성되는데 조건식의 결과에 따라 블록 내부의 실행 여부가 결정된다.

조건문 - if, switch

  • 주로 if문이 많이 사용된다. 처리할 경우의 수가 많을 때는 if문보다 switch문이 효율적이지만, switch문은 if문보다 제약이 많다.

1. if문

  • 조건식이 true 일 때 중괄호({}) 블록이 실행되고 false 일 때는 중괄호({}) 블록이 실행되지 않는다.
if(조건식) {
    // 조건식이 참 (true) 일 때 수행될 문장을 적는다. 
}
  • 조건식은 일반적으로 비교연산자와 논리연산자로 구성된다.
  • 헷갈리는 조건식

조건식 조건식이 참일 경우

str.equals(“yes”) 문자열 str의 내용이 “yes”일 때 (대소문자 구분)
str.equalsIgnoreCase(“yes”) 문자열 str의 내용이 “yes”일 때 (대소문자 구분안함)
‘A’ ≤ ch && ch ≤ ‘Z’ 문자 ch가 대문자일 때
‘a’ ≤ ch && ch ,=’z’ 문자 ch가 소문자일 때
public void method1() {
		
		int num = 0;
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("정수값 입력 > ");
		num = scanner.nextInt();
		
		if (num % 2 == 0) {
			System.out.printf("%d는(은) 짝수이다. \n", num);
		}
		
		if (num % 2 != 0) {
			System.out.printf("%d는(은) 홀수이다. \n", num);
		}
			
		scanner.close();
	}

2. if-else문

  • 조건식이 true 일 때 if 문의 중괄호({}) 블록이 실행되고 false 일 때는 else 문의 중괄호({}) 블록이 실행된다.
if(조건식) {
    // 조건식이 참 (true) 일 때 수행될 문장을 적는다. 
} else {
    // 조건식이 거짓 (false) 일 때 수행될 문장을 적는다. 
}
  • 두 개의 if문을 항상 if-else문으로 바꿀 수 있는 것은 아니다.
  • if-else문 블럭 내의 문장이 하나뿐인 경우 괄호({})를 생략할 수 있다.
public void method2() {
		int num = 0;
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("정수값 입력 > ");
		num = scanner.nextInt();
		
		if (num % 2 == 0) {
			System.out.printf("%d는(은) 짝수이다. \\n", num);
		} else {
			System.out.printf("%d는(은) 홀수이다. \\n", num);
		}
		scanner.close();
	}

3. 중첩 if문

  • 처리해야 할 경우의 수가 셋 이상인 경우에는 여러 개의 조건식을 쓸 수 있는 ‘if-else if’문을 사용하면 된다.
if(조건식1) {
    // 조건식1이 참 (true) 일 때 수행될 문장을 적는다. 
} else if (조건식2) {
    // 조건식2이 참 (true) 일 때 수행될 문장을 적는다. 
} else if (조건식3) {
    // 조건식3이 참 (true) 일 때 수행될 문장을 적는다. 
} else { // 마지막에는 보통 else블럭으로 끝나며, else블럭은 생략가능하다.
		// 위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적는다. 
}
public void method4() {
		char ch = '\\u0000';
		Scanner scanner = new Scanner(System.in);
		
		System.out.println("문자 입력 > ");
		ch = scanner.nextLine().charAt(0);
		
		if((ch >= 'A') && (ch <= 'Z')) {
			System.out.printf("%c는(은) 알파벳 대문자이다.", ch);
		} else if((ch >= 'a') && (ch <= 'z')) {
			System.out.printf("%c는(은) 알파벳 소문자이다.", ch);
		} else {
			System.out.printf("%c는(은) 알파벳이 아니다.", ch);
		}
		scanner.close();
	}
public void method4() {
		char ch = '\u0000';
		Scanner scanner = new Scanner(System.in);
		
		System.out.println("문자 입력 > ");
		ch = scanner.nextLine().charAt(0);
		
		if((ch >= 'A') && (ch <= 'Z')) {
			System.out.printf("%c는(은) 알파벳 대문자이다.", ch);
		} else if((ch >= 'a') && (ch <= 'z')) {
			System.out.printf("%c는(은) 알파벳 소문자이다.", ch);
		} else {
			System.out.printf("%c는(은) 알파벳이 아니다.", ch);
		}
		scanner.close();
	}
public void practice2() {
	int num = 0;
		char grade = ' ';
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("점수 > ");
		num = scanner.nextInt();
		
		if (num >= 90) {
			grade = 'A';
		} else if (num >= 80) {
			grade = 'B';
		} else if (num >= 70) {
			grade = 'c';
		} else if (num >= 60) {
			grade = 'D';
		} else {
			grade = 'F';
		}
		
		System.out.printf("당신의 점수는 %d점이고 등급은 %c입니다.", num, grade);
		
		scanner.close();
}

4. switch문

1) switch문

  • 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현도 간결하다.
  • switch 문은 조건식의 결과값이(계산식, 변수, 리터럴) 어떤 값(정수, 문자, 문자열)을 갖느냐에 따라서 실행문이 선택된다
  • if 문과 다르게 코드를 실행하고 조건문을 빠져나가기 위해 break 문이 필요하다.
    • 조건식을 계산한다
    • 조건식의 결과와 일치하는 case문으로 이동한다.
    • 이후의 문장들을 수행한다.
    • break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나간다.
    • 조건식의 결과와 일치하는 case문이 하나도 없는 경우에는 default문으로 이동한다.
    • default문 if문의 else블럭과 같은 역할을 한다.
switch(조건식) { 
    case 값1 : 
        // 조건식의 결과가 값1과 같을 경우 수행될 문장들 
        break; 
    case 값2 : 
        // 조건식의 결과가 값2와 같을 경우 수행될 문장들
        break; // switch문을 벗어난다.
    ... 
    default : 
        // 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
}

2) switch문의 제약조건

  • switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
  • case문의 값은 정수 또는 상수만 가능하며, 중복되지 않아야 한다.
public void main(String [] arg){
	int num, result;
	final int ONE = 1;
...
	
	switch(result) {
		case '1':    // OK, 문자 리터럴(정수 상수 49와 동일)
		case 'ONE':  // OK, 정수 상수
		case "YES":  // OK, 문자열 리터럴.
		case num:   // 에러, 변수는 불가
		case 1.0:   // 에러, 실수도 불가
...
	}
}
public void method1() {
		String fruit = "";
		int price = 0;
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("과일 이름 > ");
		fruit = scanner.nextLine();
		
		switch(fruit) {
			case "수박":
				price = 8000;
				
				break;
			case "사과":
				price = 1500;
				
				break;
			case "복숭아":
				price = 2000;
				
				break;
				
			case "딸기":
				price = 20000;
				
				break;
			default:
				System.out.println("판매하지 않는 과일입니다.");
				scanner.close();

				return;
		}
		
		System.out.printf("%s의 가격은 %d원 입니다.", fruit, price);
		
		scanner.close();
	}
// 1 ~ 12월까지 입력받아서 해당하는 달의 마지막 날짜를 출력한다.
	// 31일까지 존재하는 월 : 1, 3, 5, 7, 8, 10, 12
	// 30일까지 존재하는 월 : 4, 6, 9, 11
	// 28일까지 존재하는 월 : 2
	public void method2() {
		int month = 0;
		Scanner scanner = new Scanner(System.in);
		
		System.out.println("1월 ~ 12월까지 중 하나를 입력하세요. >");
		month = scanner.nextInt();
		
		if(!(month >= 1 && month <= 12)) {
			System.out.println("1 ~ 12월까지 입력하셔야 합니다.");
			scanner.close();
			
			return;
		}
		switch(month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			System.out.println("입력하긴 월은 31일까지 입니다.");
			
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			System.out.println("입력하긴 월은 30일까지 입니다.");
			
			break;
		case 2:
			System.out.println("입력하긴 월은 28일 혹은 29일까지 입니다.");
			
		}
		scanner.close();
	}
/*
	 * 실습 문제 1
	 * 
	 * 두 정수를 입력받고 연산자 기호(+, -, *, /)를 입력받아서 계산을 출력하라
	 * 단, + 또는 - 외의 문자를 입력하는 경우 "잘못 입력했습니다." 출력
	 * 
	 * 예시)
	 * 	첫 번째 수 > 3
	 * 	두 번째 수 > 4
	 * 	연산자 입력(+, -, *, /) > + 
	 * 
	 * 	3 + 4 = 7
	 * 
	 * 	첫 번째 수 > 3
	 * 	두 번째 수 > 4
	 * 	연산자 입력(+, -, *, /) > a 
	 * 
	 * 	연산자를 잘못 입력하셨습니다.
	 */

	public void practice() {
		int num1 = 0;
		int num2 = 0;
		int result = 0;
		char op = '\u0000';
		
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("첫 번째 수 > ");
		num1 = scanner.nextInt();
		
		System.out.print("두 번째 수 > ");
		num2 = scanner.nextInt();
		
		scanner.nextLine();
		System.out.print("연산자 입력(+, -, *, /) > ");
		op = scanner.nextLine().charAt(0);
		System.out.println();
		
		switch(op) {
			case '+':
				result =  (num1 + num2);
				break;
			
			case '-':
				result = (num1 - num2) ;
				break;
	
			case '*':
				result = (num1 * num2) ;
				break;
				
			case '/':
				result = (num1 / num2) ;
				break;
				
			default:
				System.out.println("연산자를 잘못 입력하셨습니다.");
				
				return;
				
		}
		System.out.printf("%d %c %d = %d", num1, op, num2, result);
	}