현 블로그는 모바일 환경이 아닌 PC환경에 최적화 되어있습니다.

 Mir의 운영환경


4. 반복문



반복문으로 들어왔다!

반복문은 말그대로 반복을 시킬때 쓰는명령어이다.

1부터 100까지 더하라는 식이 있는데 int a =1 + 2+ 3+ 4+... 이렇게 일일이 다 칠순 없지 않는가

그것을 프로그래밍 하여 컴퓨터에게 1부터 100까지 더하라는 명령을 내리는게 프로그래머이다.


그럼 반복문에 대해서 알아보자!


첫번째 가장많이 쓰이는 for.

for문의 기본공식 아래와 같다.



for (초기화 조건식;  증감식)

{

   조건식이 true일때 반복되어 실행될 명령(반복문)

}



초기화라는 말이 생소하게 들릴수도 있다필자가 앞서 한번만 언급하고 까먹고 있었다.... ;;;

초기화란 a라는 저장공간에 X라는 값을 대입시키는 것을 초기화라고 한다어렵게 생각하지 말자.

공식만 보고는 이해하기가 살짝 어려울수도 있으니 간단히 반복구문을 3번 

반복시키는 for문을 작성해보자.


for int i = 0 ;   i  <  3 ;  i ++

{

  조건식이 true일때 실행될 명령(반복문)

}


for문을 일단 선언하고 난뒤 괄호를 열고 제일 처음하는것이 변수의 초기화이다.

보통 변수의 선언까지도 여기서 같이 한다필자는 i라는 변수를 int형으로 선언한뒤 

0으로 초기화를 하였다.


그리고 난뒤 조건식 적는데 i < 3 이라고 적었다.

이것은 i 3보다 작으면 아래 명령을 계속 반복한다는 뜻이다.


마지막으로 i++라고 증감식 적어놓았다

 이제  식이 어떻게 움직이는 보도록 하자아래 그림을 클릭하면 진행사항이 보일것이다. 



(클릭하세요)

 

 그림에서 보듯이 { } 세번실행시키고 난뒤에 for구문을 벗어나게 되었다.

조건식을 i < 5  적으면 5번을 i < 100으로 적으면 100번을 반복하게 되는것이다.

여기서 주의할점! i 값을 처음에 0으로 초기화 했기때문에 3번을 반복한것이다.

만약 i 2 초기화를 하면 1번을 실행한뒤 for구문을 빠져나갈것이다.

 

 

 이제 for문을 가지고 1 부터 10까지를 더해보자.


public class Ex4_1 {

 public static void main(String[] args) {


  int sum = 0;

  //우선 더해질 값을 저장할 변수 sum 만들었다.

  //필자가 배울때 누가 누적함수라고 말했었는데..

  //말만 누적함수지 그냥 int 함수이다..

  //(이것때문에 한참 헷갈렸다 ;; 함수종류가 또있는줄알고..)

  

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

   

   //1부터 10까지의 덧셈이기 때문에 i 1 초기화 해주었다.

   //그리고 10 될때까지 반복하기 위해 조건식을 i <=10 주었다

   //i++ = 한번 반복할때마다 i 1 증가한다.

   

   sum += i;

   

   //반복구문이다. sum = sum + i 줄인형태가 sum += i 이다.

   //연산자에서 설명했던걸로 기억한다.

   //첫번째 반복에선 i 1이기때문에 sum 1 들어갈것이다.

   //두번째 반복에서는 i 2이고 sum 1이여서 sum 3 들어갈것이다.

   //계속 반복하여 10까지의 합을 구하는것이다.

   

   System.out.println( i + "까지의 " +sum);

   

   //자세한 진행사항을 알아보기위해 반복문이 한바퀴 돌때마다

   //i 그때까지의 합을 출력시켰다.

   //각자 한번씩 실행해보기 바란다.

  }

 }

}


위 예제를 실행시키면 반복문이 한바퀴 돌때마다 i만큼의 값이 늘어나는게 보일것이다.

다들 1에서 100까지 한번 더해보기 바란다.



for구문의 기본적인 구조에서 주의할점이 하나 있다.

그것은 초기화 할때 for문에서 선언된 변수는 for문을 끝나면 사라진다.

(후에 자세히 배울거지만 { }(영역이라고 생각하자) 안에서 변수를 선언 하였을때

그 { }를 나가면 선언 했던 변수는 메모리에서 사라지게 된다.

위의 변수는 { } 안에 있는건 아니지만 for문의 영역에서 선언을 하였기 때문에

for문을 벗어나면 사라지게 되는것이다.)

for문을 벗어나도 사라지지 않게 할려면 변수의 선언을 먼저 하고 난뒤 for구문에서

초기화를 시켜주면 된다. 

위의 1~10까지 더하는 구문같은경우 i를 for문을 벗어나서 출력을 시도하면

바로 오류가 뜰것이다.




이제 좀더 심화로 들어가서 for문안에 for문을 한번 넣어보자.

public class Ex4_2 {



 public static void main(String[] args) {


  for(int i=1; i<=3; i++){

   for(int j=1; j<=3; j++){

    for(int k=1; k<=3; k++){

     System.out.println(""+i+j+k); }}}


 }

}


위 예제를 보면 for문 안에 또 for문 그안에 for문이 하나 더 들어갔다.

이 구문이 어떻게 움직일지 한번 생각해보기 바란다.




자 처음부터 보자 일단 변수 i를 선언하여 i<=3이란 조건을 주었다.

i가 1이 되어 첫 반복구문을 실행할때

두번째 for문이 변수 j를 선언하여 j<=3이라는 조건을 가졌다.

j 또한 1이 되어 첫 반복구문을 실행하는데

마지막 for문이 변수 k를 선언하여 k <= 3 이라는 조건을 수행한다.



이제 예제를 뒤에서부터 한번 보기 바란다.


k변수를 가진 for문이 3번을 반복하게 명령을 내렸다.

i와 j와 k를 출력하라는 명령이다.

i와 j가 1의 값을 가지고 있으니

111, 112, 113을 출력할것이다.

그렇게 반복구문이 끝냈는데

j가 2의 값을 가지고 다시 k변수를 가진 for문을 호출한다.

그러면 k는 다시 3번을 반복하여.

121,122,123을 출력할것이다.

한번더 j의 for문에 가지만 j는 아직 2번을 반복했기때문에 

한번더 k의 for문을 호출한다.

3번의 반복을 한번더 마친 k는 j를 부르고 j 또한 3번의 반복을

마쳤기 때문에 i를 불렀는데 i는 이제 한번을 반복했을뿐이다.

그렇게 또 j와 k가 반복하고 i가 세번까지 반복하고 난뒤

프로그램은 종료된다.


i가 한번돌때 j는 3번을 돌게 되고 j가 1번을 돌때 k가 3번을 돌게 되니

즉 i가 한번돌때 k는 9번을 돌게 된다.

이렇게 for문안에 for문이 있을때에는 반복횟수 * 반복횟수 만큼 반복이 실행된다.


위 예제는 3(i) * 3(j) * 3(k)  도합 27번의 반복이 실행된다.

(참고로 필자가 위의 예제도 플래시로 만들려다가 저 위의 for문 반복도 꽤 시간을 잡아먹었는데

 이건 대략 80개의 그림을 만들어야 되서 포기했다.. 대신 글로 이해가 되었으면 좋겠다.)



자 이제 for문에 대한 대략적인 개념이 머리에 들어왔을꺼라고 생각한다.


그럼 반복문의 기초예제 구구단을 for문으로 한번 만들어 보도록 하자.


일단 생각을 한번 해보도록 하자.

구구단을 만들때 변수가 몇개가 있어야 할지 조건식으로 범위는 몇부터 몇까지 해야될지

반복은 몇번을 해야될지 한번 생각해보도록 하자. 



생각이 끝났으면 아래 예제를 보기로 하자.


public class Ex4_3 {


 public static void main(String[] args){

  

   for(int i=2; i<=9; i++)

   //구구단을 외울때 1단을 외우는사람은 없을것이다.

   //2단부터 시작하기 위해 i 2 초기화 하였다.

   

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

    // 변수 i 2일때 변수 j 1~9까지 반복 될것이다.

    //그리고 i 3 되면 다시 1~9까지 반복 될것이다.

    

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

        // 반복문을 2 * 1 = 2  형태가 되도록 출력시켰다.

  

 }

}


매우 간단하다. 이제 for문의 사용방법을 익혔으니 문제로 응용을 해보자.

for문의 예제는 정말 재미있는것이 많은데 여기서 다 적으며 설명을 하면 지루 할꺼 같으니

왠만한건 for문의 문제에 적어 놓고 답에 설명을 하겠다.

한번씩 풀면서 답을 보면 더욱더 빨리 익힐꺼라고 필자는 믿는다. 






이제 두번째인 while을 살펴보자.

while문과 for문은 똑같이 반복문이지만

보통 for문은 몇번을 반복시킨다는 개념이 강하고

while문은 조건을 만족할동안 반복시킨다는 개념이 강하다.


while문은 for문보다 매우 간단한 구조를 가지고 있다.

기본공식을 보면


while(조건식){

조건식이 true일때 반복되어 실행될 구문(반복문)

}


끝이다. 너무 간단하다.

하지만 간단한 만큼 함정이 있다.


while문은 필수사항이 조건식밖에 없기때문에

반복문안에 증감식 혹은 while문을 빠져나가는 식을 적어 두어야된다.

만약 그렇지 않으면 프로그램을 끄지 않는 이상 평생 반복을 할것이다.

간단한 예제를 들자

int i = 10;

  while(i > 0){

   System.out.println(i);

  }


자 위 예제에 i를 10으로 초기화 하고 난뒤  

i가 0보다 클때에는 i를 출력하라고 명령을 내렸다.

처음 i를 출력하고 나서 조건식을 비교하였을때 i는 아직 10이다.

다시 반복문을 출력하고 난뒤 조건식으로 왔는데 i는 아직 10이다. 

끝없이 반복하게 되는것이다.

그래서 반복문 안에 증감식을 넣어 빠져나올수 있게 만드는것이다.

int i = 10;

  while(i > 0){

   

System.out.println(i);

i--;

  }


자 이제 위예제를 보면 반복문을 한번씩 돌때 마다 i는 1씩 작아진다.

결국 10번을 반복하고 멈추게 될것이다.


이처럼 while문은 반복문 안에 반복을 멈추게 할수 있는 요소를 꼭 넣어두어야 한다.

그것만 지킨다면 while문은 for문보다 더욱 쉽고 간편하게 사용할수 있다.


자 그럼 while문으로도 구구단을 한번 만들어 보자.

public class Ex4_4 {

 public static void main(String[] args) {

 

  int i = 2;

  int j = 1; //변수 i j 각각 2 1 초기화 하였다.

  

  while(i<=9){    // i 9가될때까지 반복하도록 조건을 주었다.

   while(j<=9){  // j 9가될때까지 반복하도록 조건을 주었다.

    

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

    j++;

    //출력 하고 난뒤 j 1 증가하도록 만들었다.   

   }

   i++;

   j = 1;

   //while(j<=9) 구문을 벗어난뒤에 i 1 증가하도록 만들었다.

   //이러면 j 9 반복하고 난뒤 i 1 증가 될것이다.

   //만약 j 범위에서 i++ 넣으면 j 1 증가할때 i 1 증가하여서

   //2*1 = 2, 3*2 = 3 이런식으로 출력이 될것이다.

  }

 }

}



for문과 많은 차이가 없을것이다. 다만 초기화를 먼저 하였고 증감식을 반복구문안에

넣어 주었을뿐이다. 


자 이번엔 위에서 말한 조건을 만족할때까지 반복한다는 것의 뜻을 한번 알아보자.

아래는 1부터 순서대로 더해서 누적합계가 100을 넘으면 덧셈을 멈추게 하는 프로그램이다.

public class Ex4_5 {


public static void main(String[] args) {


int sum = 0;

int i = 1;  

//합계를 누적할 변수 sum 변수 i 0 1 초기화 해주었다.

while(true){

//조건식에 true 주면  값이 무조건 true이기 때문에 무한반복한다.

   sum += i;

i++;

System.out.println( i+ " - " + sum);


//이제 위의 식이 무엇을 뜻하는지는 알거라고 믿는다.


if(sum >= 100)break;

// 여기가 중요하다while 안에 if문이 들어왔다

//만약에(if) 누적합계가(sum) 100이상이 되면 break 실행한다.

//라는 뜻이다.

//break 앞서 한번 언급했을것이다.

//{ } 빠져나가는 명령이라고 switch문에서 설명했다.

//여기서는 while문을 빠져나가게 될것이다.

}

}

}


자 위의 예제를 보면 break가 나온다.

break는 앞서 switch문에서 나왔듯이 현재돌고 있는 { }(영역)를 빠져나가라는 명령어다.


위 예제에서 합계를 누적시키고 있는 sum이 100이 넘으면 반복문을 빠져나오게 된다.


이처럼 while문에서는 if와 함께 조건을 걸어놓고 그 조건을 만족하면

빠져나가라는 형태로 많이 쓰인다.

후에 가면 조건이 이런 계산형태가 아닐때가 더 많다. 나중에 골치 아프다.

(현재 필자가 이거때문에 좀 짜증날때가 있다..;;)


아무튼 break문도 꼭 숙지해놓기 바란다.

그리고 break와 함께 반복문에서 자주쓰이는것이 있는데 continue문이다.


continue문은 그 반복만 벗어난다라는 뜻을 가지고 있다.


break는 실행되면 그 반복문을 완전히 벗어나지만

continue는 한번의 반복만 벗어나며 다음반복은 계속 실행이 되는것이다.


자 어떻게 다른지 예제를 한번 살펴보자.


public class Ex4_6 {


 public static void main(String[] args) {



int i = 0;

  while(true){

   i++;

   

   if(i==10) break;

   // 여기까지 i 1 늘려서 10 될경우

   // 반복문을 빠져나가도록 프로그래밍 하였다.

   

   if(i%2==0) continue;

   //만약에(if) i 2 나눠서 나머지가 0이면

   //(i%2=0) 아래에 있는 구문을 건너뛰어라.(continue;)

   

   System.out.println(i);


  }

 }

}


위 예제를 출력하면 2의 배수 즉 짝수는 출력되지 않고 홀수만 출력 될것이다.

그리고 i가 10이 될경우 break! 반복구문을 빠져나오게 되는것이다.


그런데 여기서 주의할점이 break와 continue의 순서이다.

만약 위 예제에서 break가 continue의 아래에 있으면 어떻게 될까?


i가 10이 되었을때 continue는 자신의 아래에 있는 구문을 건너뛰고 다시 반복하게 될것이다.

그러면 10이 break구문에 들어가지 못하고 무한 반복하게 되는것이다.

한번 순서를 바꿔서 실행해보기 바란다.





이제 반복문의 마지막 while의 변형문 do-while이다.

do-while문의 특징은 조건이 false라도 꼭 한번은 실행시키는것인데

그것을 제외한 모든것은 while문과 같다.

일단 기본공식을 보도록 하자


do { 
조건문이 true일때 반복실행시킬 명령(반복문)

while (조건식)


while은 조건식이 반복문이 나오기 전에 있었지만

do-while은 조건식이 반복문이 나오고 난후에 있다.


그래서 do-while문은 조건식에서 true, false를 정하기전에

반목문을 한번 실행시키고 난뒤 조건식과 비교하게 되는것이다.
( 즉 while문은 조건검사 - 실행 - 조건검사 - 실행의 루프를 돌게 되고
do-while문은 실행 - 조건검사 - 실행 - 조건검사의 루프를 돌게 되는것이다. )


그외에는 while문과 같기때문에 더이상 따로 설명하지 않겠다.

(필자도 do-while의 사용용도는 아직 확실히 모른다. 후에 확실하게 알게되면 추가및 수정하겠다.)






------------------------------------------------------------------------------------
본 블로그의 글을 퍼가실때 꼬릿말, 퍼가시는곳 주소를 꼭 남겨주세요. 
출처 꼭 기재해주시고요. 상업적인 용도의 이용은 절대 금합니다.
혹 프린트를 할 경우 블로그주소와 함께 프린트 해주세요.
허락을 맡지 않고 무단도용을 할경우 법적인 제제가 있을수도 있습니다. 
(전 분명히 경고했습니다. 합의같은거 안합니다.)
그리고 혹 무단도용한것을 보신분은 신고해주시면 사례금 챙겨 드리겠습니다.
-----------------------------------------------------------------------------------


+ Recent posts