while문 : 끝을 알 수 없을 때, 끝없는 반복
데몬(데미안) - 컴퓨터관점이 아닌 일반적인 관점
: 내가 계속 켜져있을테니까 네가 필요하면 가져가(선풍기, 형광등 등)
for문 : 끝이 정해져 있을 때, 시간이 정해진 반복(전자레인지)
while문 형식
while(조건문) {
조건이 true이면 돌아가는 내용
}
package ex06;
import java.util.Scanner;
public class WhileEx01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
int num = sc.nextInt();
System.out.println("사용자 입력 : " + num);
if(num == 0) {
break;
}
}
}
}
Scanner sc = new Scanner(System.in);
이 문장은 신경쓰지 말기!
scanner : 사용자의 입력, 사용자의 키보드 입력을 받는 라이브러리
만약 조건문에 true를 넣게 되면
프로그램은 무한히 돌아가게 되고
Ctrl + C를 눌러야 빠져나올 수 있다.
반복문을 빠져나가는 키워드 : break
true를 넣은 while문을 무한 반복하다가
0의 값을 입력하면 종료가 되는 조건문을 넣어주었다.
scanner 라이브러리는 기본적으로 제공되는 라이브러리가 아니라서
외부에서 찾아 호출해주어야 한다.
호출을 해줄 때 import를 사용한다.
거실에 있는 선풍기를 내 방에 가지고 오는 것 : import
어느 방에 클래스가 있는지 모르니까 알아서 자동으로 데려와주는 것,
자동 import 매직키가 있다.
빨간 줄 밑에서 Alt + Shift + O
무한루프에서 break를 쓰지 않고 탈출할 수 있는 방법이 있을까?
while문은 한번 반복을 할 때마다 조건문을 매번 검사한다.
(조건문이 false일 때까지)
1. 알고리즘 : 순서대로 실행되는 로직
2. 코드를 가독성 있게 작성
-> 리팩토링(코드를 눈에 보기 편하게 깔끔하게 가독성 있게 일관성 있게 다시 작성)
3. 분석 -> 패턴이 보이면 단순화(과정) -> 리팩토링
∴ 완벽한 알고리즘
남은 동전 구하기 게임 프로그램을 만들어보자.
package ex06;
public class WhileEx03 {
public static void main(String[] args) {
// 남은 동전 구하기 게임 (500, 100, 50, 10)
int money = 2680; // 500*5, 100*1, 50*1, 10*3
int restMoney = money;
// 1. 500원 동전 구하기
System.out.println(restMoney / 500 + "개");
restMoney = restMoney % 500; // 180원
// 2. 100원 동전 구하기
System.out.println(restMoney / 100 + "개");
restMoney = restMoney % 100; // 80원
// 3. 50원 동전 구하기
System.out.println(restMoney / 50 + "개");
restMoney = restMoney % 50; // 30원
// 4. 10원 동전 구하기
System.out.println(restMoney / 10 + "개");
restMoney = restMoney % 10; // 0원
}
}
이 코드에서 일정한 패턴이 보일 것이다.
package ex06;
public class WhileEx03 {
public static void main(String[] args) {
// 남은 동전 구하기 게임(500, 100, 50, 10)
int money = 2680; // 500*5, 100*1, 50*1, 10*3
int restMoney = money;
int coin;
// 1. 500원 동전 구하기
coin = 500;
System.out.println(coin + "원 : " + restMoney / coin + "개");
restMoney = restMoney % coin; // 남은 돈 180원
// 2. 100원 동전 구하기
coin = 100;
System.out.println(coin + "원 : " + restMoney / coin + "개");
restMoney = restMoney % coin; // 남은 돈 80원
// 3. 50원 동전 구하기
coin = 50;
System.out.println(coin + "원 : " + restMoney / coin + "개");
restMoney = restMoney % coin; // 남은 돈 30원
// 4. 10원 동전 구하기
coin = 10;
System.out.println(coin + "원 : " + restMoney / coin + "개");
restMoney = restMoney % coin; // 남은 돈 0원
}
}
패턴 정리가 끝났으니 반복문으로 간결화해주자.
package ex06;
import java.util.Scanner;
public class WhileEx04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int money = 2680;
int restMoney = money;
while (true) {
int coin = sc.nextInt(); // 500, 100, 50, 10
// 남은 동전 출력하는 로직
System.out.println(coin + "원 : " + restMoney / coin + "개");
restMoney = restMoney % coin;
// if문 break;
if (coin == 10) {
break;
}
}
}
}
패턴을 발견해 while문으로 반복문을 만들어 코드를 간결화시켰다.
사용자가 10원을 입력하면 프로그램이 종료되게 설계되었다.
* while 반복문 예제 *
변수 n을 이용해서 1부터 10까지 출력해보자.
package ex06;
public class WhileEx05 {
public static void main(String[] args) {
int n = 1;
// 변수 n을 이용해서 1부터 10까지 출력하시오.
// 출력이 끝나면 break 문으로 빠져나오시오.
while (true) {
System.out.println(n);
n = n + 1;
if (n > 10) {
break;
}
}
}
}
break 조건문이 while문의 위쪽에 있는 게 좋을까, 아래쪽에 있는게 좋을까?
위쪽에 있을 때는 반복문을 총 3번 반복되고,
아래쪽에 있는 반복문은 총 2번 반복된다.
따라서 아래쪽에 조건문을 두는 것이 좋은 로직이다.
크게 상관은 없음!
1부터 10까지 중 2의 배수만 출력해보자.
package ex06;
public class WhileEx05 {
public static void main(String[] args) {
int n = 1;
// 변수 n을 이용해서 1부터 10까지 중 2의 배수만 출력하시오.
// 출력이 끝나면 break 문으로 빠져나오시오.
while (true) {
if (n % 2 == 0) {
System.out.println(n);
}
n = n + 1;
if (n > 10) {
break;
}
}
}
}
for문 : 일정한 횟수만큼 반복할 때 유용하게 사용
n++는 n = n + 1과 같은 말이다.
for(int n = 1; n < 11; n++) {
자바에서 가장 특이한 조건식
(변수 초기화, 조건식, 증감)
}
다른 반복문 구조, 같은 결과
for문 ∧ while문 ∨
int i =1 ;
while(i < 11) {
i = i + 1;
}
몇 번 반복해야 할지 알고 있을 때는 무조건 for문 쓰는 것이
간결하고 알아보기 쉽다.
while문은 반복문 앞에 변수를 초기화했었는데
for문은 괄호 안에서 변수를 초기화할 수 있다.
3의 배수 출력하기
package ex06;
public class ForEx01 {
public static void main(String[] args) {
for (int n = 1; n < 100; n++) {
if (n % 3 == 0) {
System.out.println(n);
}
}
} // 메인 끝
}
2의 24승 출력하기
package ex06;
public class ForEx02 {
public static void main(String[] args) {
int num = 1;
for (int i = 1; i < 25; i++) {
num = num * 2;
}
System.out.println(num);
}
}
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9