본문 바로가기

programming/Gukbi

국비 교육 6일차 - 반복문

728x90
반응형

반복문을 8시간에서 반복해서 배운다면..

역시 이해하는데 큰 어려움이 없지 않을까 하는 생각이다. 

 

/*
 * 	자바에서 지원하는 반복문
 * 	=> 같은 소스가 여러번 코딩이 된 경우 사용 기술
 * 	1. while : 반복 횟수를 지정하지 않은 경우 (데이터베이스(오라클))
 * 		게시물, 레시피 목록, 영화 목록 etc ==> web
 * 	2. do~while : 한 번 이상을 반드시 반복하는 경우에 사용
 * 			      ================= 조건검색 (나중에)
 * 	3. for : 반복횟수가 지정된 경우 
 * 	   ===== 
 * 
 * 		1) 순서 : while, for => 선조건건색, do~while => 후조건검색
 * 		2) 형식 : 
 * 			1-1 while
 * 				초기값 int i = 1;
 * 				while(조건문) => i<=10
 * 				{
 * 					반복문장 System.out.println("i="+i);
 * 					증가식 i ++; 
 * 				}
 * 				1. 초기값 => 2. 초기값에 대한 조건검색 => 3. 반복문장 수행 => 4. 증가식
 * 							=> 증가된 값에 대한 조건섬색 => 3. 반복문장 수행 => 4. 증가식
 * 							   ==================
 * 								true : 3=>4
 * 								false : 종료 
 * 				
 * 				  *일정한 패턴이 있어야 반복문을 쓸 수 있음
 * 		3) 사용처 
 */
public class 반목문 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("~반복문을 사용하지 않는 경우~");
		System.out.println("i=1");
		System.out.println("i=2");
		System.out.println("i=3");
		System.out.println("i=4");
		System.out.println("i=5");
		System.out.println("i=6");
		System.out.println("i=7");
		System.out.println("i=8");
		System.out.println("i=9");
		System.out.println("i=10");
		
		System.out.println("~반복문을 사용하는 경우~");
		int i = 1; 
		while (i<=10) 
		{
			System.out.println("i="+i);
			i++;
		}
		
	}

}

반복문을 사용하는 이유는 코드의 중복을 줄여주기 위해서

위에 쓴 예시 처럼 10줄을 써야하는 코드를 단 몇줄로 바꿔서 사용할 수 있다. 

 

반복문의 문법으로는 

1. while

2. do while

3. for

 

이렇게 세 가지가 있는데, 1,3 위주로 그리고 특히 for문 위주로 많이 봐야한다. 

 

먼저 1. while 

// 사용자가 단을 입력
import java.util.Scanner;
public class 반복문_while {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			 int dan;
			// 사용자가 입력한 단을 받아서 저장
			 Scanner scan = new Scanner(System.in);
			 System.out.println("단(2~9) 입력:");
			 dan = scan.nextInt();
			 // 입력단의 구구단을 출력
			 // while을 사용하지 않고
			 System.out.println(dan+"단");
			 // 출력
			 System.out.printf("%d*%d=%d\n", dan,1,dan*1);
			 System.out.printf("%d*%d=%d\n", dan,2,dan*2);
			 System.out.printf("%d*%d=%d\n", dan,3,dan*3);
			 System.out.printf("%d*%d=%d\n", dan,4,dan*4);
			 System.out.printf("%d*%d=%d\n", dan,5,dan*5);
			 System.out.printf("%d*%d=%d\n", dan,6,dan*6);
			 System.out.printf("%d*%d=%d\n", dan,7,dan*7);
			 System.out.printf("%d*%d=%d\n", dan,8,dan*8);
			 System.out.printf("%d*%d=%d\n", dan,9,dan*9);
			 
			 
			 System.out.println("~반복문(While)사용~");
			 int i =1;
			 while(i<=9) {
				 System.out.printf("%d*%d=%d\n", dan, i, dan*i);
				 i++; // i<=9 i = 10 => false가 되면서 종료
			 }
	}

}

 

while(조건문) { 실행문장} 의 형식으로 사용하는 문장이다. 

조건문의 내용이 true이면 계속해서 돌아가도록 되어 있다. 

다만 위의 예시처럼 i<=9로 조건을 달아주었다면, 꼭 i++을 써줘서 i가 하나씩 카운팅되서 올라가게끔 만들어줘야한다. 

안그러면 무한 루프가 걸릴 수 있다. 

 

// 1~100까지 합, 짝수합, 혹수 합
/*
 * 	while 형식
 *  ========
 *  초기값 ==> 시작 ====> int i=1
 *  while(조건식) ==> 끝 ====> i<=10
 *  {
 *  	반복문장 => 시작, 끝 지정된 갯수만큼 수행
 *  	증가식 i++;
 * 	}
 * 
 * 	초기값 ==> 시작 ===> int i =10
 * 	while(i>=1)
 * 	{
 * 		반복문장
 * 		증감식 i--; 2개씩 => i+=2, 3개씩 => i+=3 ....
 * 	} 
 * 
 *  ====> while은 횟수가 없는 경우에 주로 사용
 *  	while(true) => 무한루프
 *  	{
 *  		종료 => break;
 *  	}
 */
public class 반복문_while3 {

	public static void main(String[] args) {
		int sum=0, even=0, odd=0;
		int i =1;
		while (i<=100) {
			sum+=i;
			
			if(i%2==0) {
				even=even+i;
			}
			
			else {
				odd=odd+i;
			}
			
			i++;
		}
		System.out.println("전체합:"+sum);
		System.out.println("짝수합:"+even);
		System.out.println("홀수합:"+odd);
		
	}
}

짝수와 홀수 합을 구해보는 연습을 했던 시간

과제처럼 즉석에서 했어야 했는데 생각대로 잘 나오지는 않고 

나 말고 다른 사람들은 척척 만들어 내는거 같아 조금 풀이 죽었었다. 

 

보면 이해는 바로 하는데 내가 직접 쓸려면 왜이리 헷갈리고 막막한 기분이 되는지 모르겠다. 

많이 연습하면 달라지겠지

 

/*
 *  do~while : 조건검색을 나중에 하기 때문에 반드시 한번이상을 수행
 *  형식)
 *  	초기값 int i =1; =====> 1
 *  	do
 *  	{
 *  		반복문장 =====> 2
 * 			증가식 ======> 3
 *  	} while(조건식); ======> 4 =====> 2 ===> 3 ===> 4
 *  									=============== 4 (false일 경우에 종료)
 *  
 *  			int i = 1; ============= 1
 *  			do{
 *  				System.out.println("i="+i); i=1
 *  				i++; i=2
 *  			}while(i<=5); 2<=5 true
 */
public class 반복문_dowhile {
	
	public static void main(String[] args) {
		// 1. 초기값
		int i =1;
		do
		{
			// 2. 반복문으로 수행되는 문장
			System.out.println("i="+i);
			// i 값을 증가 i=1~i=10
			i++;
			
		} while (i<=5); {
			int j =10; // 한번도 수행을 못할 수도 있다
			while (j<=5) {
				System.out.println("Hello");
			}
		}

	}

}

do while과 while의 가장 큰 차이점은 전자는 무조건 한번 이상 수행문장을 지나친다는 점이다. 

while의 조건이 더 아래에 있기 때문인데, do 안의 문장은 꼭 한번은 수행을 하고 내려오기 때문이다. 

while 안에 있는 수행문은 한 번도 실행되지 않을 수 있다. 

 

/*
 * 	1~100까지 총합, 3의 배수, 5의 배수, 7의 배수의 합을 출력
 * 	1-2+3-4+5-6+7-8+9-10 을 계산해서 총합을 구하기
 * 	
 */
public class 반복문_dowhile3 {

	public static void main(String[] args) {
		int i = 1;
		int sum=0, sum3=0, sum5=0, sum7=0;
		
		do {
			sum+=i;
			i++;
			if(i%3==0) {
				sum3+=i;
			} 
			if (i%5==0) {
				sum5+=i;
			} 
			if (i%7==0) {
				sum7+=i;
			}
		} 
		while(i<=100);{
			
		}
		System.out.println("1~100까지 총합:"+sum);
		System.out.println("1~100까지 3의배수합:"+sum3);
		System.out.println("1~100까지 5의배수합:"+sum5);
		System.out.println("1~100까지 7의배수합:"+sum7);
		
		int j = 1;
		int sum10=0, even=0, odd=0;
		
		do {
			sum10+=j;
			if(j%2==0)
				even-=j;
			else
				odd+=j;
			j++;
		}
		while(j<=10);{
			
		}
		
		System.out.println("최종 계산 값:"+(odd+even));
	}
	
	
}

두 예제 모두 수업시간에 과제 처럼 해본건데

위에 문제는 즉석에서 풀 수 있었고, 두번째 문제는 방금 적어봤는데 답이 잘 나왔다. 

do while문에도 조금 익숙하다고 말할 수 있을거 같다

 

다음은 for문

 

/*
 * 	for 
 * 	1. 사용처 => 반복횟수가 지정된 경우에 주로 사용
 * 	2. while, do~while(1차) ==> for(2차 for)
 * 	3. for의 형식
 * 		1-1. 일반 for
 * 					① →	   ② 	 ←④		
 * 					i=1	 i<=10	 i++
 * 					1부터 10까지  	 1씩증가					→←↑↓↗↘
 * 				for(초기값; 조건식;  증가식)
 * 				{		  ↓ true	
 * 						③		↗	
 * 						반복수행문장
 * 				}
 * 
 * 				실행 과정
 * 					초기값 => 조건식 (조건검색)
 * 							 = true : => 반복수행문장 => 초기값을 변경 (증가식)
 * 							 = false : for문을 종료
 * 		1-2. 향상된 for (JDK 1.5이상) => web (forEach구문)
 * 			 ========
 * 			 1. 배열, 2. 컬렉션 	
 * 		1-3. 
 */
public class 반복문_for {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// ☆ 홀수면 짝수면 ★
		// ★★☆★★☆★★☆★★☆
			for(int i=1; i<=9; i++) {
//				//별을 10개 출력
//				if(i%2==1) {
//					System.out.println("☆"); // i가 홀수일 경우
//				}
//				else if (i%2==0){
//					System.out.println("★");
//				}
				if(i%3==0) {
					System.out.print("☆");
				}
				else {
					System.out.print("★");
				}
			}
	}

}

몇번 실행할지 for문에서 먼저 다 정해주고 {}안에 반복 수행문장이 있는 형태이다. 

많이 익숙한 문법이라 듣고 이해하는데는 while이나 do while보다는 쉬웠다. 

 

/*
 *  page 156
 *  1. for은 주로 반복횟수를 알고 있는 경우에 적합
 *  2. 형식
 *			1    2    4	
 *  	for(초기값;조건식;증가식)
 *  			실행문장3
 *  			1->2->3->4
 *  			   2->3->4
 *  			   2->3->4
 *  			   ==
 *  			   false면 종료
 *  		**** {}가 없으면 바로 밑있는 문장만 반복문장 된다
 *  
 *  		예) 
 *  			for(int i=1; i<=5; i++)
 *  				System.out.println("i="+i);
 *  			=================================
 *  				System.out.println("Hello");
 *  			
 *  			for(int i=1; i<=5; i++)
 *  				{
 *  				System.out.println("i="+i);
 *  				System.out.println("Hello");
 *  				}
 *  				
 *  				1. 초기화
 *  					for(int i=0;
 *  					    ========
 *  						=> 프로그램에 맞게 초기화를 한다 (기본값, 0.1)
 *  						=> 자바는 보통 0
 *  				2. 조건식
 *  					for(int i=0; i<=10;
 *  								 ======
 *  							반복을 몇번 할지 설정
 *  				3. 증감식 
 *  					for(int i=0;i<10; i++)
 *  									  ====
 *  						i--, i+=2, i+=3....		
	*/		 						
public class 반복문_for2 {

	public static void main(String[] args) {
		//A~Z
		for(char alpha ='ㄱ'; alpha<='ㅏ'; alpha++) {
			System.out.println(alpha);
		}
		System.out.println();//다음줄에 출력
		//Z~A
		for(char alpha='Z'; alpha>='A'; alpha--) {
			System.out.print(alpha);
		}
	

	}

}

이렇게 굳이 조건문에 정수만 들어와야 하는건 아니고, char 데이터 형의 데이터들도 들어올 수 있다. 

 

또는 얼마까지 수행해야할지 그 횟수를 모를때는 

일부러 무한 루프를 생성하고, 조건이 달성됐을때 break를 걸어서 멈추게 하는 방법도 있었다. 

 

public class 반복문_for3 {

	public static void main(String[] args) {
//		for(int i =1; i<=9; i++) {
//			System.out.print(i);
//		}
//		System.out.println();
//		for(int i=9; i>=1; i--) {
//			System.out.print(i);
//		}
		int i=1;
		for(;;) // while(true) 무한루프 => 종료하는 기능 설정
			// 게임은 esc 눌렀을때 종료되어야 함
		{
			
			if(i>100)
				break;
			System.out.println("i="+i);
			i++;	
			
		}
	}

}

 

혹은 어떤 문장 하나만 건너 뛰고 그 다음 조건식을 확인하게 하는 방법도 있다. 

// 3자리 정수를 입략하게 만든다

import java.util.Scanner;
public class 반복문_for4 {

	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		for(;;) //무한루프
		{
			System.out.print("세자리 정수를 입력하시오");
			int user=scan.nextInt();
			if(user<100 || user>999) 
			{
				System.out.println("ㅉㅉ 알맞은 숫자를 입력하세요");
				continue; // 이렇게 되면 조건식으로 다시 올라가게 함, continue || break 밑에는 코딩하면 안됨
			}
			
			int a=user/100;
			int b=(user%100)/10;
			int c=user%10;
			
			System.out.println("백단위:"+a);
			System.out.println("십단위:"+b);
			System.out.println("단단위:"+c);
					
			break; // 종료시켜버림
		}
		
	}

}

 

활용 형태는 이와 같이 다양해서, 실무에서 사용할때 어떤것을 어떻게 배치해서 사용할지 매치하는게 아마 가장 어려운 부분중에 하나가 되지 않을까 싶다. 

 

아마 이 뒤부터는 더 어려워 질 것 같아서 정신을 단단히 붙잡고 수업을 들어야 할거 같다.

 

 

 

728x90
반응형

'programming > Gukbi' 카테고리의 다른 글

국비 교육 8일차 - 배열  (0) 2021.01.05
국비 교육 7일차 - 2차 for문  (0) 2021.01.04
국비 교육 5일차 - 조건문  (0) 2020.12.31
국비 교육 4일차 - 연산자, 제어문  (0) 2020.12.28
국비 교육 3일차 - 연산자  (0) 2020.12.26