본문 바로가기
IT 돌고래/JAVA

[JAVA]자바의 여덟걸음 : 반복문

by IT돌고래 2020. 2. 2.
반응형

안녕하세요.

IT 돌고래입니다.

자바의 반복문에 대해서 이야기를 해보겠습니다.

 

프로그램을 만들려면 반복적인 일을 수행을 해야 합니다. 왜냐면 한번만 수행하고 동작하지 않으려면 사람이 그 일을 처리를 하는게 사람이 더 빠를것 입니다. 어떤 일을 반복적으로 프로그램이 해주기 때문에 현재 우리는 프로그램 속에서 살고 있는 것이라고 볼 수 있습니다. 그래서 이런 반복적인 일을 하기 위해서 자바에서는 반복문이라는게 있어서 반복문을 활용하여 프로그램 반복적인 일을 수행하고 있습니다.

반복문은 while문, do-while문, for문 이렇게 3가지 반복문을 사용을 하면 됩니다.

 

1. while문

while문은 while(조건)형식으로 씁니다. 조건이 참일 경우에 계속적으로 반복을 하게 되고 거짓이 되면 반복문을 탈출하게 됩니다. 한번 소스를 확인해 보겠습니다.

int a = 0;

while( a<10 )  // a가 10보다 작으면 계속 반복이 될 것이다.
{
    System.out.print(a); // 0~9까지 출력하게 된다.
    a++; // a의 값은 1씩 증가를 한다.
}

//a는 반복할때마다 값이 1씩 증가되서 10이 되는 순간 반복문을 탈출하게 된다.

 

위에 소스를 보면 조건으로 얼마큼 반복을 할 것인지 제어를 해서 반복을 하게 됩니다. 이 조건은 전적으로 개발자가 알아서 줘야합니다. 만약 조건이 잘못되서 덜돌거나 더돌거나 돌지 않거나 계속 돌면 개발자가 논리적으로 문제가 없도록 수정하여 원하는 만큼 반복이 되게 수정을 해야합니다.

 

2. do-while문

do-while문은 do의 중괄호 안에 명령문이 들어가고 중괄호 마지막에 while(조건)에 세미콜론이 붙는 형식의 조건으로 씁니다. 여기서 do-while문은 whlie(조건)이 맞지 않아서 한번도 반복을 할 수 없는 경우에도 무조건 한번을 반복을 하게되는 특징을 가집니다. 한번 소스를 확인해 보겠습니다.

int a = 5;
int b = 10;
do{
   System.out.print("hello"); //while조건이 처음부터 맞지 않지만 한번은 무조건 실행을 합니다.
}while(a>10);  //반드시 마지막에 세미콜론을 붙혀줘야한다.

 

위에 소스를 보면 조건이 처음부터 참이 아니어도 한번은 무조건 실행을 하게 됩니다. 그 다음부터는 while문 뒤에 있는 조건을 확인하고 반복을 진행하게 됩니다.

 

3. for문

for문은 for(초기식;조건식;증가감식)의 형태로 쓰입니다. 처음에는 초기식과 조건식을 보고 실행을 하게 되고 그 이후 부터는 증가감식 조건식 이렇게 비교를 하면서 반복을 할지 말지를 판단해서 반복을 하게 됩니다. 소스를 확인해 보겠습니다.

for(int i = 0;i<5;i++)  
// i는 초기에 0으로 시작해서 1씩 증가 합니다. 만약 5보다 작으면 반복문 안에 명령어를 계속 실행을 하게 됩니다.
{
    System.out.println("Hello); // Hello가 5번 출력 하게 됩니다.
}

for문도 while문과 똑같이 조건에 의해서 반복을 하게 됩니다. 얼마큼을 반복할지는 개발자의 구현에 의해서 자유롭게 사용 할 수가 있습니다.

참고로 처음에 반복문이 어렵다면 조건에 관련되서 제어를 해서 반복을 하려면 while문을 사용하고 정확히 반복횟수가 있는 경우에는 for문을 사용하는게 이해를 하거나 공부를 할때 좋습니다.

 

4. 중첩반복문

for문이나 while문을 사용할 때 중첩으로 반복문을 사용해서 프로그램을 제어를 할 수 가 있습니다.

for(int i =0;i<5;i++)
{
   for(int j =0;j<5;j++)
   {
       
   }
}
// 이중 for문

///////////////////////////////////////////////

int a = 0;
int b = 0;
while(a<5)
{
    while(b<5)
    {
       b++;
    }
    a++;
}

//이중 while문

 

위에 소스들을 보면 for문안에 또 for문이 있고 while문 안에 또 while문이 있습니다. 위에 소스들과 다르게 while문 안에 for문이 있거나 for문안에 while문을 사용하여도 무방합니다. 또한 이중, 삼중, 사중... 원하는 만큼 반복문을 사용을 하시면 됩니다.

이렇게 자유롭고 원하는 데로 구현을 할 수가 있지만 처음 접하시고 초보이신 분들에게는 자유도가 올라가면 더 어렵습니다. 그렇기 때문에 반복적인 구현과 종이에 스스로 프로그램 소스를 돌려보면서 습득을 하셔야 합니다.

 

5. 반복문과 조건문의 결합

자바의 일곱걸음에서 배운 조건문과 지금 배우고 있는 반복문은 자유롭게 사용하여 프로그램의 로직을 구성하면 됩니다. 아래 소스를 확인해 보겠습니다.

int a = 0; // 변수 a를 0으로 초기화
while(true)   // 프로그램이 강제종료 되기전까지는 무한으로 반복을 합니다.
{
    if(a == 10) //변수 a가 10이 되면 중괄호안에 명령문을 실행
    {
        break;  //반복문을 종료 시킵니다.
    }
}

/////////////////////////////
for(int i=0;i<10;i++) 
// 변수 i의 초기 값은 0이고 10보다 작으면 반복문이 실행이되고 한번 반복이 될때마다 변수 i의 값은 1씩 증가합니다.
{
     if(i%2 == 0) // 변수 i를 2로 나눈 나머지값이 0이면 아래 명령문을 실행을 합니다.(짝수만 실행)
     {
         System.out.println(i); // 변수 i의 값을 출력합니다.
     }
}

//////////////////////////////
int b = 0; //변수 b를 0으로 초기화
while(true)  // 프로그램이 강제종료 되기전까지는 무한으로 반복을 합니다.
{
    if(b>10) // 변수 b가 10보가 크면 아래명령어를 실행
    {
        break; // 반복문을 종료시킵니다.
    }
    if(b==10) // 변수 b가 10이면 아래 명령어 실행
    {
       for(int i = 0;i<10;i++)
       // 변수 i의 초기 값은 0이고 10보다 작으면 반복문이 실행이되고 한번 반복이 될때마다 변수 i의 값은 1씩 증가합니다.
       {
          if(i%2 == 0)// 변수 i를 2로 나눈 나머지값이 0이면 아래 명령문을 실행을 합니다.(짝수만 실행)
          {
              System.out.println((i+b)) //변수 i와 b를 더한 값을 출력합니다.
          }
       }
    }
    System.out.println(b); // 변수 b를 출력합니다.
    b++;//변수 b의 값을 1씩 증가시킵니다.
}

 

위에 소스를 보면 while문안에 if문과 for문안에 if문 그리고 while문 안에 if문과 if문안에 for문안에 if문과 같이 소스가 구성 되어 있습니다. 이렇게 반복문 조건문과 조건문 안에 반복문을 쓸 수 있고 이렇게 쓰는 형태는 자유롭다. 또한 위에 소스는 없지만 if문만 되는것이 아니라 if-else문이나 if-else if-else문 또는 switch문도 가능합니다..

한마디로 정리하면 프로그램을 개발하는 사람이 알아서 반복문과 조건문을 조합해서 프로그램을 만들어야 합니다. 

이렇게 알아서 한다는 것은 많이 와닿지 않을 수 있습니다. 이런 조합하고 만들 수 있는 실력은 여러 문제를 통해서 문제를 해결해보고 제가 제일 처음 말씀드린 컴퓨팅 사고력에 대해서 열심히 공부하시면서 향상을 시켜야합니다.

조건문 반복문을 배워서 쓰는 것을 어려워 하지 않습니다. 그 조건문과 반복문을 어떻게 사용해서 원하는 결과를 내는가를 어려워합니다. 

처음배우시거나 초보이신분들에게 당부를 드리자면 자바의 여덟걸음까지 내용을 숙지하고 문제에 대해서 어떻게 프로그램을 구현을 할지를 인터넷에서 찾기 보다는 스스로 오랫동안 해결해보시고 인터넷에 올라와 있는 소스를 확인을 해보는 식으로 공부를 하신다면 도움이 되실것입니다.

 

6. break문과 continue문

반복문을 제어 하기 위해서 break문과 continue문을 사용 할 수 있습니다. 아래의 소스를 확인을 해보겠습니다.

int a = 0;  //변수 a를 0으로 초기화
while(true) // 프로그램이 강제종료 되기전까지 무한으로 반복
{
   if(a == 10) // 변수 a가 10이면 아래 명령어를 실행
   {
       break; //반복문을 종료시킨다.
   }
   if(a%2 != 0) // 변수 a를 나눈 나머지 값이 0이 아니면 아래 명령어 실행
   {
       continue; // 반복문에 처음으로 이동
   }
   
   System.out.println(a); // 변수 a를 출력합니다.
   a++; //변수 a를 1씩증가를 시킵니다.
   
   
}

 

위에 소스를 보면 break문과 continue문을 사용 해서 만들어 져 있습니다. break문과 contine문을 설명을 드리면 break문은 반복문을 탈출 할때 사용합니다. contine문은 다시 반복문에 처음 명령어로 이동을 해서 시작을 합니다. 이 두명령문을 잘 사용하면 좋은 프로그램의 로직을 구현을 할 수가 있습니다. 위에 소스를 정확하게 설명을 드리면a변수를 나눈 나머지 값이 0이 아니면 continue를 해서 다시 처음으로 올립니다. 그렇기 때문에 출력은 짝수의 값만 출력이 되고 변수 a가 10이 되면 반복문을 탈출을 하게 됩니다.

 

※ break문은 자기를 감싸고 있는 첫번째 반복문만 탈출을 합니다.

 

continue문은 큰 문제 없이 잘 사용을 하시지만 위에 말처럼 break문은 자기와 근접한 반복문 탈출을 하기 때문에 처음 배우시거나 초급이신 분들은 종종 실수를 하시곤 합니다. 

 

 

7. 응용소스

숫자야구게임을 한번 소스를 분석해 보겠습니다.

		//<숫자야구게임>
		Scanner sc = new Scanner(System.in);  // 입력을 하기 위해서 Scanner 객체인 sc를 생성

		int com1, com2, com3; // 정수인 com1, com2, com3 변수를 생성


		com1 =(int)(Math.random()*9+1); // 1~9까지 랜덤수를 받아서 com1변수에 대입 
		com2 =(int)(Math.random()*9+1); // 1~9까지 랜덤수를 받아서 com2변수에 대입

		while(com1 == com2) // com1변수 와 com2변수가 같으면 계속 반복
		{
			com2 =(int)(Math.random()*9+1); //1~9까지 랜덤수를 받아서 com2변수에 대입
		}
		com3 =(int)(Math.random()*9+1); // 1~9까지 랜덤수를 받아서 com3변수에 대입
		while(com1 == com3 || com2 == com3) // com1변수와 com3변수가 같거나 com2변수와 com3변수가 같으면 계속 반복
		{
			com3 =(int)(Math.random()*9+1);// 1~9까지 랜덤수를 받아서 com3변수에 대입
		}


		System.out.println(com1 +" "+ com2+" " + com3); // com1, com2, com3 변수의 값을 출력

		/////////////////////////////////////////////////////////////
		int strike = 0; // 정수 strike 변수를 생성 및 0으로 초기화
		int ball = 0; // 정수 ball 변수를 생성 및 0으로 초기화
		int user1, user2, user3; // 정수인 user1, user2, user3 변수를 생성

		while(true) // 프로그램이 강제종료 전까지는 무한으로 반복을 합니다.
		{
			strike = 0; //변수 strike를 0을 대입
			ball = 0; //변수 ball을 0을 대입
			System.out.print("숫자를 입력해주세요 : "); // 출력
			user1 = sc.nextInt(); // 변수 user1에 숫자 입력을 받아서 대입
			user2 = sc.nextInt(); // 변수 user2에 숫자 입력을 받아서 대입
			user3 = sc.nextInt(); // 변수 user3에 숫자 입력을 받아서 대입


			if(com1 == user1) // com1변수와 user1변수가 같으면 아래 명령어 실행
			{
				strike++; // strike변수를 1을 증가시킴
			}
			if(com2 == user2) // com2변수와 user2변수가 같으면 아래 명령어 실행
			{
				strike++; // strike변수를 1을 증가시킴
			}
			if(com3 == user3) // com3변수와 user3변수가 같으면 아래 명령어 실행
			{
				strike++; // strike변수를 1을 증가시킴
			}
			if(com1 == user2 || com1 == user3) // com1의 변수와 user2의 변수가 같거나 com1의 변수와 user3의 변수가 같으면 아래 명령어를 실행
			{
				ball++; // ball변수를 1을 증가시킴
			}
			if(com2 == user1 || com2 == user3) //com2의 변수와 user1의 변수가 같거나 com2의 변수와 user3의 변수가 같으면 아래 명령어를 실행
			{
				ball++; // ball변수를 1을 증가시킴
			}
			if(com3 == user1 || com3 == user2) com3의 변수와 user1의 변수가 같거나 com3의 변수와 user2의 변수가 같으면 아래 명령어를 실행
			{
				ball++; //ball 변수를 1을 증가시킴
			}

			////////////////////////////////////////////
			if(strike == 0 && ball ==0) // strike변수와 ball변수의 값이 0이면 아래 명령어 실행
			{
				System.out.println("Out 입니다."); // 출력
			}
			else if(strike == 3) // strike변수의 값이 3이면
			{
				System.out.println("홈런입니다."); // 출력
				break; // 반복문을 탈출합니다.
			}
			else //위 두개의 조건이 아니면 아래의 명령어 실행
			{
				System.out.println(strike + "스트라이크, "+ball+"볼 입니다."); //출력
            }
}

 

위에 소스 주석을 추가해 놨습니다. 한번 확인해 보시고 천천히 분석을 하시기 바랍니다.

 

※ 긴 글을 읽어 주셔서 감사합니다. Java를 계속 진행해 나가겠습니다.

 

★ 이글 이후에는 Java 조건문과 반복문응용에 대한 내용을 정리해서 처음부터 정리를 할 예정입니다. 많은 관심 부탁드립니다.



반응형

댓글