Media Log


1. for


지금 배울 for문은 앞서 배운 while문과 비슷합니다. 하지만 확연히 다른게 있습니다. 

while문은 카운터 변수(반복 횟수), 그리고 반복 조건, 탈출 연산이 흩어져있으며, for문은 한줄에 모두 나열됩니다.


int i = 0;


while (i<5) {

System.out.println(i);

i++;

}

<while문의 경우>


for(int i = 0; i<5; i++)

System.out.println(i);

<for문의 경우>


보기에도 while문보다 for문이 훨씬 간결하죠? 이 for문은 주로 수행 횟수가 주어질 때 많이 사용하고, while문은 루프를 돌다 어느 조건만족시 결과를 얻어 탈출할 때 많이 쓰입니다. for문으로 할수 있는것을 while문으로도 할수있고, while문으로 할수 있는것을 for문을 이용해 구사할 수 있습니다. 즉 둘의 완벽 대치가 가능하다는 것을 말합니다. 

(for문과 while문의 수행 속도 차이는 미미합니다.)   


차이점은, for문에서의 카운트 변수 수명은 루프를 돈 후에 바로 소멸되기 때문에 while문 보다 짧습니다. 그리고 가독성을 높이기 위해 상황에 따라 적당한 것을 선택하여 사용합니다.


다음 예제를 보고, for문의 실행 흐름과 결과를 추측해봅시다.


class ForLoop {

    public static void main(String[] args) {

for(int i = 0; i<10; i++)

System.out.println(i);

    }

}


결과:

0

1

2

3

4

5

6

7

8

9


결과를 확인하고 코드로 돌아가, 예제의 3행을 보시면 for문이 사용된 것을 보실 수가 있습니다.


for (①초기식; ②조건식; ③증감식) {

④실행 문장;

}


여기서 초기식이란 처음에 한번만 실행되며, 값의 초기화가 이곳에 위치합니다. 이 초기식을 생략할 수도 있으며, 콤마를 이용해 초기식을 여러개 둘 수 있습니다. 그리고 두번째, 조건식은 while문과 동일합니다. 이 조건이 거짓이 되면 루프를 빠져나옵니다. 세번째, 증감식은 루프 탈출을 위한 연산이 진행되는 곳입니다. 콤마를 사용해 두개 이상의 증감식을 둘 수 있습니다. 


초기식, 조건식, 증감식의 구분은 세미콜론(;)으로 구분합니다. 실행 흐름을 살펴보면,

① -> ② -> ④ -> ③ -> ② -> ④ -> ③ -> ② -> ④ -> ③ -> ② -> ④ -> ③ -> ... -> 조건 만족 시 탈출


즉, 초기화가 처음에 한번 이루어지고 그 다음부터는 조건식, 실행문장, 증감식의 반복입니다. 그러다가 조건을 만족하면 탈출되는 흐름을 띄고 있습니다. 이해가셨나요? 이해가 모두 되셨으면, 이제는 실행 흐름의 컨트롤을 돕는 continue, break 키워드에 대해 알아보도록 하겠습니다.


2. continue


continue문은 반복문의 조건 검사 부분으로 이동시켜 실행을 이어나가는 역할을 합니다. 


for문에 직접 사용해봅시다. 굳이 for문이 아닌 while문, do~while문에도 적용할 수 있습니다.


class ForContinue {

    public static void main(String[] args) {

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

if ((i % 4) == 0) // 4의 배수는 출력을 건너 뛴다.

  continue;


System.out.print(i + " ");

}

    }

}


결과:

1 2 3 5 6 7 9 10 11 13 14 15 17 18 19


코드를 살펴봅시다. 4행의 조건을 만족하면 5행의 continue문이 실행되게 되어있습니다. 즉 'i를 4로 나눈 뒤에 나머지가 0이라면 continue문을 실행하겠다'란 말과 같습니다. 이것은 'i가 4의 배수라면 continue문을 실행하겠다'란 말과 같기도 합니다. 맨 처음에 i의 값이 0인데, 0은 나눌 수가 없으므로 그대로 0이 나와버려서 continue문으로 인해 조건 검사 부분으로 이동하여 계속 반복을 진행합니다. 그러다 1, 2, 3은 4로 나누면 0이 아니므로 이것은 그대로 출력됩니다. 그 다음부터 나오는 4는 조건을 만족하여 continue문을 실행시키고 조건 검사부로 다시 돌아갑니다.


<continue>


3. break


break문은 switch문에서 배운적이 있죠? 혹시나 기억하지 못하시는 분들을 위해 간략하게나마 다시 설명합니다.

break문은 말 그대로 '탈출하다'라는 의미를 가지고 있으며 switch문이나, 조건에 따라 반복문을 탈출하고 싶을때 사용합니다.


아래의 예제는 무한 루프에 break문을 적용한 예제입니다.


class InfiniteLoop {

    public static void main(String[] args) {

int i = 0;

while (true) {

  if (i==50) break

  System.out.print(i + " ");

  i++;

}

    }

}


결과:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49


여기서 무한 루프란, 항상 참이 되어 반복문을 빠져나가지 못하고 계속 루프를 도는 것을 말합니다. 무한 루프는 'JAVA 강좌 10편. 반복문 (1)'에서 이미 언급한 적이 있습니다.


5행에서 while문의 반복 조건 부분에 true(참)이 왔습니다. 이는 의도적인 무한 루프로, 조건 부분이 항상 참이므로 무한 루프를 돌게됩니다. 6행에선 i가 50일 경우에 반복문을 탈출할수 있게끔 break를 걸었습니다. 반복이 진행되면서 i를 출력 후에 i의 값이 1씩 증가하고 49까지 출력하다가 50이 되는 순간 조건이 만족하여 반복문을 빠져나옵니다.  


4. 다중 반복문


여태까지 우리가 배운 반복문은 while, do~while, for문이 있었습니다. 이것을 서로 중첩시켜, 반복문 안에서 또 하나의 반복문을 삽입할 수 있습니다. 그렇다면 중첩할 수 있는 반복문의 종류는 몇가지가 있을까요?


(for, for), (while, while), (do~wihle, do~while), (for, while), (while, for), (do~while, for), (for, do~while), (do~while, while), (while, do~while)로 총 9가지(3x3)가 있습니다. 하지만 꼭 두개의 반복문을 중첩시킬 수 있는게 아니고, 3중 반복문(for, for, for 또는 while, while, while 등등), 4중 반복문(for, for, for, for 또는 while, while, while, while 등등) 여러번 중첩이 가능합니다. 그렇지만 많이 사용되는건 2중 반복문입니다. 


직접 다중 반복문을 사용하여 봅시다. 우선 가장 많이 쓰이는 for문의 중첩을 보겠습니다.


class MultiLoop {

    public static void main(String[] args) {

for (int i=2; i<10; i++) {

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

System.out.println(i + " X " + j + " = " + i * j);

}

    }

}


결과:

2 X 1 = 2

2 X 2 = 4

2 X 3 = 6

2 X 4 = 8

2 X 5 = 10

2 X 6 = 12

2 X 7 = 14

2 X 8 = 16

2 X 9 = 18

...

...

9 X 1 = 9

9 X 2 = 18

9 X 3 = 27

9 X 4 = 36

9 X 5 = 45

9 X 6 = 54

9 X 7 = 63

9 X 8 = 72

9 X 9 = 81


코드로 돌아가, 3~6행을 보면 다중 반복문이 쓰이신 것을 확인할 수 있습니다. 총 72번(8x9)의 반복을 진행합니다. 단 4줄의 코드로 72줄을 표현할 수 있습니다. 정말 간편하죠? 이밖에도 다중 반복문은 여러곳에서 쓰입니다.

  1. 간큰넘 at 2012.08.17 10:58 신고 [edit/del]

    브리크문 코드예제에서 문자열 " " 비어있는데..
    그냥 문자열 빼주고 i로만 넣주면 안되나요?
    println 이라서 "" 요게 꼭 들어가야되나요?
    50까지는 출력결과를 안보여주고 49까지만 보여주네여.ㅋ

    Reply
    • BlogIcon EXYNOA at 2012.08.17 11:06 신고 [edit/del]

      50에서 break문을 만나 반복문을 탈출하기 때문이죠.

      만약 50까지 출력하고 싶으시다면,
      i와 50이 같을 경우에 break문이 아닌, 51과 같을 경우에 break문을 만나게 해주시면 0부터 50까지 출력됩니다. 아니면 단순히 출력되는 i의 값에서 1을 더해주시면 1~50의 값이 나오구요.

      공백은 단순히 출력된 숫자들을 알아볼 수 있게 하기 위함입니다. 만약 공백을 안쓰시고 println을 쓰셔도 상관은 없습니다.

  2. 김승현 at 2012.10.04 02:57 신고 [edit/del]

    감사합니다~

    Reply
  3. jinlak at 2013.04.27 13:49 신고 [edit/del]

    if ((i % 4) == 0) 가 4의 배수는 건너뛴다라는 거라고 했는데
    왜 그런건가요??

    Reply
  4. jinlak at 2013.04.27 17:22 신고 [edit/del]

    감사합니다.

    Reply
  5. o9o9 at 2017.09.26 14:33 신고 [edit/del]

    궁금한게 조건문에 i++뒤에는 왜 ;를안붙이죠 ??

    Reply
    • BlogIcon EXYNOA at 2017.09.27 16:11 신고 [edit/del]

      기본적으로 세미콜론(;)은 두 대상을 구분하기 위해 사용되는 것입니다. for문과 같은 경우는 초기식과 조건식, 증감식을 각각 구분하기 위해 사이에 세미콜론이 들어가는 것입니다.

  6. skawk4 at 2018.10.14 23:30 신고 [edit/del]

    continue문에서 System.out.println(i +" "); 이건왜하는건가요??
    System.out.println(i); 이렇게 넣어도 똑같이출력되는데 " " 는왜넣는건가요?

    Reply

submit

티스토리 툴바