Day 5. 자바 반복문 정리 ( for문 )

ho_c·2022년 2월 20일
0

국비교육

목록 보기
5/71
post-thumbnail

첫 주차의 마지막 날이다. 실습만 6시간은 한 것 같았는데, 맨날 5~6줄짜리 코드만 짜던 내가! 66줄 정도를 만드는 것을 보고 교육의 필요성을 다시 한번 느꼈다.

📝 목차

  1. for
  2. 반복문 실습 문제
  3. break continue
  4. 무한루프
  5. 선택 분기문 switch
  6. 객체의 값과 객체의 주소

1. for

whilefor은 완벽하게 상호 대치가 된다. 그렇다면 같은 기능을 왜 2개씩이나 알아야 할까?

기존에 사용하던 while은 흐름이 복잡해면 가독성이 떨어져 단일루프일 경우 사용하기 용이하다. 이런 문제를 해결하기 위해 (조건식)안에 초기, 조건, 증감을 모두 사용하는 것이 for 이다.

for 다음과 같이 사용한다.

		for(int i=0; i<10; i++) {
			System.out.println(i);
		}

위 코드의 실행 과정은 초기 → 조건 → 실행 → 증감 → 조건 → 실행 → 증감 동작하다 조건의 값이 false 일 시 증감 후, 조건식에서 루프를 탈출한다.


2. break, continue

해당 문법들은 정밀한 흐름을 만들 때 사용된다. 반복문의 예외처리라고 생각하는 것이 좋다.


break;

break;는 반복문을 탈출하는 용도이므로 반복문 안에서만 사용할 수 있다.
주로 if문의 조건과 섞어서 사용해, 반복의 흐름이 break; 에 닿는 순간 자신이 속한 반복 자체를 탈출(종료)한다.

for(int i=0; i<10; i++) {
	System.out.println(i);
	if(i==8) { 
    break; 
    }
}

continue;

이 역시 정밀한 흐름 제어를 위해서 사용된다. 하지만 break;가 반복문을 탈출한다면, continue;는 자신이 속하는 반복문의 끝 {}블록으로 넘어간다.
이로 인해 continue; 이후의 코드는 실행되지 않고 다시 증감식으로 넘어간다. (한 턴을 넘긴다)

for(int i=1; i<=10; i++) {
	if(i==2|| i== 5) {continue;
    }
	System.out.println(i);
	if(i==8) {
    break;
    }
}

다음 코드를 입력하지 말고, 출력값을 예상해보자.

해당 반복문은 어렵지 않지만, 출력문 뒤에 있는 break;를 잘 인지않으면 오답이 나올 수 있다.
정답은 1,3,4,6,7,8.


3. 무한루프

반복문을 사용할 때, 반복횟수를 정하기 애매한 경우들이 있다. 사실 프로그램의 대부분은 무한루프로 사용되고 있다. 그래서 우리가 사용하는 프로그램이 자동으로 꺼지지 않고 특정 상황이나, 입력이 있을 때 종료될 수 있도록 무한루프를 사용한다.

for while 로는 다음과 같이 사용한다.

for(;;) {}
while (true) {}

응용 : 입력되는 값까지 총합

int num = 0;
int sum = 0;
		
while (true) {
	System.out.print("수 입력(0: 종료)");
	num = sc.nextInt();
			
	if (num == 0) {
		break;
		}
	sum += num;
	}
System.out.println("수의 총합 : " +sum);

5. 선택 제어문 swicth

if문처럼 코드의 분기를 만들어서 흐름을 제어한다.
이때, 조건 분기문인 Switch 는 비교 방식이 .equals()이기 때문에 크거나, 작다는 다룰 수 없으며 입력되는 자료형 이 통일되어야 한다.

System.out.println("당신이 좋아하는 과일을 선택하세요.");
System.out.println("1. 사과  2. 딸기   3. 포도");
System.out.print(">>  ");
int menu = Integer.parseInt(sc.nextLine());
		
	switch (menu) {
	case 1:
		System.out.println("사과는  Apple");
		break; //  각각의 경우의 수를 구분해주는 역할
	case 2:
		System.out.println("딸기는 Strawberry");
		break;
	case 3:
		System.out.println("포도는 Grape");
		break;
	default:
		System.out.println("메뉴를 다시 확인하세요.");
		break;

여기서 break는 각각의 case를 나누는 역할을 해준다.
만약 break가 없다면 다음 break가 만날 때까지 모든 case를 다루게 되며, 모든 case의 적용되지 않을 때는 default의 실행문을 실행하고 switch를 탈출한다.


6. 객체의 값과 객체의 주소

나중에 클래스 개념을 배울 때, 더 짚고 넘어가겠지만 == 연산자와 equals()는 차이가 있다.
먼저 ==는 객체의 주소를 비교한다. 따라서 다음 예제를 실행하면 if의 내부가 실행되지 않는다.

		System.out.println("메세지를 입력하세요");
		String msg = sc.nextLine();
		
		if (msg.equals("Hello")) {
			System.out.println("Hi");
		} else if (msg.equals("bye")) {
			System.out.println("Good Bye");
		}

문자열과 문자열의 값 자체를 비교하기 위해서는 String1.equals(String2)를 사용하여 각 String 클래스로 만들어진 인스턴스끼리 비교시켜야 한다.

		if (msg.equals("Hello")) {
			System.out.println("Hi");
		} else if (msg.equals("bye")) {
			System.out.println("Good Bye");
		}

7. 실습 내용

제어문을 이해하기 위하여 다음 3가지를 예제만 받아서 구현하는 실습을 진행하였다.

7-1) 계산기

import java.util.Scanner;

public class Calc {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while (true) {		
			System.out.println("=== 계산기 프로그램 ===");
			System.out.print("연산자 (+, -, *, /)"+" (종료 : q)\n"+"입력>>>>  ");
			String input = sc.nextLine();
			
			// 예외 처리
			if (input.equals("q")) { 	
				// 프로그램 종료
				System.out.println("==================");
				System.out.println(" 프로그램을 종료합니다.");
				// break;
				System.exit(0); // switch문 사용시 이용하면 좋다.
				// 입력 오류
			} else if (!(input.equals("+") || input.equals("-") || input.equals("/") || input.equals("*")) ){
				System.out.println("연산자 입력 오류, 프로그램을 종료합니다.");
				System.out.println();
				continue;
			}
			
			// 숫자 입력
			System.out.print("첫 번째 숫자 입력 : ");
			double num1 = Double.parseDouble(sc.nextLine());
			System.out.print("두 번째 숫자 입력 : ");
			double num2 = Double.parseDouble(sc.nextLine());			
			
			// 연산
			double a = (num1 + num2);
			double b = (num1 - num2);
			double c = (num1 * num2);
			double d = (num1 / num2);
			
			// 결과 출력
			System.out.println("======= 결과 =======");
			
			if (input.equals("+")) {
				System.out.printf("%s + %s = %.2f%n", ""+num1, ""+num2, a);
			} else if (input.equals("-")) {
				System.out.printf("%s - %s = %.2f%n", ""+num1, ""+num2, b);
			} else if (input.equals("*")) {
				System.out.printf("%s * %s = %.2f%n", ""+num1, ""+num2, c);
			} else if (input.equals("/")) {
				System.out.printf("%s / %s = %.2f%n", ""+num1, ""+num2, d);
			} 
			System.out.println();
		}
	}			
}

7-2) ATM

import java.util.Scanner;

public class ATM {

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

		int num1 = 0; // 잔액

		// 실행
		while (true) {
			System.out.println();
			System.out.println("***** ATM 시뮬레이터 *****");
			System.out.println("1. 잔액조회\n"
					+ "2. 입금하기\n"
					+ "3. 출금하기\n"
					+ "4. 종료하기");

			System.out.print(">>> ");
			int pick = input.nextInt();

			if (pick == 1) { // 잔액조회
				System.out.printf("현재 보유 잔액은 %d원입니다.\n", num1);
				continue;			
				
			} else if (pick == 2) { 	// 입금
				System.out.print("얼마를 입금하시겠습니까?\n>>> ");
				int pMy = input.nextInt();
				num1 += pMy;
				System.out.printf("%d원이 입금되었습니다.\n", pMy);
				continue;
				
			} else if (pick == 3) { // 출금

				while (true) {
					System.out.print("얼마를 출금하시겠습니까?\n>>> ");
					int mMy = input.nextInt();
					
					if (mMy>num1) {
						System.out.println("잔액이 부족합니다.");
						continue;
					} else if (mMy == 0) {
						System.out.println("다시 입력하세요");
						continue;
					} else {
						num1 -= mMy;
						System.out.printf("%d원이 출금되었습니다.\n", mMy);
						break;
					} 
				}
				
			} else if (pick == 4) { // 종료
				System.out.println("***** 안녕히 가세요 *****");
				System.exit(0);
				
			} else { // 입력 예외
				System.out.println("숫자를 입력하세요.");
				continue;
			}	
		}
	}
}

7-3) 자판기

import java.util.Scanner;

public class Quiz_08 {

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

		// 변수
		int money = 10000;
		int cola = 0;
		int soda = 0;
		int tea = 0;

		// 가격
		int colaP = 1000;
		int sodaP = 800;
		int teaP = 1500;

		// 안내
		while (true) {
			System.out.println("======= 자판기 시뮬레이터 =======");
			System.out.println("음료수를 선택하세요.");
			System.out.print("1. 콜라(1000) 2. 사이다(800) 3. 매실차(1500) [0. 소지품 확인] [5. 종료]\n>>");
			int pick = Integer.parseInt(input.nextLine());
			
			// 종료
			switch (pick) {
			case 5 :
				System.out.println("종료!");
				System.exit(0);
			}
			
			// 기능
			if (pick == 0) {
				System.out.println("=======소지품 목록=======");			
				System.out.printf("소지금 : %d원\n", money);
				System.out.printf("콜라 : %d개\n", cola);
				System.out.printf("사이다 : %d개\n", soda);
				System.out.printf("매실차 : %d개\n", tea);
				System.out.println("======================\n");	
				
			} else if (pick == 1) {
				if(money >= colaP ) {
					cola++;
					money -= colaP;
					System.out.println("콜라를 구매했습니다.");
					System.out.println("콜라 +1");
					System.out.println("소지금 -1000원");
				} else {
					System.out.println("잔액이 부족합니다.");
					System.out.println();
					continue;
				}
				
			} else if (pick == 2) {
				if(money >= sodaP ) {
					soda++;
					money -= sodaP;
					System.out.println("사이다를 구매했습니다.");
					System.out.println("사이다 +1");
					System.out.println("소지금 -800원");
				} else {
					System.out.println("잔액이 부족합니다.");
					System.out.println();
					continue;
				}

			} else if (pick == 3) {
				if(money >= teaP ) {
					tea++;
					money -= teaP;
					System.out.println("매실차를 구매했습니다.");
					System.out.println("매실차 +1");
					System.out.println("소지금 -1500원");
				} else {
					System.out.println("잔액이 부족합니다.");
					System.out.println();
					continue;
				}
			} else {
				System.out.println("다시 입력하세요");
				continue;
			}
		}
	}	
}

profile
기록을 쌓아갑니다.

0개의 댓글