유난스런 개발 기록

[JAVA] Day-7 _ 반복문 (for, while, do~while) 본문

개념정리/JAVA

[JAVA] Day-7 _ 반복문 (for, while, do~while)

yourhwan 2023. 1. 18. 20:13

day-7

반복문


반복문이란? 

  • 특정 수행문을 반복적으로 실행할 때 사용한다.
  • 반복문의 종류는 for, while, do~ while이 있다.

 

for 

for문의 기본 형식은 코드블록의 내용과 같다.

for(초기식; 조건식; 증감식) {
	반복 수행문;
}

// 수행 순서는 1. 초기식 => 2. 조건식 => 3. 반복 수행문 => 4. 증감식
// 다시 돌아와 2. 조건식 => 3. 반복수행문 => 4. 증감식
// 조건식이 false가 되기 전까지 반복한다.

 

  • 초기식이란 조건식에 사용할 변수를 선언해주고 초기값을 설정해준다. 이것은 for문이 실행되는 동안 한번만 실행이 된다.
  • 조건식이란 초기에 선언한 변수를 사용해 반복문을 계속 실행할지 결정한다. true일 경우 지속하고 false일 경우에 중단한다.
  • 증감식이란 조건식에서 결과가 false일 경우 조건식의 변수의 값을 증감한다.
  • 반복문은 위의 코드블럭의 순서대로 반복을 수행한다.
  • 반복문 안에 또 다른 반복문 혹은 조건문(if)을 사용할 수 있다.

 

 

"안녕 자바~~" 를 10번 출력하는 for문을 작성해보자

for(int i = 0; i<10; i++) {
			System.out.println( i+1 + ".안녕 자바~~");
		}
        
        
/*
출력 결과

1. 안녕 자바~~
2. 안녕 자바~~
3. 안녕 자바~~
4. 안녕 자바~~
5. 안녕 자바~~
6. 안녕 자바~~
7. 안녕 자바
8. 안녕 자바~~
9. 안녕 자바~~
10. 안녕 자바~~
*/

반복문을 이용한 연습문제로 별찍기가 가장 유명하다.

예전에 연습했던 기본적인 별찍기 코드는

2022.08.18 - [개인 개발 공부 기록] - [JAVA] for문을 활용한 별 찍기 에 정리해두었다.

 

이중 for문과 if문을 활용한 예시다.

for(int i=0; i<4; i++) { // 4행
			
	if(i==2) continue; // continue; 가 되어지면 밑으로 내려가지 않고 가장 가까운 반복문의 증감식으로 이동한다.  
			
	for(int j=0; j<3; j++) { // 3열
		System.out.print("["+i+","+j+"]");
	}// end of for----------------
			
			System.out.print("\n");
}// end of for---------------------

예시 코드에서 contine를 사용했는데, 만약 i가 증감식에 의해 3번쨰 반복에서 2가 된다면

그 때 제일 바깥에 있는 반복문을 빠져나가 반복을 종료하도록 만드는 코드다.

하지만

i=0 과 i=1이 되는 반복까지는 이중 반복문을 모두 실행한다.

출력 결과는 다음과 같다.

[0,0][0,1][0,2]
[1,0][1,1][1,2]
[3,0][3,1][3,2]

 

 

while 

  • while문은 for문과 달리 반복횟수가 불명확할 떄 사용한다.
초기식;
while(조건식) {
	반복 수행문;
    증감식;
}

	//각 식의 의미는 for문과 동일하다.
    
    /* while문의 실행 순서는 1.초기식 => 2.조건식 => 3.반복 수행문 => 4.증감식 순서이며,
    n차 반복을 하게 되면 위 순서에 이어서 5.조건식 => 6.반복 수행문 => 7.증감식 ...
    이렇게 n차 반복까지 계속 반복한다.
    */

 

while문의 형태는 위의 코드블럭과 같다.

 

while문을 이용해서 "안녕 자바~~"를 5회 반복하는 코드는 다음과 같다.

int cnt = 5, loop = 0;
		while(loop < cnt) {	// 0<5(참)	1<5(참)	2<5(참)	3<5(참)	4<5(참)	5<5(거짓)
			System.out.println( (loop+1)+".안녕자바~~" );
			loop++; 		// loop의 값 ==>	1	    2		3		4		5
		}// end of while------------------- 
		/*
		 	1.안녕자바~~
		 	2.안녕자바~~
		 	3.안녕자바~~
		 	4.안녕자바~~
		 	5.안녕자바~~
		 */

 

for문과 크게 다를 것이 없는 형태이다. 

그렇다면 구구단을 작성해보자.

1단 부터 시작해서 9단까지 출력해주는 코드는 다음과 같다.

		System.out.printf("%35s\n", "=== 구구단 ===");
		
		// 9행	8열
		//jul	dan
		
		int jul=0, dan=1;
		
		while( !(++jul > 9) ) {// 9행
			
			while( !(++dan > 9))  {//	8열
				String str = (dan < 9)?"\t":"\n";
				System.out.print(dan+"*"+jul+"="+(dan*jul)+str );
				
			}// end of while---------------------------------
			
			 //	dan <== 10 이 처음 빠져나왔을 때의 값이다.
			 //그렇기 때문에 다음 이어질 구구단을 위해 dan을 초기화 한다.
			
			dan=1;	// 다시한번 초기화
			
			
		}// end of while-----------------------

 

조건식은 일부러 부정문을 이용해봤다. jul이라는 변수가 9를 초과하지 않을 때까지 반복한다는 조건식을 작성했다.

간단하게는 그냥 jul<=9; 라고 작성할 수 있다. dan도 마찬가지다.

이때 마지막 코드에 dan=1;로 초기화해준 것은 1회 반복을 마치고 다음 구구단 작성을 위해 곱해줄 수를 1부터 시작하기 위해서다. 

 

코드를 실행하면 다음과 같이 결과가 나온다.

                        === 구구단 ===
2*1=2	3*1=3	4*1=4	5*1=5	6*1=6	7*1=7	8*1=8	9*1=9
2*2=4	3*2=6	4*2=8	5*2=10	6*2=12	7*2=14	8*2=16	9*2=18
2*3=6	3*3=9	4*3=12	5*3=15	6*3=18	7*3=21	8*3=24	9*3=27
2*4=8	3*4=12	4*4=16	5*4=20	6*4=24	7*4=28	8*4=32	9*4=36
2*5=10	3*5=15	4*5=20	5*5=25	6*5=30	7*5=35	8*5=40	9*5=45
2*6=12	3*6=18	4*6=24	5*6=30	6*6=36	7*6=42	8*6=48	9*6=54
2*7=14	3*7=21	4*7=28	5*7=35	6*7=42	7*7=49	8*7=56	9*7=63
2*8=16	3*8=24	4*8=32	5*8=40	6*8=48	7*8=56	8*8=64	9*8=72
2*9=18	3*9=27	4*9=36	5*9=45	6*9=54	7*9=63	8*9=72	9*9=81

 

 

do~ while

  • do~while문은 반복 수행문이 조건식 전에 실행이 된다. 때문에 조건식이 false일지라도 무조건 한 번은 실행이 된다.
  • 개인적으로 for문이 가장 재미있고 편하다... 그래도 do~while문의 형태와 사용법은 익혀두자!
초기식;
	   
	   do{
	       반복 수행문;
	       증감식;
	   } while(조건식);
       
       /*
       반복 순서는 1.초기식 => 2.반복수행문 => 3.증감식 => 4.조건식 순서이며
       n차 반복할 때는 위의 순서에 이어서 5.반복수행문 => 6.증감식 => 7.조건식 ...
       으로 반복이 끝날 때까지 계속 반복문을 수행한다.

 

기본적인 형태는 위와 같다. 개인적으로 로그인이나 회원가입 시 특정 조건에 부합할 때까지

무한 루프를 돌릴 때 do~while을 가장 바깥 반복문으로 많이 이용했다. 학원에서 선생님도 그렇게 하시던데...!

이후 그 안을 for문을 이용해 세부적인 조건을 만들어주고

전체적으로 try~catch를 걸어  예외처리를 하는게 깔끔하고 가독성이 좋아보이긴 했다. 

 

do while문을 통해 

"안녕 자바~~"를 5회 출력해보자

int cnt=5, loop=0;
		do {
			System.out.println(++loop + ".안녕 자바~~");
		} while (loop < cnt);

나는 앞쪽에 반복 횟수도 같이 찍어주고싶어서 ++loop도 출력문 안에 넣어봤다.

출력하면 결과는 다음과 같다.

1.Hello Java~~
2.Hello Java~~
3.Hello Java~~
4.Hello Java~~
5.Hello Java~~

 

마지막으로 반복문과 조건문 등을 응용해 만든

간단한 소수 구하기 프로그램 코드를 올리고 마무리 한다!

Scanner sc = new Scanner(System.in);
		
		int startNo =0;
		int endNo =0;
		
	do {	
		try {
			System.out.print("▷시작 자연수 : ");
			startNo = sc.nextInt();		// 1엔터
										// 0앤터
										// 1.345엔터
										// 똘똘이엔터
			sc.nextLine();
			
			System.out.print("▷끝 자연수 : ");
			endNo = sc.nextInt();		// 2엔터
										// -9엔터
										// 2.345엔터
										// 이순신엔터
			sc.nextLine();
			
			
		
		
			if(startNo < 1 || endNo < 1) {
				System.out.println(">> [경고] 입력하신 값은 모두 자연이어야 합니다!! <<\n");
			}
			else if(startNo >= endNo) {
				System.out.println(">> [경고] 두번째 입력한 숫자가 입력한 첫번째 숫자보다 커야합니다.!! <<\n");
			}
			else {
				break;
			}
		}catch(InputMismatchException e) {
			System.out.println(">> [경고] 자연수만 입력하세요!! << \n");
			sc.nextLine();	// sc.nextLine(); 가 없다면 계속해서 경고가 출력된다.
							// 이유는 스캐너에 입력값을 nextInt();로 사용했기 때문에 스캐너 버퍼에 찌꺼기 값이 남아있기 때문이다.
							// 때문에 처음부터 sc.nextLine();으로 입력값을 받거나 다른 타입으로 받을 경우 꼭 sc.nextLine();를 넣어줘야한다.
		}
		
	} while(true);
	// end of do~while---------------------------------------------------
	
	
		String str_result = "";
		int cnt = 0;	//	소수의 누적개수
		int sum = 0;	//	소수들의 누적합
	
		for(int i=startNo; i<=endNo; i++) {
			
			if(i==1)		// i가 소수인지 아닌지를 검사할 대상값이다.
				continue;	// 1은 소수가 아니므로 검사할 필요가 없기 때문에 continue; 를 사용해서 건너 뛴다.
			
			
			/*
			 	나누기를 했을 때 나머지가 얼마가 되는지 일일이 검사를 한다.
			 	만약에 i가 2 이라면 ==> 2%2==0 2는 소수이다.
			 	만약에 i가 3 이라면 ==> 3%2!=0 3은 소수이다.
			 	만약에 i가 4 이라면 ==> 4%2==0 4%3(이미 한번 나누어 떨져서 검사할 필요가 없다) 4는 소수가 아니다.
			 	만약에 i가 5 이라면 ==> 5%2!=0 5%3!=0 5%4!=0 5는 소수이다.
			 	...............
			 	만약에 i가 9 이라면 ==> 9%2==0 9%3(이미 한번 나누어 떨져서 검사할 필요가 없다) 9는 소수가 아니다.
			 */
			
			boolean isSosu = true;
			
			for(int j=2; j<i; j++) {	// j가 분모에 들어갈 값이다.
				
				if(i%j == 0) {			// 나누어 떨어지면 소수가 아닌 경우다.
					isSosu = false;
					break;				// 현재 for문을 빠져나오는 break; 이다.
				}
				
			}// end of for-----------------------------------------------------
			
			if(isSosu) { // 검사대상인 i가 소수이라면 
				
				
				String str_add = (!"".equals(str_result))?",":"";	// , (콤마)를 넣어주기 위해 변수를 선언하고 삼항연산자를 사용한다.
																	// ()?"":"" 가 삼항연산자의 기본 형태
																	// str_result의 값이 처음이 아니라면 ,를 넣어주고 처음이면 아무것도 하지 않는다.
				
				str_result += str_add + i;
				
				cnt++;	// 소수의 개수를 누적한다.
				
				sum += i;	// 소수들의 누적합
			}
		}// end of for---------------------------------------------------
		
		
		System.out.println(startNo+ "부터"+ endNo +"까지의 소수는?\n" + str_result + "\n");
		// 2, 3, 5, 7, 11, 13, 17, 19
		
		System.out.println(startNo+ "부터" +endNo+ "까지의 소수의 개수?"+cnt+"개");
		// 1 부터 20 까지의 소수의 개수?
		System.out.println(startNo+ "부터" +endNo+ "까지의 소수들의 합?"+sum);
		// 1 부터 20 까지의 소수들의 합? 77
		sc.close();
		System.out.println("=== 프로그램 종료 ===");

 

프로그램 실행 결과 예시

/*
	 	=== 실행결과 ===
	 	▷시작 자연수 : 1 엔터
	 	▷끝 자연수 : 20 엔터
	 	1 부터 20 까지의 소수는?
	 	2, 3, 5, 7, 11, 13, 17, 19
	 	
	 	1 부터 20 까지의 소수의 개수? 8개
	 
	 	1 부터 20 까지의 소수들의 합? 77
	 	
	 	=== 프로그램 종료 ===
	 */

 

 

수업 후 실습한 내용들을 다시 직접 코딩해보느라 블로그를 업로드할 시간이 없었다.

밀린 블로그도 복습이라 생각하고 다시 하나씩 올려 진도에 맞춰 업로드 해야겠다.