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. 진진자라
    넵 감사합니다 공부는 하고 있는데 해결은 되었는데 답변주셔서 감사합니다^^
    대화보기
    • 귀여운오징어
      안녕하세요?? 진진자라님 제가 진진자라님께서 구현하고 싶으신 코드 작성했는데 도움이 될지는 모르겠습니다.
      그런 경우는 이중 반복문을 써주면 됩니다.

      package calculation;

      public class repeat_3 {

      public static void main(String[] args) {
      while (true) {
      for(int i=15; i>0;i--) {
      if(i<=10)
      continue;
      System.out.println("continue는 멀까.."+i);}

      }
      }

      }

      보시면 while(true) 문이 for 문을 안고 있죠! 이게 바로 이중 반복문입니다.
      이중 반복문 코드 구현할 때 은근 많이 쓰이더라고요!
      공부에 도움되셨으면 좋겠습니다.
      대화보기
      • 오션멍키
        210822 완료
      • super1Nova
        210811
      • B=loom
        21.07.20
      • 진진자라
        2번만 반복이라 이게 무한 루프식으로 반복하게 만들고 싶은데 정해진 범위내에서만 반복해서 문자 출력이 가능하나 해서요.. 일단 감사드립니다 ㅎㅎ
        대화보기
        • 21.05.18 start
          public static void main(String[] args) {
          for (int y = 0; y < 2; y++) {
          for (int i = 15; i > 0; i--) {
          if (i <= 10)
          continue;
          System.out.println("continue는 멀까.." + i);

          for문 하나 더 추가하고 동작하면 y < 2 부분에 따라 반복하긴 하는데.. 이건 도움이 안되시려나요?
          대화보기
          • 쓰느이이
            20210522
          • 진진자라
            질문 있습니다.
            for(int i=15; i>0;i--) {
            if(i<=10)
            continue;
            System.out.println("continue는 멀까.."+i);}

            결과
            continue는 멀까..15
            continue는 멀까..14
            continue는 멀까..13
            continue는 멀까..12
            continue는 멀까..11
            일때에
            위에 결과값만 무한으로 반복하게 하려면
            i--를 지워야 하나요 아님 코드 하나를 더추가해야하나요?
          • 악어수장
            5.12 2회독 완료
          • 개발꾸꾸
            5.11
          • 드림보이
            수강완료했습니다...
          • 김강솔
            이 기능이 없다면 어땟을까? 생각하면서 공부하는 기분 좋은 말 인거 같아요
          • Ruinark
            21.03.19 완료!
          • 김청수
            21.02.28 일 완료!
          • kkn1125
            21.02.16.토 완료~!
          • 하연주
            210205 완료
          • neverdie
            if if 하자
          • 김민혁
            21/1/10 수강 완료
          • 박소영
            정말 최고의 수업입니다.ㅜㅜ
          • 호롤롤롤
            201227 완료
          • 코린이
            202011.22 학습완료
          • 최형빈
            20201115 시청완료
          • 자바남
            자바남 수강완료 !
          • 내꿈은 연봉 1억
            오 감사해요
            대화보기
            • 내꿈은 연봉 1억
              시작이 제일 어렵긴 하죠...
            • 오석민
              2020.09.21
            • 초밥왕
              반복문의 중첩을 드디어!! 내 것으로 만들었다니 너무 기쁘당
            • 김태현
              3회완주

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


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


              // break는 스톱
            • hvii
              20200807 학습완료
            • yulrinam
              200803 시청완료 감사합니다 :)
            • EunSeok Kang
              20200803 강의 잘듣고 갑니다.
            • 김개발
              가운데에 문자값인 "" 이게 포함되지 않으면,
              숫자값인 i와 j가 사칙연산이 되어서 우리가 원하는 1부터 99의 값이 나오지가 않아요.
              그러니까 사칙연산되지 않게 "" 이 문자값이 방해해주고있어요.
              대화보기
              • yuji
                자바 왕초보 2일차 완료

                반복문은 똑같은 명령을 반복해서 수행하는 것이고 종류에는 for문,while문이 있다.
                반복문의 조건에 따라 결과값이 달라지고 조건을True라고 하면 무한 반복이 된다.
                반면 False라고 하면 실행이 되지 않는다.
                break문은 반복작업을 하고 있는 것을 멈추고 싶을떄 사용한다.
                continue문은 특정 조건과 일치하면 멈추고 다시 반복문이 실행된다.
              • mania
                물어보지도 않았지만, 답을 찾았네요 ㅎㅎ
                대화보기
                • 20200321
                • 저두 초보이지만 제 생각에는
                  시작하는 숫자 차이
                  그리고 끝을 맺는 숫자 차이 같네요
                  int a = 0;
                  while (a < 10) {System.out.println("coding every body" +a); ++a;}
                  }
                  // a가 0으로 설정했고 +1씩해서 출력하고 9까지 출력하라고 했으니
                  출력 값은
                  coding every body0 ~ coding every body9 까지 출력 되는데

                  int a = 0;
                  while (++a < 10) {System.out.println("coding every body" +a); }
                  }
                  // a가 0으로 값을 지정했는데 ++a는 0+1부터 9까지 이니까
                  출력 값은
                  coding every body1 ~ coding every body9

                  int a = 0;
                  while (a++ < 10) {System.out.println("coding every body" +a); }
                  }
                  // 자세한건 모르지만 a=0이고 a++ = 1이니까 1부터 ~ 9까지 인데 a++ 가 붙으니 뒤에 +1을 하라는 의미니까
                  출력 값은
                  coding every body1 ~ coding every body10

                  이렇게 되는게 아닌가 싶네요 ㅎㅎ 저두 초보라서 ... 답글 다는게 ;; 오바지만 ;; 제 의견입니다 ; ㅎ
                  대화보기
                  • 초보
                    궁굼한점이있습니다..
                    int a = 0;
                    while (a < 10) {System.out.println("coding every body" +a); ++a;}
                    }
                    이렇게 작성하셨는데
                    제가 이것저것 해봤는데
                    int a = 0;
                    while (++a < 10) {System.out.println("coding every body" +a); }
                    }
                    이렇게해도 결과는 도 출되더라구요
                    강의에있는 방법과 제가찾은 방법의 차이가 있을까요?
                    한가지더
                    int a = 0;
                    while (a++ < 10) {System.out.println("coding every body" +a); }
                    }
                    이렇게 코딩하면 결과는 10까지 출력이됩니다.
                    저번 강의에있던 a++의값은 바로 출력되지 않고 다음으로 넘겨지는 원리와 같아서
                    <10이랑 비교되지 않고 그냥 10으로 출력이 되어버린 건지 궁금합니다.
                  • 흐무
                    2020-02-29 복습완료
                    반복문: if,for,while
                    반복문 안에 break를 만나면 반복문의 실행이 종료되고 바깥에 빠져나오고 아래 코드가 존재하면 실행해준다.
                    for문이 중첩되어 있으면 위에 있는것을 실행하고 아래에 있는 for문을 실행하고 반복한다. 아래 for문이 종료가 안되었기 때문에 조건을 만족할때 까지 반복하고 만족하면 다시 위에 있는 for문으로 넘어가 실행이 되는데 변수의 값을 초기화 시켰기 떄문에 0부터 시작한다.
                  • gwoonie
                    i + j를 하게 되면 i와 j 를 더하기 때문에 i + "" + j 를 한것입니다.
                    ""를 넣어줌으로써 공백을 넣어서 두 숫자를 합산되지 않게 하는거죠
                    대화보기
                    • 과연다볼수있을까?
                      200105 완
                    • 주니어개발자
                      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); // 질문: i+j는 왜 안될까요 ???
                      }
                      }
                      }

                      }
                    • 초보예요
                      답변 감사해요~~
                      대화보기
                      • 자바에서 if(조건){ 조건에 맞을 경우 실행}이지만
                        한줄만을 실행하려 한다면

                        if(조건) 조건에 맞을 경우 실행
                        또는

                        if(조건)
                        조건에 맞을 경우 실행

                        모두 같습니다. 다만 이러한 코드는 질문하신 것처럼 헷갈리고 좋은 방법이 아니므로 쓰는 것을 지양하는게 좋다고 하네요^^
                        대화보기
                        • 초보예요
                          break문 코드 중

                          ipackage org.opentutorials.javatutorials.loop;
                          public class ContinueDemo {
                          public static void main(String[] args) {
                          for (int i = 0; i < 10; i++) {

                          ====> if (i == 5)

                          break;
                          System.out.println("Coding Everybody " + i);
                          }
                          }
                          }

                          if (i == 5) 에서 왜 중괄호나 세미콜론이 없나요?
                        • 없으면안돼요
                          수강완료
                        • 이재우
                          완ㅇ
                        • 주드
                          11.11일 완료
                        • 엘비
                          20191105 완료
                        • gwonran
                          19/10/20 복습완료
                        버전 관리
                        egoing
                        현재 버전
                        선택 버전
                        graphittie 자세히 보기