언어 자료구조 알고리즘/디딤돌 Java 언어 Part1

[Java] 3.3 반복문 (while, for, break, break 레이블, continue)

언제나휴일 2016. 4. 4. 09:30
반응형

출간일 2016년 11월 28일

판매가 2000원

형태 ebook


이 책의 모든 내용은 http://ehpub.co.kr에 공개하고 있습니다.

학습에 도움이 되시면 ebook을 구입하여 소장하시면 감사하겠습니다.

언제나 휴일 출판사의 수익금의 대부분은 아프리카에 기부하고 있습니다.



 3.3 반복문

 

 java 언어에서 특정 조건식이 참일 동안 반복 수행하는 반복문으로 while, do while, for문을 제공합니다. 이 외에 배열처럼 여러 원소를 관리하는 컬렉션의 원소에 공통적인 작업을 수행하는 foreach 문을 제공합니다. 이 부분은 뒤에서 다룰게요.

 

3.3.1 while 문

 

while(조건 statement) 반복 수행할 statement;

 

 먼저 while 문은 조건이 참일 때 반복해서 수행할 하나의 구문을 나타낼 수 있습니다. 물론 여러 개의 구문을 반복 수행하게 하려면 블록 문법을 이용합니다. 예를 들어 1에서 100사이의 합을 구한다면 다음과 같은 알고리즘이 필요하겠죠.

 합계 sum 0으로 초기화

 index 1로 초기화

 반복(index 100보다 작거나 같다면)

    sum sum+index로 설정

    index 1 증가

 합계 출력

 

private static void exWhile() {

    int sum = 0;

    int index = 0;

    index = 1;

    while(index<=100){

        sum += index;

        index++;

    }

    System.out.println("sum of 1 to 100 is "+sum);

}

sum of 1 to 100 is 5050

[소스 3.7] exSwitchCase2 (break; 를 생략했을 때)

 

3.3.2 do while 문

 

do 반복 수행할 statement; while(조건 statement);

 

 do while 문은 while문과 비슷한데 반복해서 수행할 구문을 최소 한 번은 수행해야 할 때 사용합니다. while 문은 초기 조건식이 거짓이면 while 문 내부의 반복 수행할 구문을 한 번도 수행하지 않습니다. do while 문은 최소 한 번은 수행함을 보장합니다.

 

 예를 들어 메뉴를 출력하고 메뉴를 입력받은 후에 선택한 메뉴의 기능을 수행하는 것을반복하는 구문을 작성합시다. 이 때 최소한 한 번은 메뉴를 출력하고 메뉴를 입력받는 작업을 최소 한 번은 수행해야 할 것입니다. 이 때 do while 문을 사용할 수 있습니다.

 메뉴 출력

 키를 입력

 선택한 키에 따라

    1일 때 추가 수행

    2일 때 삭제 수행

    3일 때 검색 수행

 반복(입력한 키가 종료 키가 아니면)

 

private static void exDoWhile() {

    int key;

    do{

        System.out.println("1: 추가 2:삭제 3:검색 0:종료");

        key = scanner.nextInt();

        switch(key){

        case 1: System.out.println("추가 선택"); break;

        case 2: System.out.println("삭제 선택"); break;

        case 3: System.out.println("검색 선택"); break;

        }

    }while(key !=0);

    System.out.println("종료");

}

[소스 3.8] exDoWhile

 

3.3.3 for

 

for(초기 statement; 조건 statement; 후처리 statement) 반복 수행할 statement;

 

 그런데 반복문을 수행하기 전에 초기값을 지정하는 작업과 반복문의 조건을 변화하는 부분을 개발자의 실수로 생략하면 버그가 발생합니다. 이러한 문제를 해결하기 위해 반복문을 표현할 때 초기화 구문과 조건을 변화하는 후처리 구문을 표현하기 쉽게 영역을 구분하는 for 문을 제공하고 있습니다.

 

 앞에서 while 문을 이용하여 1부터 100사이의 합을 구하는 것을 for문으로 표현하면 다음과 같습니다.

 

private static void exFor() {

    int sum;

    int index;

 

    for(sum=0,index=1; index<=100; index++){

        sum += index;

    }

    System.out.println("sum of 1 to 100 is "+sum);

}

sum of 1 to 100 is 5050

[소스 3.9] exFor

 

 

 

3.3.4 break 문

 

 반복문으로 로직을 작성하다보면 반복 수행할 구문을 수행 중에 특정 조건일 때 반복문을 탈출할 필요가 생깁니다. 이 때 break문을 사용하면 반복문을 탈출할 수 있습니다.

 

 주의할 점은 선택문에서도 break문을 사용하고 있다는 점입니다. 예를 들어 반복문 내부에 if문이 있고 if문 내부에 break문이 있으면 반복문을 탈출합니다. 반면 반복문 내부에 선택문이 있고 선택문 내부에 break문이 있으면 선택문만 탈출합니다.

 

 do while 문을 설명하면서 사용한 예제 코드를 보면 반복문 내부에 선택문이 있고 선택문 내부에 break문이 있는 구조를 살펴볼 수 있습니다. 여기서는 break문은 선택문을 탈출하는 용도로 사용한 것입니다.

 

 여기서는 반복문 내부에 if문이 있고 if문 내부에 break문이 있는 간단한 예를 작성하여 살펴봅시다.

 

 예로 사용할 시나리오는 다음과 같습니다. 사용자가 입력한 양의 정수의 합계를 구하는 문제입니다. 만약 입력한 정수가 음수이면 더 이상 입력받지 않고 현재까지 입력받은 양의 정수의 합계를 출력합니다. 그렇지 않다면 입력한 양의 정수를 합산하고 계속 진행할 것인지 여부를 묻습니다. 그리고 계속 진행하겠다고 입력하면 다시 반복합니다.

 

 이의 알고리즘을 간략하게 표현하면 다음과 같이 나타낼 수 있을 것입니다.

 

 sum 0으로 초기화

 반복(check가 참이면)

    정수를 입력받아 num에 대입

    조건(입력한 정수가 음의 정수이면)

        반복문 탈출

    sum sum+num을 대입

    check = 계속 입력할 것인지 여부

 sum 출력

 

 위의 알고리즘의 반복문 내부의 입력한 정수가 음의 정수이면이라는 조건에서 반복문을 탈출하려면 break문을 사용하는 것입니다.

 

 

private static void exLoopIfBreak() {

    boolean check = true;

    int sum = 0;

    int num = 0;

    String s;

    System.out.println("입력한 양의 정수의 합을 계산합니다. 음수를 입력하면 끝남");

    while(check){

        System.out.println("정수 입력");

        num = scanner.nextInt();

        if(num < 0){

            System.out.println("음수를 입력하였군요. 작업을 완료할게요.");

            break;

        }

        sum += num;

        System.out.println("계속 입력(Y)");

        s = scanner.next();

        check = s.equals("Y");

    }

    System.out.println("입력한 양의 정수의 총 합은 "+ sum);

}

입력한 양의 정수의 합을 계산합니다. 음수를 입력하면 끝남

정수 입력

3

계속 입력(Y)

Y

정수 입력

-2

음수를 입력하였군요. 작업을 완료할게요.

입력한 양의 정수의 총 합은 3

[소스 3.10] exLoopIfBreak

 

 

3.3.5 break 레이블문

 

 프로그래밍하다 보면 반복문 내부에 반복문을 사용해야 할 때가 있습니다. 만약 내부 반복문에서 break문을 사용하면 내부 반복문만 탈출합니다. 그런데 외부 반복문에 레이블을 지정하고 내부 반복문에서 break 레이블문을 사용하면 외부 반복문을 탈출할 수 있습니다.

 

 먼저 Java 언어에서는 코드 상에 레이블 이름을 지정하고 콜론(:)을 표시하면 레이블을 설정하는 것입니다.

 

레이블 명:

 

 그리고 break 레이블문은 break 뒤에 레이블 이름을 표시하는 것입니다.

 

break 레이블 명;

 

 예를 들어 구구단의 합을 계산하다 처음으로 1000을 넘는 위치가 어디인지 확인하는 로직을 구현해 봅시다. 이를 위해서는 단을 진행하기 위한 반복문이 외부에 있고 내부에 다시 단*1에서 단*9까지 진행하며 합계를 구하는 반복문이 필요합니다. 그리고 내부 반복문에서는 합계가 1000보다 크면 외부 반복문을 탈출하여 로직을 완료해야 합니다. 이처럼 여러 개의 반복문의 로직에서 외부 반복문을 탈출할 때 break 레이블문을 사용합니다.

 

 sum 0으로 초기화

 탈출_레이블 지정

 반복(i 1로 초기화;

       i 10보다 작을 동안;

       i 1씩 증가)

    반복(j 1로 초기화;

          j 10보다 작을 동안;

          j 1씩 증가)

        sum sum + i*j를 대입

        조건(sum 1000보다 크거나 같으면)

            탈출_레이블로 탈출

 현재 i j sum을 출력

 

 

private static void exBreakLabel() {

    int sum = 0;

    int i=0;

    int j=0;

    exit_Label:

    for( i = 1; i<10; i++){

        for( j=1; j<10; j++){

            sum += i*j;

            if(sum >=1000){

                break exit_Label;

            }

        }

    }

    System.out.println("1*1+1*2+..."+i+"*"+j +"="+sum );

}

1*1+1*2+...7*4=1015

[소스 3.11] exBreakLabel

  

 

 

3.3.6 continue 문

 

 continue 문은 반복문 내에 수행할 반복 구문 중에 특정 위치에서 뒤의 구문을 수행하지않고 바로 반복의 후처리 구문 및 조건식으로 분기할 때 사용합니다.

 

 예를 들어 1에서 100사이의 정수 중에 2의 배수나 3의 배수를 제외한 나머지 정수의 합계를 구한다고 가정합시다.

 

 이를 위해서는 루프 카운터 변수 i 1에서 100까지 1씩 증가하는 반복문에서 i 2의 배수이거나 3의 배수이면 다음으로 넘어가고 그렇지 않을 때만 sum i를 더하면 될 것입니다. 이 때 i 2의 배수이거나 3의 배수일 때 continue문을 사용하여 문제를 해결할 수 있습니다.

 

private static void exContinue() {

    int sum = 0;

    for(int i = 0; i<=100;i++ ){

        if((i%2 == 0)||(i%3 ==0)){

            continue;

        }

        sum += i;

    }

    System.out.println("1에서 100사이의 정수 중에 2 3의 배수를 제외한 합 "+sum);

}

1에서 100사이의 정수 중에 2 3의 배수를 제외한 합1633

[소스 3.12] exContinue

 

 물론 위의 예는 조건문을 다음처럼 변경하면 continue문을 사용하지 않고 해결할 수도 있습니다.

if((i%2 != 0)&&(i%3 !=0)){

    sum += i;

}

 

 여러분께서는 다른 동료 개발자가 이해하기 쉬운 코드로 표현하시기 바랍니다.

반응형