본문 바로가기
공부/java

자바(java)의 반복문(2) : 다양한 형태의 반복문

by 샤샤샤샤 2022. 11. 21.

do-while 반복문

for문, while문과는 다르게 먼저 시행을 한 뒤, 조건 비교를 하고 반복을 시작한다.

처음은 수행되고 이후부터 조건을 따지고 싶을때 사용하는 반복문

 

형식:

변수 초기화                    
do {                         //무조건 수행문 1번은 실행
    수행문
    증감문
} while(조건식);

애초에 이런 반복문이 필요한 상황 자체가 별로 없는데다가, for나 while을 사용해서도 만들수 있기 때문에 거의 안쓰인다.

 

반복문의 제어

break   continue

 

break문: 현재 실행되고 있는 반복문을 종료 (탈출)

continue문 : 현재 루프(회차)를 종료하고 증감문으로 이동.(남은 수행문 무시)

둘의 차이는 break는 완전히 반복문이 종료되고, continue는 루프만 종료된 상태로 변수가 증가하거나 감소해서 다시 반복을 시행한다.

 

사실 별로 쓸게 없다. 말했듯, 반복문, 조건문은 그냥 많이 다뤄보는게 답이다.

public class ex44 {
    public static void main(String[] args) {
        //반복문 do-while문
        //형식
        // 초기화
        // do {
        //   수행문
        //   증감문
        // }while(조건식);
        //* do-while문은 적어도 한번은 수행후 조건비교함.
        //* 이 조건을 만들기 힘들어서 잘 안쓰임.
        //* 세미콜론이 들어 있다.
        int i = 0;
        do {
            System.out.println( i );
            i++;
        } while( i< 5);

        //while문 형식
        //초기화
        //while( 조건식 ) {
        //  실행문
        //  증감문
        //}

    }
}
public class ex45 {
    public static void main(String[] args) {
        //반복문의 제어 - break문, continue문
        //break문 - 반복문을 종료(탈출)
        //continue문 - 현재 회차(루프)에서 증감문으로 이동

        for(int i=1; i<=10; i++){
            if( i > 5) {
                break;
            }
            System.out.println( i );
        }
        //연습문제 25 - 반복문(for,while문) 이용
        //1부터 10까지 출력하되,
        //2의 배수이면 출력하고(if문 사용),
        //8이상이면 출력을 중단하시오.(break문 사용)
        //출력값 : 2 4 6 break
        for(int i=1; i<=10; i++){
            if( i>=8 ){ //모든 i값에 대한 비교
                break;
            }
            if( i%2==0 ) { //짝수 i값에 대한 조건
                System.out.println(i);
            }
        }
    }
}
public class ex46 {
    public static void main(String[] args) {
        //continue문 - 해당 회차에서 증감문으로 이동.
        //           - continue문 아래 있는 실행문을 실행안됨.
        for(int i=1; i<=10; i++){
            if( i%2==1 ){ //홀수 조건
                continue; //홀수는 찍지 않음
            }
            System.out.println(i);
        }

        //연습문제 26 - continue문 연습
        //1부터 100까지 홀수만 출력하되,
        //3의 배수는 출력하지 마시오.(continue문 이용)
        for(int i=1; i<=100; i++){
            if(i%2==1) {
                if( i%3==0 ){
                    continue;
                }
                System.out.println(i);
            }
        }

    }
}

 

레이블

중첩 반복문에서 상위 반복문을 제어할때 사용.

만약 반복문 속의 반복문에서, 모든 반복문을 종료하고 싶을때 사용한다.

하나 하나 break를 쓰기에는 너무 번거롭기에 사용하는 방식이다.

 

형식:

loop 1: for(i=0; i<=100; i++) {
    loop 2: for(j=0; i<=100; j++){
        System.out.println(i+j);
        break loop1;
        }

윗 코드의 경우 i==0이고 j==0일때 i+j를 한번 하고 break문을 만나 반복문이 끝난다.

 

public class ex47 {
    public static void main(String[] args) {
        //중첩 반복문에서의 break문, continue문
        //for문 안의 for문에서
        //레이블을 이용하여 상위 반복문을 제어(break,continue)함.

        loop1: for(int i=0; i<5; i++){
            System.out.println("i:"+i);
            loop2: for (int j=0; j<5; j++){
                System.out.print("j:"+j+" ");
                break loop1;
            }
            System.out.println();
        }

        System.out.println("----------");

        loop1: for(int i=0; i<5; i++){
            System.out.println("i:"+i);
            loop2: for (int j=0; j<5; j++){
                System.out.println("j:"+j+" ");
                continue loop1;
            }
            System.out.println();
        }

    }
}
public class ex48 {
    public static void main(String[] args) {
        //이중 for문을 연습하자!
        //이중 배열에서 값을 제어하기 위해서 사용!
        //별찍기
        //***** i:0 j:01234
        //***** i:1 j:01234
        //***** i:2 j:01234
        //***** i:3 j:01234
        //***** i:4 j:01234
        for(int i=0; i<5; i++){
            for(int j=0; j<5; j++){
                System.out.print("*");
            }
            System.out.println();
        }
        //연습문제 27
        //*     i:0 j:0
        //**    i:1 j:01
        //***   i:2 j:012
        //****  i:3 j:0123
        //***** i:4 j:01234
        for(int i=0; i<5; i++){
            for(int j=0; j<=i; j++){
                System.out.print("*");
            }
            System.out.println();
        }

        //연습문제 28 - 공백과 별을 출력
        //     ROW  공백    별문자
        //    * i:0 j:0123 k:0
        //   ** i:1 j:012 k:01
        //  *** i:2 j:01 k:012
        // **** i:3 j:0 k:0123
        //***** i:4 j: k:01234
        for(int i=0; i<5; i++){
            for(int k=0; k<=4-i; k++){
                System.out.print(" ");
            }
            for(int j=0; j<=i; j++){
                System.out.print("*");
            }
            System.out.println();
        }
        //연습문제 29
        //*       i:0  j:0개 k:1
        // *      i:1  j:1
        //  *     i:2  j:2
        //   *    i:3  j:3
        //    *   i:4  j:4
        for(int i=0; i<5; i++){
            for(int j=0; j<=i; j++){
                System.out.print(" ");
            }
            System.out.print("*");
            System.out.println();
        }

        //연습문제 30
        // n의 자연수가 입력되고, n은 0보다 큰 홀수이다.
        //n == 1일때
        //*
        //n == 3일때
        // *     i:2번
        //***
        //n == 5일때
        // m = n/2+1(i루프 갯수)
        //  *    i :0      j:2 m-i   k:1  i*2+1
        // ***     :1      j:1       k:3
        //*****    :2      j:0       k:5
        int n = 1;
        int m = n/2+1; //i루프 갯수
        for(int i=0; i<m; i++){
            for(int j=1; j<m-i; j++){
                System.out.print(" ");
            }
            for(int k=0; k<i*2+1; k++){
                System.out.print("*");
            }
            System.out.println();
        }

    }
}

 

이중 반복문....

if문은 자신있지만, 이중반복문은 정말 어렵다.

너무 헷갈린다.

어느 순간 막혀버리면, 고민하다가 나도 모르게 점점 혼란으로 빠져든다.

조건문에 대한 해석이 막히고, 중괄호의 개수가 헷갈리기 시작하고, 만약 그 안에 조건문이 들어가 있다면 정말이지 머리가 뒤죽박죽이 되서 술먹은 사람마냥 코드 속을 비틀거리게 된다.

내가 특히 고생했던 30번 문제를 다시 한번 풀어보겠다.

import java.util.Scanner;

public class asfdasdf {
    public static void main(String[] args) {
        // 만약 n이 9라면??
        //     *             1. 별 1개.                           공백4개
        //    ***            2. 별 3개.                           공백 3개
        //   *****           3. 별 5개.                           공백 2개
        //  *******          4. 별 7개.                           공백 1개
        // *********         5. 별 9개.                           공백 0개
        // 줄의 번호: n/2 +1    한 줄의 별의 개수: 2(줄의 순번)-1개     한 줄의  공백의 개수: (n-1)/2 - (줄 번호 - 1)
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        for (int i =0; i <= n/2+1; i++){            // 0번째 줄에서부터 n/2+1번째 줄까지 만들기. 공백과 별 모두 포함됨.
            for(int j = 1; j <= n/2+1 - i ; j++ ){  // 먼저 공백이 4개, 다음에 3개, 그다음에 2개..
                System.out.print(" ");              // 이런식으로 1줄 마다 1개씩 줄어들게 반복문
            }
            for(int k = 1; k<= i*2-1; k++){         // 공백 뒤에 붙일 별 만들기
                System.out.print('*');              // n번째 줄 별의 개수는 n*2-1개
            }
        }
    }
}

여전히 어렵다....

 

무한루프

무한히 반복되는 반복문이다.

for 문은 조건식을 (;;)로 만들어서, while문은 조건식을 true값을 넣어서 만든다.

public class ex50 {
    public static void main(String[] args) {
        //무한반복문, 무한루프(Infinite Loop)
        //사용 예)윈도우즈OS : 마우스,키보드 입력 대기
        //       자판기 : 버튼 입력 대기
        //       엘리베이터 : 버튼 입력대기
        //무한루프 만드는 방법
        //1. for(;;){  }
        //2. while(true){  }
        //무한루프 빠져나오는 방법
        //1. 특정조건에서 break문 사용
        //무한루프 강제 정지하는 법
        //1. 빨간네모 정지버튼 누른다.
        //2. 통합개발툴을 재시동한다.(인텔리제이,이클립스)

        //1.for(;;) 사용
        int i=0;
        for(;;){
            System.out.println("무한루프1:"+(i++));
            if(i>100){
                break; //탈출!
            }
        }
        //2.while(true) 사용
        i = 0;
        while(true){
            System.out.println("무한루프2:"+(i++));
            if(i>100){
                break; //탈출!
            }
        }
    }
}
import java.util.Random;

public class ex51 {
    public static void main(String[] args) {
        //연습문제 31 - 무한루프
        //철수가 주사위 1개를 계속해서(무한히) 던진다.
        //1~6사이의 랜덤값 발생!
        //5가 나올때까지 계속해서 던지고,
        //주사위를 던진 시도횟수를 출력하시오.
        //출력값 : 1 3 4 6 1 5 stop!
        //        던진 갯수는 6번입니다.
        Random rand = new Random();
        int count = 0;
        for(;;){
            int dice = rand.nextInt(6) + 1;
            count++;
            System.out.print( dice+" " );
            if( dice == 5 ){
                System.out.println("stop!");
                System.out.println("던진 횟수는 "+count);
                break;
            }
        }

        //연습문제 32
        //영희가 주사위 2개를 계속해서 던져서
        //두 주사위 숫자가 똑같을 때까지 던진다.
        //영희는 몇번만에 성공할지 시도횟수를 출력하시오.
        //출력값 : 1:3 2:4 5:6 3:3 stop!
        //        던진 갯수는 4번입니다!
        count = 0;
        for(;;){
            int dice1 = rand.nextInt(6) + 1;
            int dice2 = rand.nextInt(6) + 1;
            count++;
            System.out.print( dice1+":"+dice2+" " );
            if( dice1 == dice2 ){
                System.out.println("stop!");
                System.out.println("던진 횟수는 "+count);
                break;
            }
        }
    }
}

 

'공부 > java' 카테고리의 다른 글

자바(java)의 최대, 최솟값 찾기  (0) 2022.11.23
자바(java)의 문자열 관련 함수  (1) 2022.11.22
자바(java)의 조건문(2)  (1) 2022.11.19
자바(java)의 연산자(연산 기호)  (0) 2022.11.17
자바(java)의 변수와 상수  (0) 2022.11.15