본문 바로가기

2024_풀스택학원/Back-end

[Java] 제어문

제어문

순차적인 흐름을 조건에 따라 통제하는 명령
사용자의 요구에 따라 프로그램이 동작

 

제어문의 종류

 

if문

가정의 결과에 따라 행위를 결정하는 제어문
if문 안의 결과가 참일 때 명령을 수행

 

else if문

복수의 조건 중 각각 다른 처리를 수행하고자 할 때 사용

 

else문

if문과 함께 씌며 if문의 결고가 참이 아닐 때 else문 수행
if문은 단독으로 쓸 수 있으나 else문은 단독으로 쓰지 못함

 

 

if문의 문법

 

 

중첩 if문의 문법

 

다중 if문의 문법

 

1~10사이의 수를 입력받아 범위 확인하기

import java.util.Scanner;

public class Quze_01 {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		System.out.println("1~10 사이의 수를 입력해주세요.");
		int num =Integer.parseInt(sc.nextLine());
		
		if(1 <= num && num <= 10) {
			System.out.println("통과!");
		} else {
			System.out.println("범위 초과!");
		}
		
	}
}

 

 

 

1~100사이 수를 입력받아 짝/홀수를 판단하기

(1~100 사이의 수가 아닐 경우 예외 처리 후 종료)

import java.util.Scanner;

public class Quiz_03 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("1~100사이 입력 : ");
		int num = Integer.parseInt(sc.nextLine());
		
		if(1<num && num<100) {
			if(num%2 == 0) {
				System.out.println("입력한 수는 짝수입니다.");
			} else {
				System.out.println("입력한 수는 홀수입니다.");
			}
		} else {
			System.out.println("1~100사이의 수가 아닙니다.");
			
		}

	}
}

 

두 숫자를 입력받아 대소 비교하기

(입력 받은 숫자가 같을 경우도 처리)

import java.util.Scanner;

public class Quiz_02 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("첫 번째 숫자 입력 :");
		int a = Integer.parseInt(sc.nextLine());
		System.out.print("두 번째 숫자 입력 :");
		int b = Integer.parseInt(sc.nextLine());
		System.out.println("===결과===");
		
		if(a>b) {
			System.out.println("첫 번째 입력한 값이 더 크다");
		} else if(a<b) {
			System.out.println("두 번째 입력한 값이 더 크다.");
		} else{
			System.out.println("첫 번째와 두 번째 입력한 값이 같다.");
		} 
	}
}

 

숫자 3개 입력받아 평균 점수, 학점 구하기

import java.util.Scanner;


public class Quiz_04 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);



		System.out.print("국 어 : ");
		int num2 = Integer.parseInt(sc.nextLine());

		System.out.print("영 어 : ");
		int num3 = Integer.parseInt(sc.nextLine());

		System.out.print("수 학  : ");
		int num4 = Integer.parseInt(sc.nextLine());
		System.out.println("==================");
		
		
		System.out.print("평 균 :  ");

		double average = (num2+num3+num4)/3.0;
		
//		float average= (num2+num3+num4)/3.0f;
		System.out.print(average);	
		System.out.print("/");
		
		if(90<=average) {
			System.out.println("A");
		} else if(80<=average && average<90) {
			System.out.println("B");
		} else if(70<=average && average<80) {
			System.out.println("C");
		} else if(60<=average && average<70) {
			System.out.println("D");
		} else {
			System.out.println("F");
		}

		
		
	}
}

 

if else문으로 심리테스트 만들어보기

import java.util.Scanner;

public class Homework {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("==================");
		System.out.println("컬러로 보는 성격 심리테스트");
		System.out.println("==================");
		
		System.out.println("좋아하는 컬러를 선택해주세요");
		System.out.println("1. 빨강 2. 노랑 3. 파랑 4. 흰색 5.검정");
		System.out.println(">");
		int color = Integer.parseInt(sc.nextLine());
		
		if(color==1) {
			System.out.println("1. 빨강");
			System.out.println("외향적이고 사교적인 타입이다.");
			System.out.println("감정기복이 심하시져?");
		} else if(color==2) {
			System.out.println("2. 노랑");
			System.out.println("밝고 명랑하며 타인의 이야기를 잘 들어줌.");

		} else if(color==3) {
			System.out.println("3. 파랑");
			System.out.println("냉정하고 보수적인 타입");
		} else if(color==4) {
			System.out.println("4. 흰색");
			System.out.println("순수결정체");
		} else if(color==5) {
			System.out.println("5. 검정");
			System.out.println("고집이 엄청 셈");
		} else {
			System.out.println("입력값이 범위를 벗어났습니다.");
		}
		
	}
}

while문

사용자가 원하는 만큼 명령들을 여러 번 실행하는 구조
특정 조건이 만족되는 동안 명령을 계속적으로 실행

 

 

while문의 문법

식이 참일 경우에만 루프 처리 반복

 

while문을 사용하여 1~10까지 출력

 

초기문

조건문에 사용될 변수를 생성하고 초기값을 지정

 

조건문

실행결과는 true or false, 조건문이 false가 되면 while문 탈출

 

증감문

조건식에 변화를 부여하기 위해 사용되는 수식

 

 

 

100~1까지 출력하는 프로그램 작성

public class Quiz01 {
	public static void main(String[] args) {

		// 100~1까지 출력하는 프로그램 작성
		int count=101;
		while(count-- > 1) { //맨 처음 101>1 비교후 -1
			System.out.println(count); //100
			}
	}
    // 다른 풀이
//	int count = 0;
//	while(count<100) {
//		System.out.println(100-count);
//		count++;
//	}
}

 

1~100까지 10개씩 출력

public class Quiz02 {
	public static void main(String[] args) {
		int count = 1;

		while(count<101) {
			System.out.print(count+" ");
			count++;
			if(count%10==1) {
				System.out.println("");
			}
			
		}

	}
}

while문 안에 if문을 중첩시켜서 풀어야 함

 

(count%10==1) 로 조건을 주어서 나머지가 1일 경우(11,21,31..) 다음줄로 작성

 

 

응용) 1~100까지 20개씩 나눠서 출력하기 

 

 

입력받은 값 만큼 Hello 출력하기

import java.util.Scanner;

public class Quiz03 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("Hello를 몇 번 출력하시겠습니까? : ");
		int num =Integer.parseInt(sc.nextLine()); //입력받은수를 변수 num에 저장
		
		//while문
		int i=0;
		while(i<num) {
			System.out.println(i+" : Hello");
			i++;
		}
		
	}
}

num이 3이면 i가 3보다 작을 때까지 반복 실행

 

 

숫자를 입력받아 홀짝을 구분하는 프로그램을 3번 반복

 

import java.util.Scanner;

public class Quiz04 {
	public static void main(String[] args) {
		// ctrl+a+i 정렬
		// 숫자를 입력받아 홀짝을 구분하는 프로그램을 3번 반복해보세요.
		
		Scanner sc = new Scanner(System.in);
		
		int i=0;
		while(i<3) {
			System.out.print("1~100사이 입력 : ");
			int num = Integer.parseInt(sc.nextLine());
			if(1<=num && num<=100) {
				if(num%2==0) {
					System.out.println("입력한 수는 짝수입니다.");
				} else {
					System.out.println("입력한 수는 홀수입니다.");
				}
			}else {
				System.out.println("1~100사이의 수가 아닙니다.");
			}
			i++;
		}



	}
}

 

 

사용자가 선택한 구구단을 출력

import java.util.Scanner;

public class Quiz05 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("===구구단 출력 프로그램===");
		System.out.print("1~9단 중 선택 : ");
		
		int num = Integer.parseInt(sc.nextLine());
		
		int i=1;
		while(i<10) {
			System.out.println(num +"*"+i+ " = "+i*num);
			i++;
		}
	}
}

> 1~9 범위 벗어났을때 경우 생각 못함

 

 

+ 2~9단 출력 프로그램

 

import java.util.Scanner;

public class Quiz05 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("===구구단 출력 프로그램===");
		System.out.print("2~9단 중 선택 : ");
		
		int dan = Integer.parseInt(sc.nextLine());
		
		if(2<=dan && dan<=9) {
        	int i=1;///////////////
			while(i<10) {
			System.out.println(dan+"*"+i+"="+ (dan*i));
			i++;
			}
		} else {
			System.out.println("범위를 벗어났습니다.");
		}
	}
}

> 먼저 if else문으로 범위를 나눠준뒤에 if 문 내에서 while문 작성

 

 


source code를 평가하는 기준 中

가독성: 소스코드가 얼마나 읽기 편한가?

while문은 수직 구조임 중첩되는 순간 소스코드가 지저분해짐 - > 가독성이 떨어짐

 

for문이 while문에 비해 가독성이 높음

 


for문

초기, 조건, 증감문을 한번에 선언가능
가장 보편적인 반복문으로 가독성이 높음

 

 

for문의 문법

초기, 조건, 증감문은 일부 또는 전부를 생략 가능

 

 

[for문을 사용하여 1~10까지 출력] 실행순서

변수 생성은 해줘야 함!

 

 

반복문의 흐름제어

break문

자신이 속해있는 반복문을 깨버리는 역할
여러 개의 루프가 중첩된 경우 현재 위치한 루프 하나만 탈출

 

- break문이 실행되면, 해당 반복문의 나머지 부분은 무시되고 다음 문장으로 실행 흐름이 이동

 

 

break문 실습

 

 

이중 for문에서 ext

break나가는 위치 바꾸기

 

continue문

반복도중 처리를 중단하고 반복문의 시작 위치로 이동
정밀한 제어 구조를 만들 때 사용

 

- 특정 반복을 건너뛰고 진행하고자 할 때 사용

 

 

continue문 예시

i가 5일때 해당 반복을 건너뛰고 다음 반복을 수행

 

 

 

continue문 , break문 실습4

 

 

 

while문으로 바꿨을경우

public class Quiz_03 {
	public static void main(String[] ar) {
		int i=1;
		while(i<=10) {
			
			if(i==2 || i==5) {
            	i++; //이 식이 없으면 i가 2일때 +1이 안되니까 계속 i가 2일일 때 이 반복문이 계속 돈다.
				// 코드는 위에서 아래로 실행되니까 continue문보다 아래에 있으면 i++이 실행이 안된다.
                continue;
			}
			if(i==8) {
				break;
			}
			System.out.println("i="+i);
			i++;
			
		}
        System.out.println("i="+i); //여기서 i는 8이 나옴 ! 
		
	}
}

 

 

 

 

 

 

무한루프

반복 횟수가 미리 정해져 있지 않고 무한히 반복되는 루프 

 

 

무한 루프 생성 코드

 

무한루프 실습

0 입력시 무한루프 빠져나옴

 

 

 

다중루프

두 개 이상의 루프가 겹쳐져 있는 제어구조
이중 루프가 보편적으로 많이 사용됨

 

 

 

 

 

 

ATM 시뮬레이터 만들기 실습

import java.util.Scanner;

public class Quiz06 {
	public static void main(String[] args) {
		int a =3000;//잔액

		
		while(true) {

			Scanner sc = new Scanner(System.in);
			System.out.println("***ATM 시뮬레이터***");
			System.out.println("1. 잔액조회");
			System.out.println("2. 입금하기");
			System.out.println("3. 출금하기");
			System.out.println("4. 종료하기");
			System.out.print(">>");
			int num = Integer.parseInt(sc.nextLine());
		
			if(num == 1) {
				System.out.println("현재 보유 잔액은 " + a +"입니다." );
				
			} else if(num ==2) {
				System.out.println("얼마를 입금하시겠습니까?");
				int b = Integer.parseInt(sc.nextLine());
				System.out.println(b +" 원이 입금되었습니다");
				a += b;
				
			} else if(num ==3) {
				System.out.println("얼마를 출금하시겠습니까?");
				int b = Integer.parseInt(sc.nextLine());
				System.out.println(b +" 원이 출금되었습니다. ");
				a -= b;
				
			} else {
				System.out.println("거래가 종료되었습니다.");
				System.exit(0);
			}
			
		}

		
		
	}


}

 

System.exit(0);

프로그램을 종료하는 메서드

 

 

 

자판기 시뮬레이터 만들기

import java.util.Scanner;

public class Quiz07 {
	public static void main(String[] args) {
	      Scanner sc = new Scanner(System.in);
	      int coin=3000;
	      int drink1=0;
	      int drink2=0;
	      int drink3=0;
	      
	      int drink1_price= 1200;
	      int drink2_price = 800;
	      int drink3_price = 1500;
	      
	      while(true) {
		      System.out.println("====자판기 시뮬레이터====");
		      System.out.println("1. 콜라(1200) 2. 사이다(800) 3. 매실차(1500) [0.소지품확인]");
		      System.out.print(">>");
		      int menu = Integer.parseInt(sc.nextLine());

		      System.out.println("====나의 소지품====");
		      System.out.println("1. 콜라(1200) 2. 사이다(800) 3. 매실차(1500) [0.소지품확인]");
		      if(menu==0) {
		    	  System.out.println("소지금 : " + coin);
		    	  System.out.println("콜라 :" + drink1);
		    	  System.out.println("사이다 : " + drink2 );
		    	  System.out.println("매실차 : " + drink3);
		    	  
		      } else if(menu==1) {

		    	  if(coin>drink1_price) {
			    	  System.out.println("콜라를 구매했습니다.");
			    	  System.out.println("콜라 +1");
			    	  System.out.println("소지금 " + -(drink1_price));
			    	  coin = coin - drink1_price;
			    	  drink1++;
		    	  }else{
		    		  System.out.println("잔액이 부족합니다. ");
	
		    	  }
		    	  
		      } else if(menu==2) {

		    	  if(coin>drink2_price) {
			    	  System.out.println("사이다를 구매했습니다.");
			    	  System.out.println("사이다 +1");
			    	  System.out.println("소지금 " + -(drink2_price));
			    	  coin = coin - drink2_price;
			    	  drink2++;
		    	  }else {
			    	  System.out.println("잔액이 부족합니다. ");
		    		  System.out.println("현재 소지금 :" + coin);
		    	  }
	
		      } else if(menu==3) {

		    	  if(coin>drink3_price) {
			    	  System.out.println("매실차를 구매했습니다.");
			    	  System.out.println("매실차 +1");
			    	  System.out.println("소지금 " + -(drink3_price));
			    	  coin = coin - drink3_price;
			    	  drink3++;
		    	  } else {
		    		  System.out.println("잔액이부족합니다.");
		    		  System.out.println("현재 소지금 :" + coin);
		    	  }

		      } else {
		    	  System.out.println("메뉴에 없는 보기를 선택하심");
		      }
	      
	}    
	}
}

 

 

Switch문

하나의 변수값에 따라 개별적인 처리가 가능한 다중 선택문
전체적인 메뉴 구성 시 보편적으로 사용

 

switch문의 문법

> 변수 자리에 true/false가 들어갈 수 없음

> default에는 위의 case 중 어느 것과도 일치하지 않을 때 실행되는 코드임

 

 

switch문 실습

 

 


참고)

7행 fruits에는 입력한 값이 들어가는 것이 아니라 입력한 값의 주소가 들어감  (참조형)

 

 

문자 하나 하나를 비교하려면  equls를 사용해야 함. 

 

따라서 , String type 데이터간의 비교는 equals를 사용함.

 

 


계산기 프로그램 실습

import java.util.Scanner;

public class Quiz08 {
	public static void main(String[] args) throws Exception{
		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.println("===계산기 프로그램===");
			System.out.print("연산자 입력(+,-,*,/) : ");
			String operator = sc.nextLine();
			
		    if(operator.equals("q")) {
			System.out.println("프로그램 종료");
			System.exit(0);  
		    } else if(operator.equals("+")||operator.equals("-")||
		    		operator.equals("*")||operator.equals("/")) {
				System.out.println("첫 번째 숫자 입력 : ");
			    int num1 = Integer.parseInt(sc.nextLine());
				System.out.println("두 번째 숫자 입력 : ");
			    int num2 = Integer.parseInt(sc.nextLine());
			    double result=0;
			    
			    switch(operator) {
			    case "+":
			    	result = num1+num2;
			    	System.out.println(num1 + "+" + num2+"="+(num1+num2));
			    	break;
			    
			    case "-":
			    	result = num1-num2;
			    	System.out.println(num1 + "-" + num2+"="+(num1-num2));
			    	break;
			    case "*":
			    	result = num1*num2;
			    	System.out.println(num1 + "*" + num2+"="+(num1*num2));
			    	break;
			    case "/":
			    	result = (double)num1/num2;
			    	System.out.println(num1 + "/" + num2+"="+((double)num1/num2));
			    	break;
			    	
			}	
			}else {
				System.out.println("연산자를 다시 확인해주세요.");
		    }
		    
		}
	}
}

주의) 사용자가 입력한 값이 q일 경우에 바로 종료시켜야 하기 때문에 코드 위치가 위쪽에 위치해야한다.

 

 

 

 

 

실습

import java.util.Scanner;

public class Quiz03 {
   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int count =0;
      int bestCount = 10;
      // 가장 적은 시도횟수를 기록하는 데 사용됨
      // 초기값을 10으로 준이유는 게임을 플레이하느데 드는 최대 시도 횟수임
      // 즉, 이 시도 횟수보다 더 적은 횟술 답을 맞출 때마다 bestCount가 업데이트됨
      while(true) {
         System.out.println("==Up&Down Game==");
         System.out.println("1. Game Start");
         System.out.println("2. Game Score");
         System.out.println("3. End Game");
         System.out.print(">");
         
         
         int num = Integer.parseInt(sc.nextLine());
         int computer = (int)(Math.random()*(10-1+1)+1);
         

         
         switch(num) {
         case 1:
            count=0; //count값이 0부터 다시 셀 수 있게 0으로 초기화!
            System.out.println("<<Game Start>>");
            while(true) {

               System.out.print("Input player : ");
               int player = Integer.parseInt(sc.nextLine());

               if(1<=player && player<=10) {
                  count++;
                  if(player==computer) {
                     System.out.println("정답입니다.");
                     break; // 지금 속해있는 반복문 탈출하고 
                  } else if(player>computer) {
                     System.out.println("down");
                  } else {
                     System.out.println("up");
                  }
                  

               }else {
                  System.out.println("범위를 초과하였습니다.");
               } 
            }
            break;

         case 2:
            if(bestCount > count) {
               bestCount=count;
            }
            
            System.out.println( count+"번 만에 정답을 맞췄습니다.");
            System.out.println("최고 기록은 :" + bestCount + "입니다. ");
            break;
         case 3:
            System.out.println("게임을 종료합니다.");
            System.exit(0);
         }
      }


   }
}