반목문 - for, while, do-while
- 반복문은 특정 코드를 반복적으로 실행시키는 구문이다.
1. for문
- 반복 횟수를 알고 있을 때 적합하다.
for(초기화; 조건식; 증감식) { // 반복되는 부분 LOOK FOR
// 조건식이 true일 때 수행될 문장들을 적는다. LOOK FOR문
}
1) for문의 구조와 수행순서
- 초기화 → 조건식 → 수행 될 문장 → 증감식, 조건식이 false이 되면 for문 전체를 빠져나가게 된다.
2) 초기화
- 반복문에 사용될 변수를 초기화하는 부분이며 처음에 한번만 수행된다.
- 보통 변수 하나로 for문을 제어하지만, 둘 이상의 변수가 필요할 때는 ‘,’를 구분자로 변수를 초기화하며 두 변수의 타입은 같아야 한다.
3) 조건식
- 조건식의 값이 true이면 반복을 계속하고, false이면 반복을 중단하고 for문을 벗어난다.
- 조건식을 잘못 작성하면 블럭{} 내의 문장이 한 번도 수행되지 않거나 영원히 반복된다.
4) 증감식
- 반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식이다.
- 매 반복마다 변수의 값이 증감식에 의해서 점진적으로 변하다가 조건식이 false이 되어 for문을 벗어나게 된다.
- 연산자(++,- -)을 주로 사용하며, ‘,’를 이용해서 두 문장 이상을 하나로 연결해서 쓸 수 있다.
public void method1() {
for(int i = 1; i <=10; i+=2) { // 1 3 5 7 9
System.out.println(i + "번째 출력");
}
System.out.println();
for (int i = 20; i > 15; i--) { // 20 19 18 17 16
System.out.println(i + "번째 출력");
}
}
public void method2() {
// 1부터 10까지의 정수들의 합계를 출력
// 1 + 2 + 3 + 4 ... + 10
// sum + = 1;
// sum + = 2;
// ...
// sum + = 10;
int sum = 0;
for(int i = 1; i < 10; i++) {
// sum = sum + i;
sum += i;
// System.out.println(i); // 연산 과정을 보고 싶으면 이렇게 하거나 debug 이용하기
// System.out.println(sum);
}
System.out.println("합계 : "+ sum);
}
public void method3() {
// 1부터 랜덤값(1~10)까지의 합계를 구하시오.
// java.lang.Math 클래스에서 제공하는 random() 메소드를 사용해서 랜덤값을 발생시킬 수 있다.
// Math.random() 호출 시 -> 0.0 ~ 0.999999 사이의 랜덤값을 발생 (0.0 <= 랜덤값 < 1.0)
// int random = Math.random(); // error
// int random = (int) (Math.random() * 10); // 0.0 ~ 9.999999f.. -> 0 ~ 9
int random = (int) (Math.random() * 10 + 1); // 1.0 ~ 10.999999f.. -> 1 ~ 9
int sum = 0 ;
System.out.println("1 ~10 사이의 랜덤값 : " + random);
for (int i = 1; i <= random; i++) {
sum +=i;
}
System.out.printf("1부터 %d까지의 합 : %d\\n", random, sum);
}
실습문제
/*
* 실습 문제 1
* 1부터 사용자로부터 입력받은 수까지의 합계를 구하시오.
* 예시)
* 정수 > 10
* 총 합계 > 55
*/
public void practice1() {
int num = 0;
int sum = 0;
Scanner scanner = new Scanner(System.in);
System.out.print("정수 > ");
num = scanner.nextInt();
for(int i = 1; i <= num; i++) {
sum +=i;
}
System.out.println("총 합계 : " + sum);
scanner.close();
}
/*
* 실습 문제 2
* 사용자가 입력한 단을 출력하시오.
* 예시)
* 단 수(2~9)를 입력해 주세요. > 3
* 3 x 1 = 3
* ...
* 3 x 9 = 27
*
* 단 수(2~9)를 입력해 주세요. > 12
* 1~9 사이의 양수를 입력하여야 합니다.
*/
public void practice2() {
int num = 0;
Scanner scanner = new Scanner(System.in);
System.out.print("단 수(2~9)를 입력해 주세요 >");
num = scanner.nextInt();
if(num >= 2 && num < 10) {
for(int i = 1; i < 10; i++) {
System.out.printf("%d X %d = %d\\n",num, i, num * i);
}
} else {
System.out.println("2~9사이의 양수를 입력하여야 합니다.");
}
scanner.close();
}
5) 중첩 for문
- for문 안에 또 다른 for문을 포함시키는 것이며 중첩의 횟수는 거의 제한이 없다.
public void method4() {
/*
* 2단 ~ 9단까지
* 단 -> 2 ~ 9까지 1씩 증가 (바깥쪽 for 문을 통해 해결)
* 곱해지는 수 -> 1 ~ 9까지 1씩 증가 (안쪽 for 문을 통해 해결)
* == 2단 ==
* 2 x 1 = 2
* 2 x 2 = 4
* 2 x 3 = 6
* ...
* == 9단 ==
* 9 x 1 = 9
* 9 x 2 = 18
* 9 x 3 = 27
* 9 x 4 = 36
* ...
*/
for(int i = 2; i <= 9; i++) {
System.out.printf("== %d단 == \\n", i);
for(int j = 1; j <= 9; j++) {
System.out.printf("%d x %d = %d\\n", i, j, i*j);
}
System.out.println();
}
}
public void method5() {
/*
*****
*****
*****
*****
*/
// 행이 1 ~ 4까지 반복 (바깥쪽 for 문)
// 열이 1 ~ 5까지 반복 (안쪽 for 문)
for (int i = 0; i < 4; i++) {
for(int j = 0; j < 5; j++) {
System.out.print("*");
}
System.out.println();
}
}
실습문제
/*
* 실습 문제 3
아래와 같이 출력 되도록 중첩 for 문을 작성하시오.
예시)
1***
*2**
**3*
***4
*/
public void practice3() {
// 행이 1 ~ 4까지 반복
// 열이 1 ~ 4까지 반복
// 행과 열의 값이 같으면 숫자를 출력, 이외에는 * 출력
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
if(i==j) {
System.out.print(i + 1);
} else {
System.out.print("*");
}
}
System.out.println();
}
}
/*
* 실습 문제 4
아래와 같이 출력 되도록 중첩 for 문을 작성하시오.
예시)
*
**
***
****
*****
*/
public void practice4() { // 자바의 정석 p163 코드 참고
// 행이 1 ~ 5까지 반복
// 열이 1 ~ 5까지 반복
// 열의 값이 행보다 작거나 같을 때까지 * 출력
for(int i = 0; i < 5; i++) {
for(int j= 0; j < i + 1; j++) {
System.out.print("*");
}
// for(int j= 0; j < 5; j++) {
// if(j <= i) {
// System.out.print("*");
// }
// }
System.out.println();
}
}
/*
* 실습 문제 5
*
* 사용자가 "안녕하세요."라고 입력하면 아래와 같이 출력되도록 코드를 작성하시오.
* "안"
* "녕"
* "하"
* "세"
* "요"
* "."
*
* 참고 - length(), charAt() 메소드를 활용
*
*/
public void practice5() {
String str = null;
Scanner scanner = new Scanner(System.in);
System.out.print("문자열 입력 > ");
str = scanner.nextLine();
for(int i = 0; i < str.length(); i++){
System.out.printf(" \\"%c\\"\\n", str.charAt(i));
}
scanner.close();
}
}
6) 향상된 for문(enhanced for statement)
for(타입 변수명 : 배열 또는 컬렉션){
// 반복할 문장
}
- 위의 문장에서 타입은 배열 또는 컬렉션의 요소의 타입이어야 한다.
- 배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀서 변수에 저장된다.
- 반복문의 괄호{}내에서는 이 변수를 사용해서 코드를 작성한다.
2. while문
- while 문은 조건식이 true 일 경우에 코드를 반복 실행하는 구문이다.
- while 문을 빠져나가기 위한 코드(증감식, 분기문)가 필요하다.
while (조건식) {
// 조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.
}
- while문의 조건식은 생략불가
while (true){
// 조건식이 항상 참 ...
}
public class D_While {
/*
* while 문
*
* [표현식]
* [초기식]
* while(조건식){
* ..실행 코드..
*
* [증감식, 분기분]
* }
*/
public void method1() {
// 1부터 랜덤값(1 ~ 10)까지의 합계
int sum = 0;
int random = (int)(Math.random()*10+1);
int i = 0;
while(i <= random) {
sum +=i;
i++;
}
System.out.printf("1부터 %d까지의 합 : %d", random, sum);
}
// 사용자에게 계속 문자열을 입력 받고 그 문자열을 출력한다.
// 단, "exit"문자열을 입력하면 프로그램을 종료한다.
public void method2() {
String str = "";
Scanner scanner = new Scanner(System.in);
// while(true) {
// System.out.print("문자열을 입력해주세요 > ");
// str = scanner.nextLine();
//
// if(str.equals("exit")) {
// break;
// }
//
// System.out.println(str);
// }
while(!str.equals("exit")) {
System.out.print("문자열을 입력해주세요 > ");
str = scanner.nextLine();
System.out.println(str);
}
System.out.println("프로그램을 종료합니다.");
scanner.close();
}
}
3. do-while문
- do-while 문은 while 문과 동일하게 조건식에 의해 코드를 반복 실행하는 구문이지만 조건식이 true가 아니더라도 무조건 한 번은 실행되는 구문이다.
do {
// 조건식의 연산결과가 참일 때 수행될 문잗들을 적는다
// 증감식 or 분기문
} while(조건식); -> 끝에 ';'을 잊지 않도록 주의
4. break문
- break 문은 switch 문과 for 문, while 문, do-while 문의 실행을 중지하고 빠져나갈 때 사용한다.
- 반복문이 중첩되어 있는 경우 break 문이 포함되어 있는 반복문만 중지하고 빠져나간다.
while(true) {
for(int i = 0; i < 10; i++ ) {
if (i == 5) {
break;
}
System.out.println("i : " + i);
}
}
public class F_Break {
public void method1() {
// 1부터 랜덤값(1 ~ 10)까지의 합계를 반복문을 통해서 출력한다.
// 단, 랜덤값이 숫자 5가 나오면 프로그램을 종료한다.
int sum;
int random;
// 밑에 초기화 하기 때문에
while(true) {
sum = 0; // 반복할 때마다 sum을 초기화하지않으면 전의 값에 누적해서 더해주기 때문에 초기화해야 한다.
random = (int)(Math.random() * 10 + 1); // 0.0 ~ 0.999999
if(random == 5) {
break; // break가 포함되어 있는 반복문을 빠져 나간다.
}
for(int i = 1; i <= random; i++) {
sum +=i;
}
System.out.printf("1부터 %d까지의 합계 : %d\n", random, sum);
}
System.out.printf("랜덤값이 %d이므로 프로그램을 종료합니다.", random);
}
5. continue문
- continue 문은 반복문에서 이후의 문장을 실행하지 않고 증감식 또는 조건식으로 이동할 때 사용한다.
- 반복문이 중첩되어 있는 경우 continue 문이 포함되어 있는 가장 가까운 반복문의 증감식 또는 조건식으로 이동한다.
- 반복문 전체를 벗어나지 않고 다음 반복을 계속 수행할 수 있다는 점이 break문과 다르다.
- 전체 반복 중에서 특정 조건을 만족하는 경우를 제외하고자 할 때 유용하다.
while(true) {
for(int i = 0; i < 10; i++ ) {
if (i == 5) {
continue;
}
System.out.println("i : " + i);
}
}
public class G_Continue {
public void method1() {
// 1부터 100까지 정수들의 합을 출력하시오.
// 단, 5의 배수는 제외하고 덧셈 연산을 한다.
int sum = 0;
for(int i = 0; i <= 100; i++) {
if(i % 5 == 0) {
continue;
}
sum +=i; // sum = sum + i;
}
System.out.println("합계 : " + sum);
}
public void method2() {
// 2 ~ 9단까지 출력하시오.
// 단, 홀수단을 빼고 출력한다.
for(int i = 2; i <= 9; i++) {
if(i % 2 != 0) {
continue;
}
System.out.printf("=== %d단 ===\n", i);
for(int j = 1; j <=9; j++) {
System.out.printf("%d x %d = %d\n", i, j, (i * j));
}
System.out.println();
}
}
}
6. 이름 붙은 반복문
- break문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에, 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다.
- 이때 반복문의 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.
Loop1 : for(int i =2; i<=9; i++){
for(int j=1; i<=9; j++){
if(j==5)
break Loop1;
break;
continue Loop1;
continue;
System.out.println(i+"*"+j+"="+i*j);
}
System.out.println();
}
- j가 5일 때 반복문 Loop1을 벗어나도록 했으므로 2단의 4번째 줄까지 밖에 출력되지 않았다.
- 만일 반복문의 이름이 지정되지 않은 break문이었다면 2단부터 9단까지 모두 네 줄씩 출력되었을 것이다.
'Java' 카테고리의 다른 글
배열(Array) - 배열(Array)이란? (0) | 2022.08.20 |
---|---|
조건문(conditional statements) - if & switch (0) | 2022.08.19 |
연산자(Operator) - 논리 연산자 & 그 외의 연산자 (0) | 2022.08.18 |
연산자(Operator) - 산술 연산자 & 비교 연산자 (0) | 2022.08.17 |
연산자(Operator) - 연산자(operator) & 단항 연산자 (0) | 2022.08.17 |