Java

반복문

반복문

인간은 반복적인 작업을 잘하지 못한다. 실수하고, 지루해한다. 컴퓨터는 이런 반복적인 작업을 대행하기 위해서 만들어진 기계다. 인간이 하기 싫어하는 바로 그 일을 컴퓨터가 대신하도록 하는 것이 반복문(loop, iteration)이다.

반복문의 문법

반복문의 문법은 몇 가지가 있다. 각각의 구문은 서로 대체 가능하기 때문에 상황과 취향에 따라서 선택해서 사용하면 된다.

while

while문의 형식은 아래와 같다.

while(조건){
    반복 실행 영역
}

아래의 예제를 실행해보자. (실행)

다음 예제는 무한 반복을 발생시킨다. 저장되지 않은 작업이 있다면 모두 정리한 후에 이 명령을 실행하자. 콘솔에서 실행할 경우 Ctrl+C(dnls 나 Cmd+. 단축키를 이용해서 무한 반복을 중지할 수 있다.

package org.opentutorials.javatutorials.loop;

public class WhileDemo {

    public static void main(String[] args) {
		while (true) {
			System.out.println("Coding Everybody");
		}

	}

}

이번에는 true를 false로 바꾼 아래의 예제를 실행해보자. 아래 코드는 아예 컴파일조차 되지 않을 것이다. 반복 조건이 false이기 때문에 반복문이 한 번도 실행되지 않을 것이기 때문에 컴파일러가 오류를 발생시키는 것이다. (실행)

while(false){
	System.out.println("Coding Everybody");
}

while 문은 반복조건이 참(true)이면 중괄호 구간을 반복적으로 실행한다. 조건이 false면 반복문이 실행되지 않는다. 여기서 true와 false는 반복의 종료조건이 되는데, 반복문에서 종료조건을 잘못 지정하면 무한 반복이 되거나, 반복문이 실행되지 않는다.

아래의 반복문은 i의 값을 1씩 순차적으로 증가시킴으로써 반복의 지속 여부를 결정하고 있다. 주석으로 첨부한 설명을 주의 깊게 살펴보자. 변수 i는 관습적으로 반복의 조건으로 사용하는 임의의 변수다. 변수 이름으로 다른 것을 사용해도 무방하다. (실행)

int i = 0;
// i의 값이 10보다 작다면 true, 크다면 false가 된다. 현재 i의 값은 0이기 때문에 이 반복문은 실행된다. 
while(i<10){			
	System.out.println("Coding Everybody"+i);
	// i의 값에 1을 더한다. 반복문의 중괄호의 마지막 라인에 도달하면 반복문은 반복문을 재호출한다. 이때 i<10의 값을 검사하게 된다.
	i++;
}

for

while문을 보면 반복의 횟수를 지정하기 위해서 while문 외부에 변수 i의 값을 초기화하고, while문 안에서 i의 값을 증가시키고 있다. 이것은 코드를 산만하게 할 수 있다. 반복문에서 자주 사용하는 이러한 패턴을 문법적인 형태로 만든 것이 for문이다. for문은 특정한 횟수만큼 반복 실행을 하는 경우에 자주 사용된다. 하지만 for문이나 while문이나 서로 대체 가능하다. 취향에 따라서 선택하면 된다. while과 for의 관계는 조건문으로 비유해서 생각해 볼 수도 있을 것 같다. 조건문의 핵심은 if이지만 연관된 로직들의 응집성을 높이기 위해서 else if, else 등이 도입된 것과 비슷한 관점으로 볼 수 있겠다. 이러한 방향성을 자신의 코드에도 적용 할 수 있도록 노력하자.

형식은 아래와 같다.

for(초기화; 종료조건; 반복실행){
    반복적으로 실행될 구문
}

다음 예제를 보자. (실행)

package org.opentutorials.javatutorials.loop;

public class ForDemo {

    public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			System.out.println("Coding Everybody " + i);
		}

	}

}

for문의 괄호 안에는 반복의 종료 조건이 들어온다. 종료 조건은 크게 3개의 부품으로 구성되는데 아래와 같다.

  • 초기화 : 반복문이 실행될 때 1회 실행된다.
  • 종료조건 : 초기화가 실행된 후에 종료조건이 실행된다. 종료조건의 값이 false일 때까지 반복문의 중괄호 구간의 코드가 반복 실행된다.
  • 중괄호 구간의 실행이 끝나면 반복 실행이 실행된다. 일반적으로 이 곳에 i++와 같이 변수를 증가시키는 로직이 위치하고, 이것이 실행된 후에 종료조건이 실행된다. 종료조건이 false가 될 때까지 이 과정이 반복된다.

반복문이 없다면

coding everybody를 10번 반복해서 출력하고 싶다고 한다면 아래와 같이 코드를 작성하면 된다. (실행)

System.out.println("coding everybody");
System.out.println("coding everybody");
System.out.println("coding everybody");
System.out.println("coding everybody");
System.out.println("coding everybody");
System.out.println("coding everybody");
System.out.println("coding everybody");
System.out.println("coding everybody");
System.out.println("coding everybody");
System.out.println("coding everybody");

이 정도의 작업은 복사&붙여넣기를 이용해서도 할만하다. 하지만 좀 더 큰 규모의 데이터를 다뤄야 한다면 반복문의 효용이 드러나기 시작한다. 예를 들어서 'coding everybody'를 1천 번 출력해야 한다면 위의 예제와 아래 예제의 코드 분량에 큰 차이가 생길 것이다. (실행)

int i = 0;
while(i<10){
	System.out.println("coding everybody");
	i++;
}

만약 반복문 없이 coding everybody 뒤에 숫자를 1부터 10까지 붙이고 싶다면 아래와 같이 코드를 작성해야 할 것이다. 행마다 숫자를 바꿔야 하므로 Copy & Paste도 할 수 없다. (실행)

System.out.println("coding everybody1");
System.out.println("coding everybody2");
System.out.println("coding everybody3");
System.out.println("coding everybody4");
System.out.println("coding everybody5");
System.out.println("coding everybody6");
System.out.println("coding everybody7");
System.out.println("coding everybody8");
System.out.println("coding everybody9");
System.out.println("coding everybody10");

반복문에서는 아래와 같이 하면 된다. (실행)

int i = 0;
while(i<10){
	System.out.println("coding everybody"+i);
	i++;
}

coding everybody 뒤에 붙는 숫자를 2의 배수하고 싶다면 어떻게 해야 할까? 반복문이 없다면 한줄 한줄 수정해야 할 것이다. 반복문에서는 내용을 조금만 변경하면 된다. (실행)

int i = 0;
while(i<10){
	System.out.println("coding everybody"+(i+1)*2);
	i++;
}

반복문의 제어

break

반복작업을 중간에 중단시키고 싶다면 어떻게 해야 할까?  break를 사용하면 된다. 아래의 예제는 위에서 살펴본 예제를 일부 변형한 것이다. (실행)

package org.opentutorials.javatutorials.loop;

public class BreakDemo {

    public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			if (i == 5)
				break;
			System.out.println("Coding Everybody " + i);
		}

	}

}

위 코드의 결과는 아래와 같다. 종료조건에 따르면 10행이 출력돼야 하는데 5행만 출력되었다. 2행의 if(i == 5) 에 의해서 i의 값이 5일 때 break 문이 실행되면서 반복문이 완전히 종료된 것이다. 반복문 안에서 break가 실행되면 반복문을 즉시 종료시킨다. 참고로 조건문에 의해서 실행되는 코드가 한 줄일 경우 예제와 같이 중괄호를 생략 할 수 있다. 반복문도 반복적으로 실행할 코드가 한 줄일 경우 중괄호를 생략할 수 있다.

coding everybody 0
coding everybody 1
coding everybody 2
coding everybody 3
coding everybody 4

continue

그럼 실행을 즉시 중단하면서 반복은 지속해가게 하려면 어떻게 해야 할까? 설명이 어렵다면 예제를 보자. 이전 예제의 break를 continue로 변경했을 뿐이지만 결과는 전혀 다르다. (실행)

package org.opentutorials.javatutorials.loop;

public class ContinueDemo {

    public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			if (i == 5)
				continue;
			System.out.println("Coding Everybody " + i);
		}

	}

}

결과는 아래와 같다. 숫자 5가 보이지 않는다. 왜 그럴까? i의 값이 5가 되었을 때 실행이 중단됐기 때문이다. continue 구문은 이 명령이 나타나는 이후의 로직을 실행하지 않도록 한다. 하지만 반복문 자체를 중단하는 것이 아니고 다시 반복문이 실행된다.

Coding Everybody 0
Coding Everybody 1
Coding Everybody 2
Coding Everybody 3
Coding Everybody 4
Coding Everybody 6
Coding Everybody 7
Coding Everybody 8
Coding Everybody 9

반복문의 중첩

반복문 안에는 다시 반복문이 나타날 수 있다. 다음 예제를 보자. 다음 예제는 00, 01, 02....99 까지를 화면에 출력한다. (실행)

package org.opentutorials.javatutorials.loop;

public class LoopDepthDemo {

    public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < 10; j++) {
				System.out.println(i + "" + j);
			}
		}

	}

}

단순히 글자를 반복적으로 출력하기 위해서 반복문을 사용한다고 생각할 수도 있다. 하지만 반복문의 진가는 배열과 결합했을 때 나타난다. 다음 토픽인 배열에서 반복문의 진가를 살펴보자.

 

 

댓글

댓글 본문
작성자
비밀번호
  1. 송선욱
    설명 감사합니다!
    이전 강의를 다시 뒤적거리면서 == 는 사칙연산의 = 를 뜻하고
    = 는 변수를 정의하는(?) 것이라고 이해했습니다!
    대화보기
    • 안재성
      java 에서는 우리가 알고있는 = 의 의미는 == 입니다.
      =는 java에서는 다른 의미로 쓰이죠
      음.. 저도 배우고있는 단계여서.. =는 자바에서 할당?이라고해야하나 아무튼 그러렇게 쓰입니다
      대화보기
      • 송선욱
        break 예제에서 조건문 if (i == 5); 대신 if (i = 5) 성립하지 않는 것인가요?
      • 걸음마
        쉽고 자세하게 설명 해주셔서 감사합니다.
        목소리도 너무 좋으세요^^
      • 대단해요. 저절로 알아듣게 되는 ㄷㄷㄷㄷ
      • R.E 고마워요생활코딩
        언어를 처음 배우는 직장인입니다.
        알기 윕게 풀어서 설명해주시고 예를 많이 들어주어서 너무 좋습니다.
        독학이 정말 어려웠는데 생활 코딩 덕분에 많이 배우고 있습니다.
        정말 감사드립니다.
      • 레미렘
        정말 쉽게 설명해주시네요.. 감사합니다.
      • 449전째 시청자입니다.
        나의 학습 진행 상태가 어느정도 인지 조리있게 설명해주셔서
        힘도 나지만 앞으로 배울 과정들에 대한 기대와 걱정도 함께 오네요 ㅎ
        그래도 미리 예상하고 마음의 준비를 할 수 있다는 건 정말 너무 큰 장정인거 같아요
        감사합니다.
      • NewJava
        항상 강의 잘 듣고 있습니다. 감사합니다.
      • 감사합니다!!
      • JustStudy
        고맙습니다
      • yskioi
        감사합니다.
      • 현벨
        감사합니다.
        이고잉님 목소리가 이제 귀에 착착 감깁니다 (?)
      • 콛잉
        정말 막막했는데...감사합니다. !!!!! 차근차근 가르쳐주셔서 정말 귀에 쏙쏙 들어오네요!!!♡
      • Devani0310
        감사합니다
      • 감사합니당
      • 오빠는다르다
        감사합니다!!!!
      • Byunghawk Lee
        잘봤습니다
      • 허니버터
        잘보고 넘어 갑니다.
      • import java.util.*;
        import java.lang.*;
        import java.io.*;

        class LoopDepthDemo {

        public static void main(String[] args) {
        for (int i = 1; i < 10; i++) {
        for (int j = 1; j < 10; j++) {
        System.out.println(i+"*"+j+"="+i*j);
        }
        }

        }

        }
      • /*
        * 본 코드는 생활코딩 Java 수업을 위해서 만들어진 코드입니다.
        * http://o...content-available-to-author-only...s.org......516
        * 누구든지 이 코드를 이용해서 원하는데로 사용할 수 있습니다. (public domain)
        * 본 코드는 아래 수업에서 활용되고 있습니다.
        * 실제 수업의 내용과 ideone.com의 코드는 다를 수 있습니다.
        * ideone.com 플랫폼의 특성 때문입니다.
        */

        import java.util.*;
        import java.lang.*;
        import java.io.*;

        class forDemo {

        public static void main(String[] args) {
        int [] a = new int [10];

        for (int i = 0; i < a.length; i++) {
        System.out.println("Coding Everybody " + i);
        }

        }

        }
      • yangjh05
        제가 지금 새로운 .c와 .cpp프로그램 코딩모듈을 만들고 있는데요^^;;
        4 달전 egoing님것이 아름다워 시작하게 됬는데, 벌써 시간이 이렇게 됬네요....
        지금 준비중인데 공동공부 신청해서 많이 봐 주세요:)
      • egoing
        For문 내의 세미콜론은 각 반복을 위해서 필요한 각 부분을 구분해주는 역할을 하는 것이기 때문에 세미콜론을 붙이시면 부분이 3개가 아니라 4개가 되는 셈이죠.
        대화보기
        • Brad
          멋진 강의 잘듣고 있습니다. 궁금한게 for문 조건에서 i++뒤에 세미콜론이 붙으면 오류나는 이유가 뭔가요? 즉 내용상 반복실행의 부분이요.
        • dervish
          오늘도 즐겁게 배우고 있습니다.
          999단위까지도 중첩이 되네요 ~~~

          package org.opentutorials.javatutorials.loop;

          public class LoopDepthDemo {

          public static void main(String[] args) {
          // TODO Auto-generated method stub
          for (int i = 0; i < 10; i=i+1) {
          for (int j = 0; j < 10; j=j+1) {
          for (int a = 0; a < 10; a++) {
          System.out.println(i + "" + j + "" + a);
          }
          }
          }
          }

          }
        • Esunny
          for(a=0;a<10;a++){
          for(b=0;b<10;b++){
          System.out.println(b);
          }
          }
          괄호가 틀렸어요~~~
          대화보기
          • 풍운도장
            메소드를 향해 출발~~
          • holy
            /**
            * <pre>
            * TODO
            * </pre>
            *
            * @since 2015. 6. 24. 오후 2:34:29
            * @author Holy
            * @version
            */
            public class 다이아 {
            /**
            * <pre>
            * 다이아몬드
            * </pre>
            *
            * @since 2015. 6. 24. 오후 2:34:29
            * @author Holy
            * @version
            * @param args
            */
            static int max = 7; // 반지름 크기;
            static int line;
            static int x;

            public static void main(String[] args) {

            for (line = 1; line < max; line++) {// 상단 부분 1~3
            좌표이동();
            }
            for (line = max; line > 0; line--) {
            좌표이동();
            }
            }

            /**
            * <pre>
            * TODO
            * </pre>
            *
            * @since 2015. 6. 25. 오전 9:28:40
            * @author Holy
            * @version
            * @param max
            * @param line
            */
            private static void 좌표이동() {
            for (x = max; 0 < x; x--) {// x좌표를 1식 감소
            별판정();
            }
            for (x = 2; x <= max; x++) {// x좌표를 1식 증가
            별판정();
            }
            System.out.println("_" + line);
            }

            /**
            * <pre>
            * TODO
            * </pre>
            *
            * @since 2015. 6. 25. 오전 9:27:46
            * @author Holy
            * @version
            * @param x
            * @param line
            */
            private static void 별판정() {
            if (x <= line) {
            System.out.print("*");
            } else {
            System.out.print(" ");
            }
            }
            }
          • 자바초보
            중첩의 목적이 0~9까지 10번 출력하시는 건가요?
            그럼 코드는 이렇게 될거 같네요...
            public class aaaaa {

            public static void main(String[] args) {
            for(int a=0; a<10; a++) {
            for(int b=0; b<10; b++) {
            System.out.println(b);
            }
            System.out.println();
            }
            }
            }

            올려주신 코드로는 컴파일도 안되더라고요...
            그리고 제 생각에 원인은

            for(b=0;b<10;b++);

            이 부분의 ";" 세미콜론 때문인거 같아요...

            for문 뒤에 참일 때 출력하는 문장이 있어야 하는데, 세미콜론으로 인해서 for문(b관련 for문) 아래의
            System.out.println(b); 문장이 다음 문장(for문 밖의 문장)으로 인식되는 듯 합니다.
            그래서 b가 0일때 10보다는 작아서 참이지만, 실행할 프린트문이 없기 때문에 그냥 10번 돌다가
            b가 10이 되었을때(조건이 만족되지 않을때) for문을 빠져나옵니다.
            그리고 다음 문장인print문을 실행합니다. for문을 빠져나왔을 때의 b 값이 10이기 때문에 10이 출력되네요...
            10번 출력되는 것은, for(a=0;a<10;a++) 문장이 10번 돌아서 그렇습니다.
          • happy
            반복문의 중첩에서 이렇게 출력하면 10이 열번 출력됩니다.

            for(a=0;a<10;a++){
            for(b=0;b<10;b++);
            System.out.println(b);
            }

            왜 그러는건지 모르겠어요ㅜㅜ
          • lilly
            int i=0:
            i=i++:
            //0=0(1)
            이해 되셨을려나?
            가로친 값이 들어가는게 아니라 0이 들어갑니다.
            가로친건 나중에 불러들이는곳에 사용되는 값이에요
            대화보기
            • lilly
              int i=0;
              System.out.println(i);
              i = ++i;
              //1=1
              System.out.println(i);
              i = ++i + ++i;
              //5=2+3
              System.out.println(i);
              i = i++ + i++;
              //11=5(6)+6(7)
              System.out.println(i);
              i = i++ + i++ + i++;
              //11(12)+12(13)+13(14)
              System.out.println(i);
              이건 암산으론 못하겠네 ㄷㄷ
              대화보기
              • huem
                이고잉님 브레이크 라벨문 강의는없나요? 학교책에 그부분이있어서요..ㅠ
              • moby
                이해를 돕기위해 initial i(초기값 i)를 i로, 최종값 i를 j로 설정합니다.

                ++i will increment the value of i, and then return the incremented value.
                "++i 는 i의 값을 증가시킬것입니다.(i가 1이었다면 i=2가 됌) 그다음, 이것을 최종값(j)으로 되돌릴 것입니다."

                i = 1;
                j = ++i;
                (i is 2, j is 2)
                "i++ will increment the value of i, but return the original value that i held before being incremented."

                "i++ 는 i값을 증가시킬것입니다. (i=2) 하지만 그 증가값이 최종판정나기 전에 맨처음 i가 가진 최초의 값으로 되돌려질것입니다. (j=1)"

                i = 1;
                j = i++;
                (i is 2, j is 1)

                "In any case, follow the guideline "prefer ++i over i++" and you won't go wrong."
                "어쨌든, "i++ 보다 ++i를 선호해라" 라는 지침을 따른다면, 차후에 당신은 문제가 없을것입니다."



                뭐, 로마에 가면 로마법을 따르라는 말이 있듯이 이것또한 java세계의 법이니깐 그저 따를수 밖에요.

                http://stackoverflow.com......d-i
              • 포아
                아....
                대화보기
                • egoing
                  if 문의 내용이 한줄인 경우는 {}를 생략 가능합니다.
                  대화보기
                  • 포아
                    continue;부분에서 if에 {,}가 빠진것 같은데요?
                  • 고도칸
                    jamie 님도 그리 생각하시는군요,!!!
                    저도 마찬가지로,,, 너무 강의 내용이 좋습니다!!
                    알기쉽게 자세하게 가르쳐 주셔서 감사드려요~~^^
                  • Jamie
                    세상에나! 돈주고 다니는 학원도 저렇게 자상하고 자세하게 가르쳐 주질 않습니다. 이고잉님 정말 감사합니다.
                  • jeyul
                    증감연산자(++, --)는 변수에 저장된 값을 1 증가 또는 1 감소 시키는데
                    변수의 어느 쪽에 위치 하느냐에 따라 다른 값을 반환합니다.

                    전위(prefix): 증가 또는 감소가 이루어 진 뒤 바로 그 값을 반환합니다.
                    후위(postfilx): 증가 또는 감소가 이루어 진 뒤 그 이전의 값을 반환합니다.

                    (예제 소스)
                    int max=10;
                    int i = 0;
                    while (i < max) {
                    i = i++;
                    System.out.println(i);
                    }

                    위의 코드에서 i = i++; 문장의 작동을 해석해 볼께요.

                    순서는 연산자 우선순위에 따라 증감연산자 ++가 먼저이고
                    그 다음이 대입연산자 = 입니다.
                    오른쪽 항의 i++는 i의 값을 1 증가시키고 이전 값인 0을 돌려줍니다.
                    그 값을 왼쪽 항의 변수 i에 대입합니다.
                    증가되지 않은 값을 다시 자기 자신에게 넣게 되는 거죠.
                    따라서 값의 변화는 없습니다.
                    결과적으로 위의 코드는 무한적으로 돌 수 밖에 없습니다.

                    저도 늘청님의 질문을 보고 제 예상과 다르게 동작해서
                    여러가지 테스트해 보았는데요.

                    i = ++i;
                    i = ++i + ++i;
                    i = i++ + i++;
                    i = i++ + i++ + i++;

                    위 문장들의 출력값을 제대로 예상했다면 잘 이해하신 겁니다.
                    참고로 연산자 우선순위는 ++, +, = 이고 결합방식은
                    덧셈(+)은 오른쪽, 대입(=)은 왼쪽 방향입니다.
                  • egoing
                    저는 재현이 안되고 있는데 어디에서 어떤 문제가 일어나고 있는지 좀 더 상세한 설명 부탁 드려요
                    대화보기
                    • 자바왕
                      반복문 while 문에서 12분부터 동영상이 멈춰지네요 이것좀 수정해주세여
                    • LeSix
                      아... 감사합니다 ! ㅜㅜ
                    • egoing
                      배열에 있습니다. ^^

                      http://opentutorials.org......373
                      대화보기
                      • LeSix
                        질문 드립니다.
                        입력과 출력 강의에서 보면 for-each 문을 알려 주셨다고 하셨는데요...
                        아무리 찾아봐도 for-each문이 있는 위치를 모르겠네요 ㅠㅠ
                        반복문에 있는걸 놓쳤나 싶어 찾아봤는데... 어디서 알 수 있을까요?
                      • 늘청
                        네 i=i+1 로 하였을때는 정상적으로 동작하는데 다르게 해볼려고 i=i++을 해 보았었습니다.
                        제 생각에는 i=i+1 과 i=i++ 은 같이 것이 아닐까 생각했었는데 다른가 봅니다.
                        "i++"="i=i+1"로 이해하겠습니다.

                        답변 감사드립니다...^^
                        대화보기
                        • egoing
                          아래가 아닐까요? ^^
                          i = i+1;
                          대화보기
                          • 늘청
                            문과 나와 코딩은 처음 해보는 초보입니다. 무엇보다 감사드립니다.

                            아래와 같이 실행을 하였더니, "great coop0 "이 무한반복되네요.

                            "i=i++;"를 하면 i++과 동일해야 하지 않는지요? 왜 무한반복되는지 몰라 문의드립니다.


                            public static void main(String[] args) {
                            int max = 5;
                            int i = 0;
                            while (i<max) {
                            System.out.println("great coop"+i);
                            i=i++;
                            }
                          • 박운석
                            오~ 강의가 진정한 대박입니다.!!
                            저같은 돌머리도 깨우침이 팍팍 들어옵니다.
                          • egoing
                            저는 시스템을 배우고 있습니다. 시스템 알려주세요 ^^
                            대화보기
                            버전 관리
                            egoing
                            현재 버전
                            선택 버전
                            graphittie 자세히 보기