에듀테크 부트캠프

Java 제어문 완전 정복! 조건문과 반복문을 활용한 실전 예제

wy-family 2025. 3. 7. 22:42

제어문에 대해서 배운다. 이미 여러번 해본 것이라 충분히 이해하고 있으니, 더욱 더 다양한 상황, 다양한 상상, 다양한 예시를 접해보면서 더욱 더 이해를 깊이있고 넓게 할 수 있도록 하는 것을 목표로 하자.


<조건문>
사용자가 뭘 선택할지에 따라 A 결과가 나올수도 있고, B결과가 나올수도 있다.
그러면 A에 대한 결과도 준비해야 하고 B에 대한 결과도 준비해야 한다.
시작은 if 든 뭐든 선택하도록 만들어주고, 나머지 결과(특정한 코드 구문)은 둘다 짜야 한다.
-> 핵심은, 모든 경우에 대한 구문을 짜야 한다는 것.


<반복문>
그리고 사용자가 새롭게 오면 동일한 코드가 또 한 번 실행되어야 한다.
그리고 한 명의 사용자가 코드의 끝에 도달한 뒤에, “또 한 번 해볼래?” 와 같은 것이 작동될 수 도 있다. 그렇기 때문에 반복문이 필요하다.

심리테스트에 빗대서 상상해보면 이해가 될 것이다.


<조건문 if 문>
if : boolean 형의 조건식이 필요하다. true 일 때 실행되도록 한다.
else if, else 와 함께 활용 가능: true 일 때 실행이 되는것이 if 문인데, 만약에 false가 뜨면 어떻게 할지에 대한 것이다.
어쨌든, 어딘가에서는 한 번 true가 떠서 실행되는 구문이 있을텐데 나머지는 실행되지 않고 if 문이 끝이 난다는 점.
계속해서 false 가 나온다면 마지막에는 else 가 있어서 해당 구문을 실행하던지, 아니면 else 조차 없으면 그냥 아무것도 실행되지 않고 넘어가는 것이다. 즉, true 가 나올때에만 실행이 된다는 점. else 는 그렇게 생각하면, else까지 오면 else에서는 무조건 true 라고 본다는 거랑 같은 거라고 생각할 수도 있겠다.
중첩 if 문도 가능. if 에서 true 가 떠서 실행될 구문에 들어갔는데, 그 안에서 또 if 문이 들어갈 수 있다.
if 문 구문 자체가 어렵다기 보다는, 어떤 조건들로 나눌 것인지에 대한 생각하는게 중요하다.

<선언된 변수의 사용 범위 - { } >
if 문을 포함하고 있는 메소드/클래스 { } 에서 선언된 변수를 if { } 내부에서 사용이 가능함
당연히, if { } 내부에서 변수 선언하고 사용 가능하다.
단, if 문 내부에서 선언된 걸, if 문 외부에서는 사용이 안 된다.
{ } 의 범위를 잘 생각해보면 되겠다.

<조건문 - switch 문>
Switch: 조건식 하나로 많은 경우의 수를 처리할 때 용이
(_) 괄호 안에 조건식 (boolean 형) 이 아니라 (수 또는 값, = 이 없는 식)이 들어가야 한다.
예를 들어, num%5 이렇게, ‘5로 나눈 나머지’
그러면 case 1:, case 2: 이런식으로 case 뒤에 일치하는 값을 넣어야 한다.
switch () 조건 괄호 안에는 int, char, String 만 들어올 수 있다.
if 와 다르게 { } 는 없고, case 1: 이렇게 해서 case 문을 열어주고, break; 로 case 문을 닫아준다.
대신에 break; 는 필수는 아니다.
case 문 말고 default 문이 있는데 이건 else 와 같은 역할을 한다.
default 문에서는 break; 가 없어도 switch 가 끝난다.
대신에, break 가 없으면, 그 다음에 case가 남아있으면 그것들까지 전부 다 실행이 된다.

if - switch 섞어서 사용도 충분히 가능!


<반복문>
for - 반복 횟수가 정해져있을 때 쓰면 용이
while - 조건을 주고 해당 조건이 true 일 때 계속 반복하도록 하는 것

<반복문 - for 문>
for (초기식; 조건식; 증감식 ) { 수행할 로직for (초기식; 조건식; 증감식 ) { 수행할 로직 }
1회전할 때
초기식 확인 후 조건식 확인
조건식이 true면 문장 수행
조건이이 false면 수행하지 않음
2회전할 때
증감식 연산 후 조건식 확인
조건식 true 일때 수행
false 면 수행하지 않음
2회전 이상부터는 모두 2회전과 동일하게 증감식 연산 후 조건식 확인하고 수행할지 말지가 된다. 
→ 이 논리 순서대로 for 문이 수행된다.

for (초기식; 조건식; 증감식) {
    // 수행될 로직 (반복 실행될 코드)
}
초기식 실행 (딱 한 번 실행됨)
조건식 확인 (참이면 계속 진행, 거짓이면 for 문 종료)
수행될 로직 실행 (블록 {} 안의 코드 실행)
증감식 실행 (변수 값 변경)
다시 조건식 확인 (2번으로 돌아감)
즉, 조건식을 확인한 후에는 수행될 로직이 먼저 실행되고, 그다음에 증감식이 실행!
코드의 위치상으로는 증감식이 수행될 로직보다 위에 있지만, 실행 순서상으로는 수행될 로직이 먼저 실행된 후에 증감식이 실행된다는 점이 중요.
주의사항 : for 문 내부에 변수 선언을 하게 되면, 반복될때마다 새롭게 변수가 선언되기 때문에 초기화가 된다. 그러니까 만약 누적으로 값을 만들어내고 싶다면, for 문 외부에 변수 선언을 하던지 해야 한다.

package com.condition.controller;
import java.util.Scanner;
public class ConditionController {
	
	public void ifTest() {
		// 기본 if 문 활용하자
		// if (조건식 - true of false) { 조건식이 true 일 때 실행할 로직}
		// {} 내부에는 변수선언, 메소드호출, 연산자, 조건문, 반복문 모두 사용 가능
		if (100>10) {
			System.out.println("100은 10보다 크다");
		}
		// () 조건문은 {} 에만 영향을 줄뿐이다. 그러니 그 영역에 대한 이해와 판단이 중요하다.
		System.out.println("if 문 밖에 출력문");
		
		
		// 수를 입력받아 200이면 우와 목요일이다. 출력하기
		Scanner sc = new Scanner(System.in);
		System.out.print("숫자를 입력하세요 : ");
		int num = sc.nextInt();
		if(num==200) {
			System.out.println("우와 목요일이다.");
		}
		
		
		//입력받은 수가 100~200면 "정상 데이터"를 출력
		// 입력값에 100을 더하기
		System.out.print("또 한 번 숫자를 입력하세요 : ");
		num = sc.nextInt();
		if(100<=num && num<=200) {
			System.out.println("정상 데이터");
			// if 문 외부에 선언된 변수를 if{} 내부에서 사용이 가능함
			num +=100;
			
			// if 문 내부에서 변수 선언 및 사용 가능
			// 하지만 if 문 외부에서는 사용이 불가
			String name = "차은우";
			System.out.println(name);
		}
		// System.out.println(name);  이게 안 된다는 것.
		
		
	}
	
	
	public void ifelseTest() {
		
		//if - else 문
		// if(조건문) { true 일때 실행할 로직 }
		// else { false 일때 실행할 로직  }
		
		// 어떤 수가 음수인지 양수 또는 0인지 판단하는 기능
		
		Scanner sc = new Scanner(System.in);
		System.out.print("숫자를 입력하세요 : ");
		int num = sc.nextInt();
		if(num>=0) {
			System.out.println("양수 또는 0");
		}else {
			System.out.println("음수");
		}
		
		// else 문 단독으로 사용하는 건 불가능
		
		
		// 사용자가 입력한 값이 짝수면 입력값에 100을 더하고
		// 홀수면 입력값에 100을 빼는 기능
		// 최종값을 출력하기
		System.out.print("또 다른 숫자를 입력하세요 : ");
		num = sc.nextInt();
		if(num%2==0) {
			System.out.println("짝수");
			num += 100;
		}else {
			System.out.println("홀수");
			num -= 100;
		}
		System.out.println(num);
	}
	
	public void ifelseifelseTest() {
		// if ~ else if ~ else 구문 활용하기
		// 계절별 메세지를 출력하는 기능
		
		// 봄 : 3~5
		// 여름 : 6~8
		// 가을 : 9~11
		// 겨울 : 12~2
		int month=3;
		Scanner sc = new Scanner(System.in);
		System.out.print("몇월인지 숫자로 입력하세요 : ");
		month = sc.nextInt();
		if(1>month || month > 12) {
			System.out.println("1부터 12사이의 수를 입력하세요~");
		
		} else {
			if(3<=month && month <= 5) {
				System.out.println("봄입니다~");
			} else if(6<=month && month <= 8) {
				System.out.println("여름입니다~");
			} else if(9<=month && month <= 11) {
				System.out.println("가을입니다~");
			} else {
				System.out.println("겨울입니다~");
			}
		}
		// 초중고 나이를 가지고 구별해주는 기능
		// 성적에 따라 등급을 출력해주는 기능
		// 메뉴 기능을 구현하는 것도 가능, 메뉴를 출력하고 선택된 메뉴의 금액을 출력해주는 기능
		// 술추천
		int age = 21;
		if(age>19) {
			System.out.println("==== 술추천 ====");
			System.out.println("1. 소주");
			System.out.println("2. 맥주");
			System.out.println("3. 위스키");
			System.out.println("4. 막걸리");
			System.out.println("5. 와인");
			System.out.print("입력 : ");
			int menu = sc.nextInt();
			String name="";
			if(menu==1) {
				name = "참이슬 후레시";
			} else if (menu==2) {
				name = "블랑";
			} else if (menu==3) {
				name = "발렌타인 21년산";
			} else if (menu==4) {
				name = "밤막걸리";
			} else if (menu==5) {
				name = "특별한 와인";
			} else {
				System.out.println("1~5 중에 입력해주세요.");
			}
			System.out.println(name);
		}
		
	}
	
	
	public void enrollMember() {
		// 사용자가 성년이면 회원정보를 입력받고 출력
		// 이름, 나이, 성별, 키
		// --> 입력한 회원정보 : 000님 00살 0 000.00cm
		// 미성년이면 회원가입이 불가능합니다. 출력
		
		Scanner sc = new Scanner(System.in);
		System.out.print("나이를 입력하세요 : ");
		int age = sc.nextInt();
		if(age>=19) {
			sc.nextLine();
			System.out.print("이름을 입력하세요 : ");
			String name = sc.nextLine();
			System.out.print("성별(남/여)를 입력하세요 : ");
			char gender = sc.next().charAt(0);
			System.out.print("키를 입력하세요 : ");
			double height = sc.nextDouble();
			
			System.out.printf("입력한 회원정보 : %s님 %d살 %c %.2fcm",
					name ,age ,gender, height );
		}else {
			System.out.println("미성년이면 회원가입이 불가능합니다.");
		}
		
	}
	
	public void checkNumber() {
		
		// 수를 입력받아 5의 배수면 "5의 배수입니다"를 출력해주는 기능
		Scanner sc = new Scanner(System.in);
		System.out.print("숫자를 입력하세요 : ");
		int num = sc.nextInt();
		if(num%5==0) {
			System.out.println("5의 배수입니다");
		}
	}
	
	public void testName() {
		
		// 이름을 입력받아 "차은우"라면 "코딩 천재"를 출력해주는 기능
		Scanner sc = new Scanner(System.in);
		System.out.print("이름를 입력하세요 : ");
		String name = sc.nextLine();
		if(name.equals("차은우")) {
			System.out.println("코딩 천재");
		}
	}
	
	public void switchTest() {
		//switch 문 활용하기
		// 정해진 값에 대해 분기처리할 때 사용하는 조건문
		// 동등비교해서 조건문을 사용할 때 편리함.
		
		// switch(대상값(int, char, String)){ case 값: break;}
		
		Scanner sc = new Scanner(System.in);
		System.out.println("=== 점심 메뉴 추천 ===");
		System.out.println("1. 구내식당");
		System.out.println("2. 돈가스");
		System.out.println("3. 마라탕");
		System.out.print("입력: ");
		int choice = sc.nextInt();
		switch(choice) {
			case 1 :
				System.out.println("맛있는 구내식당~");
				break;
			
			case 2 :
				System.out.println("마리오 어딘가에 있는 돈까스집");
				break;
			
			case 3 :
				System.out.println("마라~ 마라~ 마라탕~");
				break;
			
			default :
				System.out.println("해당 번호의 메뉴는 없다능~");
				// 여기에다가는 break; 가 없어도 빠져나간다.
		}
		String menu = "";
		menu = sc.next();
		// switch문 () 안에 다른 연산이나 기능호출하기
//		switch(menu.length()){}
//		switch(menu.charAt(0)) {}
//		switch(choice%3) {}
		// 등등
		
		
		// break 문 생략하기
		switch(menu) {
			case "구내식당" : System.out.println("구내");
			case "돈까스" : System.out.println("돈");
			case "마라탕" : System.out.println("마라");
		}
		// "구내식당"으로 입력하면, 첫번째 case 만 실행되는게 아니라, break 가 없어서
		// 뒤에 있는 것까지 전부 다 실행이 된다.
		// 예를 들어, "돈까스" 라고 입력하면, 두번째 case 부터 밑에 case 까지 쭈욱 다 실행된다.
		// break가 없으면 그렇다.
		int month = 3;
		switch(month) {
			case 1: case 2: case 12:
				System.out.println("겨울~");
				break;
				// 이런식으로 활용도 가능하다!
			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;
				// 이런식으로 활용도 가능하다!
				
		}
		
		//프로그램의 메뉴를 구성할 때
		System.out.println("==== 식당 주문 프로그램 ====");
		System.out.println("1. 주문조회");
		System.out.println("2. 주문등록");
		System.out.println("3. 주문수정");
		System.out.print("입력 : ");
//		int orderNum = sc.nextInt();
//		switch(orderNum) {
//			case 1: new OrderController().orderSearch(); break;
//			case 2: new OrderController().insertOrder(); break;
//			case 3: new OrderController().updateOrder(); break;
//			default: System.out.println("선택한 메뉴는 없습니다! :(");
//		}
	}
	
	public void menu() {
		Scanner sc = new Scanner(System.in);
		System.out.println("=== 실습 내용 보기 ===");
		System.out.println("1. if 문 예제");
		System.out.println("2. ifelse문 예제");
		System.out.println("3. ifelseif문 예제");
		System.out.println("4. switch문 예제");
		System.out.print("입력 : ");
		int choice = sc.nextInt();
		switch(choice) {
		case 1: ifTest(); break;
		case 2: ifelseTest(); break;
		case 3: ifelseifelseTest(); break;
		case 4: switchTest(); break;
		}
	}
	
	public void myMenu() {
		//간단한 주문프로그램
		// 분식집 주문 프로그램
		//1. 떡볶이(5000), 2. 순대(4000), 3. 튀김(3000)
		//4. 김밥(4500) 5. 라면(4000)
		//  갯수를 입력받기
		// 선택한 메뉴와 결제 금액을 출력해주는 주문프로그램
		// 주문하신 메뉴는 000이고, 결제 금액은 0000원 입니다.
		// 1 ~ 5가 아닌 번호를 입력하면 잘못선택하셨습니다. 다시 선택하세요
		
		System.out.println("=== 분식집 주문 프로그램 ===");
		System.out.println("1. 떡볶이(5000)");
		System.out.println("2. 순대(4000)");
		System.out.println("3. 튀김(3000)");
		System.out.println("4. 김밥(4500)");
		System.out.println("5. 라면(4000)");
		System.out.print("메뉴를 골라주세요 : ");
		Scanner sc = new Scanner(System.in);
		int orderNum = sc.nextInt();
		String menu = "";
		int peopleNum = 0;
		int price = 0;
		if(1<=orderNum&&orderNum<=5) {
			switch(orderNum) {
			case 1: menu = "떡볶이"; price = 5000; break;
			case 2: menu = "순대"; price = 4000; break;
			case 3: menu = "튀김"; price = 3000; break;
			case 4: menu = "김밥"; price = 4500; break;
			case 5: menu = "라면"; price = 4000; break;
			}
			System.out.printf("%s를 고르셨습니다. 몇 인분 드릴까요? : ", menu);
			peopleNum = sc.nextInt();
			if(peopleNum<=0) {
				System.out.println("1인분 이상을 주문해주셔야 합니다.");
			}else {
			System.out.printf("주문하신 메뉴는 %s이고, 결제 금액은 %d원 입니다.",menu,peopleNum*price);
			}
		}else{
			System.out.println("해당 번호의 메뉴는 없습니다. 다시 선택해주세요");
			}
			
		}
	}