첫 주차의 마지막 날이다. 실습만 6시간은 한 것 같았는데, 맨날 5~6줄짜리 코드만 짜던 내가! 66줄 정도를 만드는 것을 보고 교육의 필요성을 다시 한번 느꼈다.
for
- 반복문 실습 문제
break
continue
- 무한루프
- 선택 분기문
switch
- 객체의 값과 객체의 주소
while
과 for
은 완벽하게 상호 대치가 된다. 그렇다면 같은 기능을 왜 2개씩이나 알아야 할까?
기존에 사용하던
while
은 흐름이 복잡해면 가독성이 떨어져 단일루프일 경우 사용하기 용이하다. 이런 문제를 해결하기 위해(조건식)
안에 초기, 조건, 증감을 모두 사용하는 것이for
이다.
for
다음과 같이 사용한다.
for(int i=0; i<10; i++) {
System.out.println(i);
}
위 코드의 실행 과정은 초기 → 조건 → 실행 → 증감 → 조건 → 실행 → 증감
동작하다 조건의 값이 false
일 시 증감 후, 조건식에서 루프를 탈출한다.
해당 문법들은 정밀한 흐름을 만들 때 사용된다. 반복문의 예외처리라고 생각하는 것이 좋다.
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
.
반복문을 사용할 때, 반복횟수를 정하기 애매한 경우들이 있다. 사실 프로그램의 대부분은 무한루프로 사용되고 있다. 그래서 우리가 사용하는 프로그램이 자동으로 꺼지지 않고 특정 상황이나, 입력이 있을 때 종료될 수 있도록 무한루프를 사용한다.
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);
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
를 탈출한다.
나중에 클래스 개념을 배울 때, 더 짚고 넘어가겠지만 ==
연산자와 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");
}
제어문을 이해하기 위하여 다음 3가지를 예제만 받아서 구현하는 실습을 진행하였다.
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();
}
}
}
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;
}
}
}
}
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;
}
}
}
}