[Java] 04_제어문(조건문 - if문, switch문)

2022. 7. 28. 14:07·📗 self-study/📗 KH정보교육원 당산지원

04_ 제어문(조건문 - if문, switch문)

문법이 다른 언어와도 거의 똑같음! 매우 중요!

 

제어문: 프로그램 수행 흐름을 바꾸는 역할을 함

위에서 아래로 실행되는 코드 중에서 제어문을 만나면 중간을 건너뛰거나(퐁당퐁당) 한 코드를 반복하는 등 순서를 뒤집음

 

선택적으로 실행하는 선택문 => 조건문(if문, if-else문, if-else if문, switch문)
반복적으로 실행하는 실행문 => 반복문(for문, while문, do-while문)
그 이외의 흐름을 제어하는 구문 => 분기문(brake문, continue문)
 
*조건문
"조건식"을 통해 참이냐 거짓이냐를 판단해서 해당 조건이 참일 경우 그에 해당하는 구문만 실행 가능

(== 조건에 따라 다른 문장이 수행되도록 함)
=> 조건식의 결과는 true / false 라는 논리값이 나와야 함
=> 조건식에서는 보통 비교 연산자, 논리 연산자 등 주로 결과가 논리값으로 나오는 연산자를 사용한다.
 
[ 종류 ]
조건문은 크게 if문 계열과 switch문으로 나뉜다.
 1. if문 계열 
- 단독 if문: 표현하고자 하는 경우의 수가 한 개일 경우

=> 만약에 해당 조건을 만족한다면 이것만 실행시켜 줘! (많이 쓰임)
- if-else문: 표현하고자 하는 경우의 수가 두 개일 경우

=> 만약 이 조건을 만족하면 if문 수행, 만족하지 않으면 else문 수행
- if-else if문: 표현하고자 하는 경우의 수가 세 개 이상일 경우

=> 내가 판별하고 싶은 경우의 수가 3개 이상일 때
 
2. switch문: 조건식 중에서도 "동등 비교"에 대하여 편리하게 사용 가능하도록 고안된 문법

 - 조건이 아닌 동등 비교로만 조건을 수행함

 

 

*단독 if문: 표현하고자 하는 경우의 수가 한 개일 때


[ 표현법 ]
if(조건식) {
 조건식이 true일 경우 실행하고자 하는 코드;
}
=> 조건식의 결과가 true일 때는 중괄호 블록 안의 코드 실행
=> 조건식의 결과가 false일 경우 중괄호 블록 안의 코드를 건너 뛰고 실행

 

import 구문을 추가할 수 있는 단축키: Ctrl + Shift + o

// 삼항 연산자를 조건문으로 바꿔 보자
	
	public void method1() {
		
		// 사용자로부터 정수값을 입력받은 후 양수, 0, 음수에 따른 결과 출력
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("정수를 입력하세요: ");
		int num = sc.nextInt();
		
		sc.nextLine();
		
		// 삼항 연산자 버전
		// String result = (num > 0) ? "양수입니다." : ((num == 0) ? "0입니다." : "음수입니다.");
		
		// 단독 if문 버전
		if (num > 0) { // num이 양수일 경우
			System.out.println("양수입니다.");
		}
		
		if (num == 0) { // num이 0일 경우
			System.out.println("0입니다.");
		}
		
		if (num < 0) { // num이 음수일 경우
			System.out.println("음수입니다.");
		}
		
		System.out.println("메소드 영역 종료");
		
	}
	
	public void method2() {
		
		// 사용자가 입력한 정수값이 짝수인지 홀수인지 판별하여 결과를 출력
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("정수를 입력하세요: ");
		int num = sc.nextInt();
		
		sc.nextLine();
		
		// 삼항연산자 버전
		// String result = (num % 2 == 0) ? "짝수입니다." : "홀수입니다.";
		
		// 단독 if문 버전
		/*
		if ((num % 2 == 0) && (num > 0)) { // 짝수이면서 양수일 경우
			
			System.out.println("짝수입니다.");
		}
		
		// 어떤 수이든 간에 2로 나눴을 때의 나머지는 0 또는 1만 나옴
		if ((num % 2 != 0) && (num > 0)) { //홀수이면서 양수인 경우
			
			System.out.println("홀수입니다.");
		}
		*/
		
		// 중첩 if문
		if (num > 0) { // 양수일 경우
			
			// 한 번 더 검사
			if (num % 2 == 0) { // 짝수일 경우
				System.out.println("짝수입니다.");
			}
			
			if(num % 2 != 0) { // 홀수일 경우
				System.out.println("홀수입니다.");
				
			}
		}
		
		
	}
	
	public void method3() {
		
		// 사용자로부터 나이를 입력받곡 입력한 나이값을 가지고 어린이 청소년, 성인 출력
		// 어린이 (13세 이하), 청소년 (19세 미만), 성인 (19세 이상)
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("나이 입력: ");
		int age = sc.nextInt();
		
		sc.nextLine();
		
		if(age <= 13) { // 어린이일 경우
			
			System.out.println("어린이입니다.");
			
		}
		
		if ((age > 13) && (age < 19)) { // 청소년일 경우 (13세 초과 조건을 추가해야 함)
			
			System.out.println("청소년입니다.");
			
		}
		
		if (age >= 19) { // 성인일 경우
			
			System.out.println("성인입니다.");
		}
		
	}
	
	// 난이도 up
	public void method4() {
		
		// 사용자로부터 주민등록번호 입력받은 후
		// 남자, 여자 판별 후 결과 출력
		// 숫자라도 사칙연산(산술연산)을 하지 않으면 문자열로 취급
		
		// 참고: 주민번호 포맷 (생년월일6자-성별자리1자리xxxxxx)
		// (xxxxxx-*xxxxxx)
		
		// 1단계: 주민번호 입력받아서 변수에 담기
		Scanner sc = new Scanner(System.in);
		
		System.out.print("주민번호를 입력하세요 (-포함): ");
		String personId = sc.nextLine();
		
		// 2단계: 입력받은 주민번호로부터 성별에 해당하는 자리만 추출
		
		char gender = personId.charAt(7);
		
		// 3단계: 뽑힌 값에 따라 서로 다른 결과를 출력 => 조건문 이용
		// 남자일 경우 '1', '3'
		// 여자일 경우 '2', '4'
		
		if ((gender == '1') || (gender == '3')) { // 남자일 경우 
			
		System.out.println("남자입니다.");
		
		}
		
		if ((gender == '2') || (gender == '4')) { // 여자일 경우 
			
			System.out.println("여자입니다.");
		}
		
		if ((gender != '1') && (gender != '2')
				&& (gender != '3') && (gender != '4')) { // 번호를 잘못 입력한 경우
			
			System.out.println("잘못된 주민등록번호를 입력했습니다.");
		}
	}
	
}

 

*if-else문: 표현하고 싶은 경우의 수가 두 개일 경우 사용하는 조건문
 
[ 표현법 ]
if(조건식) {
 해당 조건식이 true일 경우 실행하고자 하는 코드;
}
else {
 해당 조건식이 false일 경우 실행하고자 하는 코드;
}
 
=> 조건식의 결과가 true일 경우 if 블럭 안을 실행하고 if-else문 자체를 빠져나감

public void method1() {
		
		// 사용자에게 정수값을 입력받은 후 짝수, 홀수 판별 후 결과 출력
	
		Scanner sc = new Scanner(System.in);
		
		System.out.print("정수를 입력하세요: ");
		int num = sc.nextInt();
		
		sc.nextLine();
		
		// 양수일 경우만 판별 가능하게끔 중첩 if문 사용
		
		if (num > 0) {
			
			// 짝수일 경우 또는 홀수일 경
			if (num % 2 == 0) { // 짝수일 경우
				System.out.println("짝수입니다. ");
			}
			else { // 짝수가 아닐 경우
				System.out.println("홀수입니다.");
			}
			// else 블럭에서는 별도의 조건을 내세울 필요가 없음!!
			// 조건식 결과가 true이면 else 블럭을 건너뛰기 때문에
			// 단독 if문 두 개로 표현하는 것보다 효율적임
			
		}
		else { // 양수가 아닙니
			System.out.println("양수만 입력해야 합니다.");
		}
		
	}
	
	/*
	 * if-else if문: 동일한 비교 대상을 가지고 3개 이상의 조건을 제시해 두고자 할 때 사용되는 조건문
	 * 
	 * [ 표현법 ]
	 * if (조건식1) {
	 * 		조건식1이 true일 경우 실행할 코드;
	 * }
	 * else if (조건식2) {
	 * 		조건식2가 true일 경우 실행할 코드;
	 * }
	 * else if (조건식3) {
	 * 		조건식3이 true일 경우 실행할 코드;
	 * }
	 * else {
	 * 		앞에서 제시한 모든 조건식들이 모두 false일 경우 실행할 코드;
	 * }
	 * 
	 */
	
	public void method2() {
		
		// 사용자로부터 정수 입력 후 양수, 0, 음수 판별 후 출력
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("정수를 입력하세요: ");
		int num = sc.nextInt();
		
		sc.nextLine();
		
		if (num > 1) { // 양수일 경우
			
			System.out.println("양수입니다.");
			
		}
		else if (num == 0) {
			
			System.out.println("0입니다.");
			
		}
		else {
			
			System.out.println("음수입니다.");
			
		}
	}

	
	// 실습 문제
	
	public void method3() {
		
		/*
		 * 사용자로부터 나이를 입력받고
		 * 13세 이하까지 어린이, 14세부터 18세까지 청소년, 19세 이상부터는 성
		 * 판별 후 출력
		 * 
		 * 경우의 수
		 * 우선적으로 고려해야 할 것: 나이는 0살부터 셀 수 있게끔(0보다 작을 경우 판별 불가)
		 * 						나이가 0살부터라면 판별
		 */
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("나이를 입력하시오: ");
		int age = sc.nextInt();
		
		sc.nextLine();
		
		if ((age >= 0) && (age < 14)) {
			System.out.println("어린이입니다.");
		}
		else if (age < 19) {
			System.out.println("청소년입니다.");
		}
		else if (age >= 19) {
			System.out.println("어른입니다.");
		}
		else {
			System.out.println("잘못 입력했습니다.");
		}
		
		/* 선생님 풀이
		 * 
		 * if (age < 0) { // 나이를 음수로 입력했을 경우
		 * 
		 *  System.out.println("잘못 입력했습니다.");
		 *  
		 *  }
		 *  else {
		 * 
		 * 		if (age <= 13) { // 나이가 13 이하라면 (+ 나이가 0살 이상이라면)
		 * 
		 * 		System.out.println("어린이입니다.");
		 * 
		 * 		}
		 * 		else if (age < 19) {
		 * 
		 *  		System.out.println("청소년입니다.");
		 * 		}
		 * 		else {
		 * 		
		 * 		System.out.println("성인입니다.");
		 * 
		 * 		}
		 * 	}
		 * 
		 */
	}
	
	// 숙제
	public void method4() {
	
	/*
	 * 사용자에게 정수를 입력받아
	 * 90점 이상일 경우 "A등급"
	 * 90점 미만 80점 이상일 경우 "B등급"
	 * 80점 미만 70점 이상일 경우 "C등급"
	 * 70점 미만일 경우 "D등급"
	 * 
	 * "당신의 점수는 xx점이고, 등급은 xxx입니다." 출력(printf)
	 */
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("점수를 입력하시오: ");
		int score = sc.nextInt();
		
		sc.nextLine();
		
		String result = "";
		
		if (score >= 90) {
			result = "A등급";
		}
		else if (score >= 80) {
			result = "B등급";
		}
		else if (score >= 70) {
			result = "C등급";
		}
		else {
			result = "D등급";
		}
		
		System.out.printf("당신의 점수는 %d점이고, 등급은 %s입니다.", score, result);
 }
}


Switch문: 조건문이 없는 조건문
    내부적으로 동등비교 연산에 대해서만 조건식이 적용되는 구조
 
[ 표현법 ]
 switch(앞으로내가동등비교를하고싶은대상자) {
 case 값1 : 실행할코드; // 앞으로내가동등비교를하고싶은대상자 == 값1 << 일 경우에만 실행됨
  break; // switch 중괄호 영역을 빠져나
 case 값2 : 실행할코드; // 앞으로내가동등비교를하고싶은대상자 == 값2 << 일 경우에만 실행됨
  brake; // switch 중괄호 영역을 빠져나감
 ...
 case 값n : 실행할코드;
  break;
 default : 실행할코드; // 값1 ~ 값n까지 내가 동등비교를 하고 싶은 대상자와 단 하나도 일치하지 않을 경우 실행됨
     // else 블럭에 해당됨
    // 어차피 가장 마지막으로 실행되는 코드이기 때문에 break;를 쓰지 않음
}
 
*if문과 switch문의 차이점
if(조건식) => 조건식을 복잡하게도 기술 가능(자유도 높음), 값의 범위 제시 가능
switch(동등비교대상자) => 동등 비교만 수행됨, 확실한 값의 조건만 기술 가능

public void method1() {
		
		// 1 ~ 3 사이의 정수를 입력받아
		// 1인 경우 "빨간불입니다" 출력
		// 2인 경우 "파란불입니다" 출력
		// 3인 경우 "초록불입니다" 출력
		// 그 이외의 숫자를 입력한 경우 "잘못 입력했습니다" 출력
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("1 ~ 3 사이의 정수 입력: ");
		int num = sc.nextInt();
		
		sc.nextLine();
		
		// 기존의 if문 계열 버전
		/* if (num == 1) { // num == 1 
			System.out.println("빨간불입니다.");
		}
		else if (num == 2) { // num == 2 
			System.out.println("파란불입니다.");
		}
		else if (num == 3) { // num == 3
			System.out.println("초록불입니다.");
		}
		else {
			System.out.println("잘못 입력했습니다.");
		} */ 
		
		// => 모든 조건식이 num이라는 변수에 들은 값 기준으로 동등비교만 수행하고 있음
		
		// switch문 버전
		/*
		switch(num) {
		case 1 : System.out.println("빨간불입니다");
				break;
		case 2 : System.out.println("파란불입니다");
				break;
		case 3 : System.out.println("초록불입니다");
				break;
		default : System.out.println("잘못 입력했습니다");
		}
		*/
		
		String result = "";
		
		switch (num) {
		case 1 : result = "빨간불";
				break;
		case 2 : result = "파란불";
				break;
		case 3 : result = "초록불";
				break;		
		default : System.out.println("잘못 입력했습니다");
				return; // return문은 현재 실행 중인 메소드를 빠져나가
						// 나를 호출했던 부분으로 돌아가는 역할
		
		}
		
		System.out.println(result + "입니다");

	}
	
	// 숙제
	public void method2() {
		
		/* 
		 * 사용자에게 구매할 과일명(사과, 바나나, 복숭아) 을 입력받아
		 * 각 과일마다의 가격을 출력 (사과 1000원, 바나나 2000원,복숭아 5000원)
		 * xx의 가격은 xxxx원입니다. 출력(printf)
		 * 만약에 다른 과일명을 입력받은 경우 "저희 가게에서 판매하는 과일이 아닙니다" 출력
		 */
		
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("구매할 과일명을 입력하세요: ");
		String fruit = sc.nextLine();
		
		int result = 0;
		
		switch (fruit) {
		
		case "사과" : result = 1000;
					break;
			
		case "바나나" : result = 2000;
					break;
			
		case "복숭아" : result = 5000;
					break;
			
		default : System.out.print("저희 가게에서 판매하는 과일이 아닙니다");
				return;
					
		}
				
		System.out.printf("%s의 가격은 %d원입니다.", fruit, result);
		
	}
}

// if문 계열 버전 (선생님 추가 풀이)
		// => 제대로 된 문자열을 입력받았음에도 불구하고 잘못된 결과가 나오는 이슈 발생(무조건 else 출력문 나옴)
		
		// 기본 자료형 (boolean, int, byte, short, long, float, double, char)들끼리
		// 동등 비교(==, !=) 가 잘 이루어짐
		
		// 참조 자료형 (String)을 동등비교 하고자 할 경우 동등 비교(==, !=)가 잘 이루어지지 않음
		// => stack 영역에 주소값이 담기기 때문에 주소값 기준으로 비교가 이루어짐!!
		
		// 문자열 내용물을 동등 비교 하고자 할 경우에는 equals 메소드를 활용해야 함
		
		// [ 표현법 ] 문자열.equals(동등비교하고자하는문자열);
		// => 내용물이 일치할 경우 true, 아닐 경우 false를 내보내 줌
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("구매할 과일명을 입력하세요: ");
		String fruit = sc.nextLine();
		
		int price = 0;
		
		if (fruit.equals("사과")) { // fruit == "사과" 는 알게 모르게 주소값을 비교한 거였다!!
			price = 1000;
		}
		else if (fruit.equals("바나나")) { 
			price = 2000;
		}
		else if (fruit.equals("복숭아")) {
			price = 5000;
		}
		else {
			System.out.println("저희 가게에서 판매하는 과일이 아닙니다.");
			return;
		}
		
		System.out.printf("%s의 가격은 %d원입니다.", fruit, price);
		 
	}
// break를 안 쓰는 경우
	public void method3() {
		
		// 사용자로부터 키보드로 등급을 입력받아 해당 등급별로 권한 출력하기
		// 1등급: 관리 권한, 쓰기 권한, 읽기 권한
		// 2등급: 쓰기 권한, 읽기 권한
		// 3등급: 읽기 권한
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("등급을 입력하세요: ");
		int grade = sc.nextInt();
		
		sc.nextLine();
		
		switch (grade) {
		
		case 1 : System.out.println("관리 권한 부여");
		case 2 : System.out.println("쓰기 권한 부여");
		case 3 : System.out.println("읽기 권한 부여");
		
		}
		
		// 내가 동등비교 후에 true가 나오는 시점에서 코드가 시작되지만
		// break 구문이 나타날 때까지는 계속 실행이 되는 구조
		
	}
	
	public void method4() {
		
		// 사용자로부터 주민번호를 입력받은 후 성별 판별
		// xxxxxx-*xxxxxx => * 부분이 성별을 나타내는 자리(1, 3: 남자 / 2, 4 : 여자)
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("주민번호 입력 (-포함): ");
		String personId = sc.nextLine();
		
		// 성별 자리 추출
		
		char gender = personId.charAt(7);
		
		// 성별 값을 담을 수 있는 문자열 변수 세팅
		String result = "";
		
		switch (gender) {
		case '1' : result = "남자"; break;
		case '2' : result = "여자"; break;
		case '3' : result = "남자"; break;
		case '4' : result = "여자"; break;
		default : System.out.println("잘못된 주민번호를 입력했습니다."); return;
		
		/* break문을 만나기 전까지는 빠져나가지 못하는 점을 이용해 이런 식으로 코드를 줄일 수도 있다
		 * case '1' : 
		 * case '3' : result = "남자"; break; // gender == '1' || gender == '3'
		 * case '2' :
		 * case '4' : result = "여자"; break; // gender == '2' || gender == '4'
		 * default : System.out.println("잘못된 주민번호를 입력했습니다."); return;
		 */
				
		}
		
		 System.out.println(result + "입니다.");
	}
	
	public void method5() {
		
		// 사용자로부터 1 ~ 12 사이의 월을 입력받아
		// 해당 달의 마지막 날짜를 출력하는 프로그램
		// 1, 3, 5, 7, 8, 10, 12월 => 31일까지입니다.
		// 4, 6, 9, 11 => 30일입니다.
		// 2 => 28일 또는 29일까지입니다.
		// 그 이외의 => 반드시 1 ~ 12월 사이를 입력해야 합니다.
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("월을 입력하세요(1~12): ");
		int month = sc.nextInt();
		
		sc.nextLine();
		
		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일까지입니다."); break;
		default : System.out.println("반드시 1 ~ 12월 사이를 입력해야 합니다."); return;
		
		}
	} 		
}
저작자표시 (새창열림)
'📗 self-study/📗 KH정보교육원 당산지원' 카테고리의 다른 글
  • [Java] 04_제어문(분기문 -break문, continue문)
  • [Java] 04_제어문(반복문-for문, while문)
  • [Java] 03_연산자(Operator)
  • [Java] 02_변수(Variable)
천재강쥐
천재강쥐
  • 천재강쥐
    디버거도 버거다
    천재강쥐
  • 전체
    오늘
    어제
    • Category (467)
      • 진짜 너무 궁금한데 이걸 나만 몰라...? (0)
      • 💾 Portfolio (2)
      • 🐤 CodingTest (28)
        • Java (20)
        • ᕕ(ꐦ°᷄д°᷅)ᕗ❌ (5)
      • 🚀 from error to study (142)
        • AI (1)
        • Cloud (2)
        • DB (12)
        • Front-End (16)
        • Github (14)
        • Java (39)
        • Mac (7)
        • Normal (29)
        • Server (22)
      • 📘 certificate (44)
        • 📘 리눅스마스터1급 (1)
        • 📘⭕️ 정보처리기사 (40)
        • 📘⭕️ SQLD (3)
      • 📗 self-study (234)
        • 📗 inflearn (35)
        • 📗 생활코딩 (8)
        • 📗 KH정보교육원 당산지원 (190)
      • 🎨 Scoop the others (0)
        • 📖 Peeking into other people.. (0)
        • 🇫🇷 (0)
        • 📘⭕️ 한국사능력검정시험 심화 (11)
        • 오블완 (4)
  • 인기 글

  • hELLO· Designed By정상우.v4.10.1
천재강쥐
[Java] 04_제어문(조건문 - if문, switch문)
상단으로

티스토리툴바