나를 기록하다
article thumbnail
반응형

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
프로그램을 종료합니다.
반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...