반응형
2. 반복문 - for, while, do-while
2.1 for
for (초기화; 조건식; 증감식) {
// 조건식이 참일 때 수행될 문장
}
2.1.1 별 찍기 - 왼쪽 정렬
public class _09_Star {
public static void main(String[] args) {
for(int i=1; i<=5; i++) {
for (int j=0; j<i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
// 결과
*
**
***
****
*****
2.1.2 별 찍기 - 오른쪽 정렬
public class _10_RightStar {
public static void main(String[] args) {
for(int i=1;i<6;i++) {
for(int j=0;j<5-i;j++) {
System.out.print(" ");
}
for(int k=0;k<i;k++) {
System.out.print("*");
}
System.out.println();
}
}
}
// i : 줄, j : 공백, k : 별
// 결과
*
**
***
****
*****
2.1.3 별 찍기 - 중앙 정렬
public class _11_MidStar {
public static void main(String[] args) {
int m = 10;
for(int i=1;i<=m;i++) {
for (int j=0;j<m-i;j++) {
System.out.print(" ");
}
for (int k=0;k<2*i-1;k++) {
System.out.print("*");
}
System.out.println();
}
}
}
// i 줄, j 공백, k 별
//00000*00000
//0000***0000
//000*****000
//00*******00
//0*********0
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
2.1.4 하트 찍기
public class _12_Heart {
public static void main(String[] args) {
for(int m=0;m<2;m++) {
for(int i=0;i<6;i++) {
System.out.print(" ");
}
for(int j=0;j<3;j++) {
System.out.print("*");
}
}
System.out.println();
for(int a=0; a<3; a++) {
for(int b=0;b<5-a;b++) {
System.out.print(" ");
}
System.out.print("*");
for(int c=0;c<2*a+3;c++) {
System.out.print(" ");
}
System.out.print("*");
for(int d=0;d<4-2*a;d++) {
System.out.print(" ");
}
System.out.print("*");
for(int c=0;c<2*a+3;c++) {
System.out.print(" ");
}
System.out.print("*");
System.out.println();
}
for(int a=0; a<9; a++) {
for(int b=0;b<a+3;b++) {
System.out.print(" ");
}
System.out.print("*");
for(int c=0;c<16-a*2;c++) {
System.out.print(" ");
}
System.out.println("*");
}
}
}
// 결과
*** ***
* * * *
* * * *
* ** *
* *
* *
* *
* *
* *
* *
* *
* *
**
2.1.5 구구단 만들기
public class _13_9x9 {
public static void main(String[] args) {
for (int i=1;i<=9;i++) {
for (int j=1;j<=9;j++) {
System.out.printf("%d x %d = %d", i, j, i*j);
System.out.println();
}
}
}
}
// 결과
1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
1 x 4 = 4
.
.
.
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81
2.1.6 foreach
for( 타입 변수명 : 배열 또는 컬렉션) {
// 반복할 문장
}
public class _14_ForEach {
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40, 50};
int sum = 0;
for (int tmp :
arr) {
System.out.printf("%d ", tmp);
sum += tmp;
}
System.out.println();
System.out.println("sum = " + sum);
}
}
// 결과
10 20 30 40 50
sum = 150
2.2 while
while (조건식) {
// 조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.
}
- for문과 while문 비교
for(int i = 1; i <= 10; i++) {
System.out.println(i);
}
int i = 1;
while(i <= 10) {
System.out.println(i);
i++;
}
→ for문은 초기화, 조건식, 증감식을 한 곳에 모아 놓은 것, while문과 다르지 않다.
→ 따라서 for문과 while문은 항상 서로 변환이 가능
만일 초기화나 증감식이 필요하지 않은 경우라면, while문이 더 적합하고 그렇지 않을 경우엔 for문이 더 적합
- [예제] while 문 연산(후위형) i--
public class _15_WhileEx1 {
public static void main(String[] args) {
int i = 5;
while (i--!=0) {
System.out.println(i + " - I can do it.");
}
}
}
// 결과
4 - I can do it.
3 - I can do it.
2 - I can do it.
1 - I can do it.
0 - I can do it.
- [예제] while 문 연산(전위형) --i
public class _16_WhileEx2 {
public static void main(String[] args) {
int i = 5;
while (--i!=0) {
System.out.println(i + " - I can do it.");
}
}
}
// 결과
4 - I can do it.
3 - I can do it.
2 - I can do it.
1 - I can do it.
- [예제] 사용자로부터 숫자를 입력받고, 이 숫자의 각 자리의 합을 구하는 예제
import java.util.Scanner;
public class _17_SumOfNumber {
public static void main(String[] args) {
int num = 0, sum = 0;
System.out.print("숫자를 입력하세요 ex. 12345 >> ");
Scanner scanner = new Scanner(System.in);
String tmp = scanner.nextLine();
num = Integer.parseInt(tmp);
while (num != 0) {
// num을 10으로 나눈 나머지를 sum에 더함
sum += num % 10; // sum = sum + num % 10;
System.out.printf("sum = %3d num = %d\n", sum, num);
num /= 10; // num = num / 10; num을 10으로 나눈 값을 다시 num에 저장
}
System.out.println("입력하신 숫자의 각 자리수 합계는 " + sum + "입니다.");
}
}
// 결과
숫자를 입력하세요 ex. 12345 >> 51313
sum = 3 num = 51313
sum = 4 num = 5131
sum = 7 num = 513
sum = 8 num = 51
sum = 13 num = 5
입력하신 숫자의 각 자리수 합계는 13입니다.
- [예제] 1부터 입력받은 숫자까지의 합계
import java.util.Scanner;
public class _19_SumOfRange {
public static void main(String[] args) {
int num = 0, sum = 0;
System.out.print("숫자를 선택하세요 >> ");
Scanner scanner = new Scanner(System.in);
String tmp = scanner.nextLine();
num = Integer.parseInt(tmp);
for (int i = 0 ; i <= num ; i++) {
sum += i;
}
System.out.println("0부터 " + num + "까지의 합계는 " + sum + "입니다.");
}
}
// 결과
숫자를 선택하세요 >> 100
0부터 100까지의 합계는 5050입니다.
- [예제] i를 1씩 증가시켜서 합계 구하기(누적합계 100 넘지 않음)
public class _20_SumOfRange2 {
public static void main(String[] args) {
int sum = 0, i = 0;
// i를 1씩 증가시켜서 sum에 더한다.
while ((sum += ++i) < 100) {
System.out.printf("%d - %d%n", i, sum);
}
}
}
1 - 1
2 - 3
3 - 6
4 - 10
5 - 15
6 - 21
7 - 28
8 - 36
9 - 45
10 - 55
11 - 66
12 - 78
13 - 91
- [예제] 사용자로부터 반복해서 숫자 입력 받고 0을 입력 시 총합을 출력하는 예시
import java.util.Scanner;
public class _21_SumEx {
public static void main(String[] args) {
int num;
int sum = 0;
boolean flag = true;
Scanner scanner = new Scanner(System.in);
System.out.println("합계를 구할 숫자를 입력하시오. (끝내려면 0을 입력)");
while(flag) {
System.out.print(">>");
String tmp = scanner.nextLine();
num = Integer.parseInt(tmp);
if (num!=0) {
sum += num;
} else {
flag = false;
}
}
System.out.println("합계 : " + sum);
}
}
합계를 구할 숫자를 입력하시오. (끝내려면 0을 입력)
>>1
>>2
>>3
>>4
>>5
>>0
합계 : 15
2.3 do-while
do {
// 조건식의 연산결과가 참일 때 수행될 문장들을 적는다.
} while (조건식); // <- 끝에 ';'을 잊지 않도록 주의
→ 많이 쓰이진 않지만 반복적으로 사용자의 입력을 받아서 처리할 때 유용하다.
- [예제] Math.random()을 이용해서 1과 100사이의 임의의 수를 변수 answer에 저장하고 이 값을 맞추기
import java.util.Scanner;
public class _22_DoWhileEx {
public static void main(String[] args) {
int input = 0, answer = 0;
answer = (int)(Math.random() * 100) + 1; // 1 ~ 100 사이의 임의의 수
Scanner scanner = new Scanner(System.in);
do {
System.out.print("1 과 100 사이의 임의의 정수를 입력하세요 >> ");
input = scanner.nextInt();
if (input > answer) {
System.out.println("down");
} else if (input < answer) {
System.out.println("up");
}
} while (input != answer);
System.out.print("짝짝짝! 정답입니다!");
}
}
// 결과
1 과 100 사이의 임의의 정수를 입력하세요 >> 50
up
1 과 100 사이의 임의의 정수를 입력하세요 >> 75
up
1 과 100 사이의 임의의 정수를 입력하세요 >> 88
down
1 과 100 사이의 임의의 정수를 입력하세요 >> 82
up
1 과 100 사이의 임의의 정수를 입력하세요 >> 85
up
1 과 100 사이의 임의의 정수를 입력하세요 >> 87
down
1 과 100 사이의 임의의 정수를 입력하세요 >> 86
짝짝짝! 정답입니다!
- [예제] 369 게임 만들기
import java.util.Scanner;
public class _23_369Game {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("1부터 10000 사이의 정수를 입력하세요.");
String num = sc.next();
int length = num.length();
int temp = 0;
String answer = "";
int number = Integer.parseInt(num);
while (length > 0) {
if (length == 1) {
temp = number % 10;
if (temp == 3 || temp == 6 || temp == 9) {
answer += "짝";
}
length--;
} else {
temp = (int) (number / (Math.pow(10, length - 1)));
// number를 10^length 만큼으로 나눈 것
if (temp == 3 || temp == 6 || temp == 9) {
answer += "짝";
}
number = (int) (number - (temp * (Math.pow(10, length - 1))));
length--;
}
}
System.out.println(answer);
}
}
1부터 10000 사이의 정수를 입력하세요.
3
짝
1부터 10000 사이의 정수를 입력하세요.
44
1부터 10000 사이의 정수를 입력하세요.
36
짝짝
1부터 10000 사이의 정수를 입력하세요.
336
짝짝짝
1부터 10000 사이의 정수를 입력하세요.
6993
짝짝짝짝
2.4 break
- break 문은 자신이 포함된 가장 가까운 반복문을 벗어난다. 주로 if 문과 함께 사용되어 특정 조건을 만족하면 반복문을 벗어나도록 한다.
public class _25_Break {
public static void main(String[] args) {
int sum = 0;
int i = 0;
while (true) {
if (sum > 5049)
break;
++i;
sum += i;
}
System.out.println("i=" + i);
System.out.println("sum=" + sum);
}
}
// 결과
i=100
sum=5050
2.5 continue
- continue 문은 반복문 내에서만 사용될 수 있으며, 반복이 진행되는 도중에 continue 문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. for 문의 경우 증감식으로 이동하며, while 문과 do-while 문의 경우 조건식으로 이동한다.
- continue 문은 반복문 전체를 벗어나지 않고 다음 반복을 계속 수행한다는 점이 break 문과 다르다. 주로 if문과 함께 사용되어 특정 조건을 만족하는 경우에 continue 문 이후의 문장들을 수행하지 않고 다음 반복으로 넘어가서 계속 진행한다.
public class _26_Continue {
public static void main(String[] args) {
for (int i = 0; i <= 10; i++) {
if (i % 3 == 0)
continue;
System.out.println(i);
}
}
}
// 결과
1
2
4
5
7
8
10
- [예제] 메뉴를 보여주고 선택
import java.util.Scanner;
public class _27_SelectMenu {
public static void main(String[] args) {
int menu = 0;
int num = 0;
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("(1) square");
System.out.println("(2) square root");
System.out.println("(3) log");
System.out.print("원하는 메뉴(1~3)를 선택하세요. (종료:0) >> ");
String tmp = sc.nextLine();
menu = Integer.parseInt(tmp);
if (menu == 0) {
System.out.println("프로그램을 종료합니다.");
break;
} else if (menu > 3 || menu < 1) {
System.out.println("메뉴를 잘못 선택하셨습니다. (종료는 0)");
continue;
}
System.out.println("선택하신 메뉴는 " + menu + "번입니다.");
}
}
}
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요. (종료:0) >> 1
선택하신 메뉴는 1번입니다.
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요. (종료:0) >> 2
선택하신 메뉴는 2번입니다.
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요. (종료:0) >> 3
선택하신 메뉴는 3번입니다.
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요. (종료:0) >> 4
메뉴를 잘못 선택하셨습니다. (종료는 0)
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요. (종료:0) >> 0
프로그램을 종료합니다.
2.6 이름 붙은 반복문
- break 문
→ 근접한 단 하나의 반복문만 벗어날 수 있음
→ 여러 개의 반복문이 중첩된 경우에는 break 문으로 중첩 반복문을 완전히 벗어날 수 없음
→ 중첩 반복문 앞에 이름을 붙이고 break 문과 continue 문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 건너뛸 수 있음
public class _28_NamedLoop {
public static void main(String[] args) {
Loop1 : for (int i = 2; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
if (j == 5)
break Loop1;
System.out.println(
i + "*" + j + "=" + i * j);
}
System.out.println();
}
}
}
// break Loop1; 결과
2*1=2
2*2=4
2*3=6
2*4=8
public class _28_NamedLoop {
public static void main(String[] args) {
Loop1 : for (int i = 2; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
if (j == 5)
break;
System.out.println(
i + "*" + j + "=" + i * j);
}
System.out.println();
}
}
}
// break; 결과
2*1=2
2*2=4
2*3=6
2*4=8
3*1=3
3*2=6
﹕
8*3=24
8*4=32
9*1=9
9*2=18
9*3=27
9*4=36
public class _28_NamedLoop {
public static void main(String[] args) {
Loop1 : for (int i = 2; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
if (j == 5)
continue Loop1;
System.out.println(
i + "*" + j + "=" + i * j);
}
System.out.println();
}
}
}
// continue Loop1; 결과(break와 달리 줄바꿈이 없음)
2*1=2
2*2=4
2*3=6
2*4=8
3*1=3
3*2=6
﹕
8*3=24
8*4=32
9*1=9
9*2=18
9*3=27
9*4=36
public class _28_NamedLoop {
public static void main(String[] args) {
Loop1 : for (int i = 2; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
if (j == 5)
continue;
System.out.println(
i + "*" + j + "=" + i * j);
}
System.out.println();
}
}
}
// continue; 결과
2*1=2
2*2=4
2*3=6
2*4=8
2*6=12
2*7=14
2*8=16
2*9=18
﹕
9*4=36
9*6=54
9*7=63
9*8=72
9*9=81
- [예제] 메뉴를 고르고 값을 계산하는 계산기 만들기
//내가 작성한 오답
import java.util.Scanner;
public class _Calculator { // 틀렸지만 열심히 만들어서 남겨둠
public static void main(String[] args) {
Scanner sc1 = new Scanner(System.in);
Scanner sc2 = new Scanner(System.in);
int menu = 0;
int number = 0;
Loop1 : while (true) {
System.out.println("(1) square");
System.out.println("(2) square root");
System.out.println("(3) log");
System.out.print("원하는 메뉴(1~3)를 선택하세요. (종료:0) >>");
String tmp1 = sc1.nextLine();
System.out.print("계산할 값을 입력하세요. (계산 종료:0. 전체 종료:99) >> ");
String tmp2 = sc2.nextLine();
menu = Integer.parseInt(tmp1);
while (!(menu>=1 && menu<=3)) {
if (menu == 0)
break;
}
while (!(number > 0 && number < 99 )) {
if (number == 0)
break;
if (number == 99)
break Loop1;
}
switch (number) {
case 1: System.out.printf("result=%d", number*number);
case 2: System.out.printf("result=%d", Math.sqrt(number));
case 3: System.out.printf("result=%d", Math.log(number));
}
System.out.println();
}
}
}
// 정답 코드
import java.util.Scanner;
public class _29_Calculator_Answer {
public static void main(String[] args) {
int menu = 0, num = 0;
Scanner sc = new Scanner(System.in);
outer:
while(true) {
System.out.println("(1) square");
System.out.println("(2) square root");
System.out.println("(3) log");
System.out.print("원하는 메뉴(1~3)를 선택하세요. (종료:0) >>");
String tmp = sc.nextLine(); // 화면에서 입력받은 내용을 tmp에 저장
menu = Integer.parseInt(tmp); // 입력받은 문자열(tmp)을 숫자로 변환
if (menu==0) {
System.out.println("프로그램을 종료합니다.");
break;
} else if (!(1<=menu && menu <=3)) {
System.out.println("메뉴를 잘못 선택하셨습니다. (종료는 0)");
continue;
}
for(;;) {
System.out.print("계산할 값을 입력하세요. (계산 종료:0, 전체 종료:99) >>");
tmp = sc.nextLine();
num = Integer.parseInt(tmp);
if (num==0)
break;
if (num==99)
break outer;
switch (menu) {
case 1:
System.out.println("result=" + num*num);
break;
case 2:
System.out.println("result=" + Math.sqrt(num));
break;
case 3:
System.out.println("result=" + Math.log(num));
break;
}
} // for(;;)
} // while의 끝
} // main의 끝
}
// 결과 1
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요. (종료:0) >>1
계산할 값을 입력하세요. (계산 종료:0, 전체 종료:99) >>24
result=576
계산할 값을 입력하세요. (계산 종료:0, 전체 종료:99) >>0
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요. (종료:0) >>2
계산할 값을 입력하세요. (계산 종료:0, 전체 종료:99) >>625
result=25.0
계산할 값을 입력하세요. (계산 종료:0, 전체 종료:99) >>0
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요. (종료:0) >>3
계산할 값을 입력하세요. (계산 종료:0, 전체 종료:99) >>2718
result=7.907651594711089
계산할 값을 입력하세요. (계산 종료:0, 전체 종료:99) >>99
// 결과 2
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요. (종료:0) >>0
프로그램을 종료합니다.
반응형
'Java > Java의 정석' 카테고리의 다른 글
객체지향 프로그래밍 𝐈 (0) | 2023.03.20 |
---|---|
[Java의 정석] 배열(array) (0) | 2023.03.17 |
[Java의 정석/3-1] 조건문 - if, switch (0) | 2023.03.15 |
[Java의 정석/2-6] 그 외의 연산자 (0) | 2023.03.15 |
[Java의 정석/2-5] 논리 연산자 (1) | 2023.03.15 |