Java의 반복문

나는 프로그래밍과 컴퓨터의 발달한 가장 큰 이유는 귀찮은 작업을 반복하지 않고 자동적으로 처리해주기 위한 갈망에 의해 만들어 졌다고 생각한다.

그런 관점에서 반복문은 프로그래밍 언어에는 없어서는 안될 문법 중에 하나이다. 특정 작업을 반복함으로서 능률을 올릴 수 있다. 반복문을 학습해본다.

  • for문
  • while문

for문

반복문을 만들 때 가장 중요한 것은 어떤 작업을 몇번 돌릴것인가? 이다.

예를 들어 “안녕하세요” 문자열을 5번 실행하여 찍고 싶을 때 이런 방법을 이용할 수 있다.

class forClass{
    public static void main(String[] args){
        //반복문을 사용하지 않는 방법
        System.out.println("안녕하세요");
        System.out.println("안녕하세요");
        System.out.println("안녕하세요");
        System.out.println("안녕하세요");
        System.out.println("안녕하세요");
    }
}
안녕하세요
안녕하세요
안녕하세요
안녕하세요
안녕하세요

결과는 정상적으로 5번이 출력된다. 하지만 10000개의 “안녕하세요” 문자열을 출력하고 싶다면 어떻게 해야할까?

예제처럼 System.out.println을 10000번을 써도 출력은 되겠지만, 반복적인 코드가 너무 많기 때문에 좋은 방법은 아니다.

이럴때 반복문을 이용하면 보다 쉽고 간단하게 문자열을 출력할 수 있다. 반복문에서 가장 중요한 것이 어떤 작업을 몇 번 돌릴 것인가? 라고 설명했다. 우리는 지금 “안녕하세요”문자열을 출력 시키는 작업(어떤 작업)1000번(몇 번) 돌릴 것이다.

class forClass{
    public static void main(String[] args){
        //반복문을 사용하는 방법
        for(int i=0; i<10000; i++){				  //몇 번
	        System.out.println("안녕하세요 " + i);	//어떤 작업
        }
    }
}
안녕하세요 0
안녕하세요 1
.
.
.
안녕하세요 9999

단 3줄만으로 안녕하세요를 10000번 찍는 코드를 만들었다. for문에 대해 더 살펴보자.

for문의 사용방법

for( 초기화; 조건문; 연산식){
  반복이되는 로직(처리)
}
이후 로직
  • 초기화: 루프가 돌아가는 상태를 확인하기 위한 변수를 선언하거나 초기화한다.
  • 조건문: 초기화 단계에서 설정된 변수가 어떤 조건을 만족할 때 반복문을 실행할 것인지 결정한다.
  • 연산식: 변수가 증가하거나 감소하는 방식을 결정한다. 이 연산에 따라 조건문을 만족할지 안할지 결정된다.
  • 진행 순서
  • (초기화) > (처리) > (연산식) > (조건문 검사) > (참?) > (처리) > (연산식) > (조건문 검사) > (참?) > (처리) ​ │ ​ └>(거짓?) > (반복문을 탈출) > (이후 로직 수행)
  • ※초기화는 한번만 수행한다.

예제 코드

class forClass{
    public static void main(String[] args){
      	int i;
        for (i=0; i<10; i++){
          System.out.println("i의 값이 증가해요! "+i);	//i
        }
      	System.out.println("탈출 후 i의 값: "+i);
      	System.out.println("이 후의 코드");
    }
}
i의 값이 증가해요! 0
i의 값이 증가해요! 1
i의 값이 증가해요! 2
i의 값이 증가해요! 3
i의 값이 증가해요! 4
i의 값이 증가해요! 5
i의 값이 증가해요! 6
i의 값이 증가해요! 7
i의 값이 증가해요! 8
i의 값이 증가해요! 9
탈출 후 i의 값: 10
이 후의 코드

변수 i는 루프의 상태를 나타내기 위해 선언되고 사용된다.

i가 0으로 초기화 되어있고, 루프가 한번 돌때 마다 i의 값을 1씩 증가시킨다.

그러다 i가 9에서 10으로 증가되고 더이상 조건문을 만족시키지 못하기 때문에 반복문을 빠져나와 그 이후의 코드를 실행한다.

탈출 후의 i값을 보면 10이 출력된다.

for문의 활용

class forClass
{
   public static void main(String[] args)
   {
      //1부터 10까지의 합
      int sum = 0;
      for (int j=1; j<=10; j++)
      {
         sum = sum+j;			
      }
      System.out.println("1부터 10까지의 덧셈: "+sum);

      //감소방법 사용은 가능하나 잘 사용하지 않는다
      for (int k=10; k>0; k--)
      {
         System.out.println("숫자가 감소해요!! "+k+" !!!");
      }

      //루프 변수가 2씩 증가한다.
      for (i=0; i<10; i+=2)
      {
         System.out.println("2씩 증가해요!! "+i);
      }

      //초기화 부분과 연산 부분을 밖으로 빼도 사용가능하다.
      int count =0;
      for (; count<10; )
      {
         System.out.println("증감 연산이 밖에 있어도 가능해요! "+count);
         count++;
      }

      //루프 변수를 2개 초기화해서 사용하는 것도 가능하다.
      for (int j=0, k=10; j<10; j++, k--)
      {
         System.out.println("j: "+j+"\tk: "+k);
      }

      //1~100 사이에 짝수의 합을 구하라
      int even = 0;
      for (int j=1; j<=100; j++)
      {
         if(j%2==0){		//if(j%2==1) 조건만 변경하면 홀수의 합도 구할수 있다.
            even+=j;
         }
      }
      System.out.println("짝수의 합: "+sum);
   }
}
1부터 10까지의 덧셈: 55
숫자가 감소해요!! 10 !!!
숫자가 감소해요!! 9 !!!
숫자가 감소해요!! 8 !!!
숫자가 감소해요!! 7 !!!
숫자가 감소해요!! 6 !!!
숫자가 감소해요!! 5 !!!
숫자가 감소해요!! 4 !!!
숫자가 감소해요!! 3 !!!
숫자가 감소해요!! 2 !!!
숫자가 감소해요!! 1 !!!
2씩 증가해요!! 0
2씩 증가해요!! 2
2씩 증가해요!! 4
2씩 증가해요!! 6
2씩 증가해요!! 8
증감 연산이 밖에 있어도 가능해요! 0
증감 연산이 밖에 있어도 가능해요! 1
증감 연산이 밖에 있어도 가능해요! 2
증감 연산이 밖에 있어도 가능해요! 3
증감 연산이 밖에 있어도 가능해요! 4
증감 연산이 밖에 있어도 가능해요! 5
증감 연산이 밖에 있어도 가능해요! 6
증감 연산이 밖에 있어도 가능해요! 7
증감 연산이 밖에 있어도 가능해요! 8
증감 연산이 밖에 있어도 가능해요! 9
j: 0	k: 10
j: 1	k: 9
j: 2	k: 8
j: 3	k: 7
j: 4	k: 6
j: 5	k: 5
j: 6	k: 4
j: 7	k: 3
j: 8	k: 2
j: 9	k: 1
짝수의 합: 55

반복문의 사용되는 변수를 어떻게 활용하는지도 중요한 과제 이다. 후에 배열을 루프 변수와 함께 사용하는 법을 배운다. 루프 변수를 반복문 블럭에서 활용하는 법을 잘 알아야 한다.

while 문

반복문의 종류에는 for문과 while문이 있다. 하지만 두 반복문의 차이는 초기화, 조건문, 연산자를 지정하는 위치만 조금 다를뿐 그 외의 사용법은 거의 같다. 처음 반복문을 연습하는 좋은 방법은 for문으로 작성한 코드를 while문으로 고쳐보고 while문을 다시 for문으로 고쳐보는 것이다. 이런 연습을 많이 하면 반복문에 대한 개요와 동장 원리를 쉽게 이해할 수 있다.

while문의 사용방법

while (조건문){
  반복할 코드
  연산식
}
이후 로직

for문에 들어갔던 요소는 while문에도 빠짐없이 들어있다. 다만 위치만 변경됐을 뿐이다. 하지만 위치를 외울 필요없이 프로그램이 돌아가는 순서대로 이해하면 된다. 루프를 돌리기 위한 변수를 선언하고 조건문을 검사하고 조건문이 만족하지 않을 때 까지 연산을 진행하고 루프가 끝나면 그 이후의 로직을 수행하면 된다.

  • 진행순서: (초기화) > (조건문) > (참?) > (처리) > (연산) > (조건문) > (참?) > (처리) > (연산) > … └>(거짓?) > (반복문을 탈출) > (이후 로직 수행)

“안녕하세요”를 5번 찍는 for문을 while문으로 변경해 보자.

class forClass{
  	//안녕하세요를 10000찍는 반복문
    public static void main(String[] args){
        for(int i=0; i<5; i++){
	        System.out.println("안녕하세요(for) " + i);
        }

      	int w =0 ;			//초기화
        while(w<10){		//조건문
            System.out.pirntln("안녕하세요(while) " + i)
            w++;			//연산식
        }
    }
}
안녕하세요(for) 0
안녕하세요(for) 1
안녕하세요(for) 2
안녕하세요(for) 3
안녕하세요(for) 4
안녕하세요(while) 0
안녕하세요(while) 1
안녕하세요(while) 2
안녕하세요(while) 3
안녕하세요(while) 4

while문에서 반복 변수로 사용할 w를 선언후 초기화한다.

while문을 들어갈때 조건문을 검사하고 반복 로직을 실행한다.

처리를 하고 연산을 진행한다. 연산을 하는 위치는 코드에 따라 유연하게 변경이 가능하다.

while문의 활용

class whileClass{
    public static void main(String[] args){

        //무한 루프
      	//종료가 되지 않는 반복문을 만들 수 있다.
      	//프로세스가 돌때 이 무한루프를 이용한다.
      	//하지만 종료 시점을 설정해주지 않으면 프로그램이 영영 끝나지 않을 수 있다.
        int count = 0;
        while(true){
           System.out.println("count: "+count);
           count++;
           if(count == 2000) break;		//break는 현재 진행중인 루프를 강제 종료시킨다.
										//조만간 자세히 다룰 예정
        }
        /*


        *
        **
        ***
        ****
        *****
        ****
        ***
        **
        *
        위에 보이는 문자가 출력되도록 while문을 사용해 작성하시오.
        /**/

        int w1 =0;      //세로로 별을 찍을 때 사용하는 루프 변수
        int w2 =0;		//가로로 별을 찍을 때 사용하는 루프 변수
        int temp =0;	//가로로 별을 몇개나 찍을 지를 결정 변수 -> 1부터 5까지 증가했다가 감소한다.

        while(w1 < 9){						//*문자들을 세로로 찍기 위해 9번 반복
           if(w1 < 5) temp = temp+1;		//5번째 반복문 까지는 temp의 수를 1씩 증가시키면서 반복
           else temp = temp-1;				//5번째 이후는 temp의 수를 1씩 감소시키면서 반복한다.

           w2 = 0;
           while(w2<temp){
              System.out.print("*");		//*문자들을 가로로 찍기 위해 temp만큼 반복
              w2++;
           }
           System.out.println();
           w1++;
        }
    }
}
count: 0
count: 1
count: 2
.
.
.
count: 2000
*
**
***
****
*****
****
***
**
*

do while문

do while문은 while문의 종류로서 while 문과 딱 하나의 차이를 보이고 그 외의 사용법은 완전히 같다.

그 차이는 조건문을 검사하는 시점이 다르다는 것인데, while문은 초기화를 하고 바로 조건을 검사하지만, do while은 초기화후 반복할 코드를 한번 실행한 후 조건을 검사한다.

do while문의 사용 방법

초기화
do{
    반복할 코드
    연산식
}while(조건문);
이후의 코드

while 문과 가장 큰 차이점은 반복할 코드를 한번 실행한 후, 연산을 하고 조건을 검사한다.

class whileClass{
    public static void main(String[] args){
        int w = 0;
      	while(w > 0){
            System.out.println("w는 0보다 큽니다");
          	w++;
        }
    }
}

위 코드를 실행하면 아무런 결과도 볼수 없다. 왜냐하면 변수 w가 조건을 만족하지 못하기 때문에 코드 블럭이 실행되지 않는다.

class doWhileClass{
    public static void main(String[] args){
        int w = 0;
      	do{
            System.out.println("w는 0보다 큽니다");
          	w++;
        }while(w>0);
    }
}

하지만 위의 코드를 실행시키면 무한루프에 빠지게 된다. 왜냐하면 조건을 검사하기 전에 출력을 하고 w의 값을 증가 시켰기때문에 조건문을 검사할때 변수의 값은 1이다. 따라서 조건을 항상 만족하게 되어 무한루프에 빠지게 된다.

정리

do while은 무조건 한번을 실행하고 조건을 검사해야할 때 사용된다. do while문도 많이는 아니지만 적지 않게 사용되는 반복문 중에 하나이다. 특정 상황에 따라 for문, while문, do while문을 적절하게 선택해서 사용해야한다. 그리고 3가지의 반복문을 서로 바꿔보는 연습이 반복문을 이해하는 가장 좋은 방법이다.

  • for문 : 반복해야할 횟수가 구체적으로 정의되어 있을 때 사용한다.
    • ex) 10번 반복, 20번 반복 등
  • while문 : 특정 조건에 부합할때까지 반복을 진행한다.
    • Ex) 10개의 수를 모두 입력 받을 때까지 계속해서 반복(입력이 틀리면 다시 입력 -> 10번 이상의 반복을 하다가 10개가 다 입력되면 종료한다.)
  • do while문 : 조건에 관계없이 한번 실행한 후, 특정 조건에 부합할때까지 반복을 진행한다.

Comments