본문 바로가기

웹개발 수업/JAVA

[Day +6]반복문

210630 수

 

Chap02. 반복문

: 프로그램 수행 흐름을 바꾸는 역할을 하는 제어문 중 하나로 특정 문장들을 반복해서 수행하도록 함

 

1. For

1) 식

2) 특징

1회전 : 초기식 확인 후 조건식 확인

          조건식이 true면 문장 수행

          조건식이 false면 수행하지 않음

2회전 : 증감식 연산 후 조건식 확인

          조건식이 true면 문장 수행

          조건식이 false면 수행하지 않음

 

*2회전 이상부터는 모두 2회전과 동일하고 조건식이 false가 나올 때까지 문장 수행

package com.kh.chap02.loop;

import java.util.Scanner;

public class A_For {

	public void method1() {
		
		// "안녕하세요" 10줄 출력
		// for(초기식 ; 조건식 ; 증감식){
	    // }
		
		for(int i = 1 ; i <= 10 ; i++) {
			System.out.println("안녕하세요");
			
		//후위나 전위 연산자나 여기서는 상관이 없다
		//반복을 몇 회를 하는지가 중요하니까 정수값으로 하는 것
		//w 초기식 : int i = 1 
		//=> int i라는 변수를 만들어 주고 i는 1부터 시작하겠다 
		//w 조건식 : i는 10까지만
		//w 증감식 : 한 번 수행 시 기본값 -> 두 번째 기본값 + 1...  
		//즉, 1씩 증가 시키겠다. 1번 안녕하세요 2번 안녕하세요.. 10까지 안녕하세요
			
		/* 답 : 
		 안녕하세요
		안녕하세요
		안녕하세요
		안녕하세요
		안녕하세요
		안녕하세요
		안녕하세요
		안녕하세요
		안녕하세요
		안녕하세요	
		 */
		}
	}
				
	public void method2() {
		//1부터 10까지의 숫자 출력
		for(int i = 1 ; i <= 10 ; i++) {
			System.out.println(i);
	}
		//for문을 벗어나면 i라는 변수를 사용할 수 없다
		//System.out.println(i); => 이 줄에서는 사용 불가능
		//입력 창에 문자열을 입력하면 => 문자열 반복
		//i 변수를 넣으면 1~10 숫자 반복
		/*1
		2
		3
		4
		5
		6
		7
		8
		9
		10*/

	}
	
	public void method3() {
		//10부터 1까지의 숫차를 출력
		for(int i = 10 ; i >= 1 ; i--) {
			//System.out.println(i);
			System.out.print(i + " ");
		}
		//int i = 10, 10은 시작값이다, 횟수 아님
		// 10부터 시작해서 1보다는 크게 반복하라
	}
	
	public void method4() {
		//1~10 사이의 홀수 출력
		//1, 3 ,5 ,7, 9
		
		
		//식1
		for(int i = 1 ; i <=10 ; i++) {
			if(i % 2 == 1) {
				System.out.print(i + " ");
			}
		}
		
		System.out.println();
		
		//식2
		for(int i = 1 ; i < 10 ; i += 2) { //+= 되는 부분 복습하자
			System.out.print(i + " ");
		}
		// 답 : 1 3 5 7 9 (둘 다)
	}
	
	public void method5() {
		//1부터 10까지의 정수들의 합계
		//1 + 2 + 3 + ... + 10 = ?
		
		//합계를 기록할 변수를 만들어 준다.
		int sum = 0;
		for(int i = 1 ; i <= 10 ; i++) {
			sum += i;
			
		}
		System.out.println("1부터 10까지의 합계 : " + sum);
	}
	//답 : 1부터 10까지의 합계 : 55
			
	public void method6() {
		
		//1부터 사용자가 입력한 수까지의 합계
		Scanner sc = new Scanner(System.in);
		
		System.out.print("정수 : ");
		int num = sc.nextInt();
		
		int sum = 0; //합계를 저장해 두는 곳 : 변수
		for(int i = 1 ; i <= num ; i++) {
			sum+= i;
		}
			System.out.println("1부터" + num + "까지의 합계 : " + sum);
			
		//만약 마이너스를 입력하면 애초에 조건이 맞지 않아서 반복문이 실행되지 않는다
		/*정수 : 10
		1부터10까지의 합계 : 55*/

	}
	
	public void method7() {
		
		//구구단 2단 출력하기
		// 2 * 1 = 2
		// 2 * 2 = 4 
		// 2 * 9 = 18
		
		for(int i = 1 ; i < 10 ; i++ ) {
			System.out.println("2 * " + i + " = " + (2*i));
		}		
	
	}
	
	public void method8() {
		//사용자에게 입력 받은 수에 해당하는 구구단 출력하기
		Scanner sc = new Scanner(System.in);
		
		System.out.print("단 수를 입력하세요 : ");
		int dan = sc.nextInt();
		
		//일단 입력된 문자가 2 ~ 9 사이의 숫자가 맞는지 먼저 확인하고 싶을 때
		if(dan <= 9 && dan >= 2) {
			for(int i = 1 ; i < 10 ; i++) {
			//System.out.println(dan + " * " + i +  " = " + (i*dan));
				System.out.printf("%d X %d = %d\n", dan, i, (dan*i));}
		}else{
		System.out.println("2 ~ 9사이의 값을 입력하셔야 합니다");
	}
		
		/*단 수를 입력하세요 : 3
		3 X 1 = 3
		3 X 2 = 6
		3 X 3 = 9
		3 X 4 = 12
		3 X 5 = 15
		3 X 6 = 18
		3 X 7 = 21
		3 X 8 = 24
		 3 X 9 = 27*/

	
	}

	public void method9() {
		//1부터 어떤 랜덤 값 (1~10 사이로 발생)까지의 합계 구하기
		//java.lang.Math 클래스에서 제공하는 random메소드를 사용할거임
		// ***java.lang 패키지는 import할 필요가 없음
		// 컴파일러에 의해 import java.lang.*;이 생성됨
		
		double random = Math.random();
		System.out.println(random);
		//Math.random() => 0.0 ~ 0.9999999999.... 까지의 랜덤한 숫자를 발생하는 메소드
		
		//Math.random() 메소드를 정수 값으로 바꿔주는 방법
		//메소드가 0~1(=0.999999999...)의 값이기 때문에 * 숫자 값을 해주면 된다
		/*예) 10 
		 * => 0 * 10 < 메소드 < 10이 되므로
		 * 0부터 9.99999값을 나타낼 수있다고 보면 됨
		 * 
		 * Q. 1부터 시작하고 싶으면?
		 * +1 해주면 됨
		 * 예) 11(그니까 1부터 12까지라고 생각하면 됨)
		 * => 0 * 11 + 1 < 메소드 < 11 + 1
		 * => 1 < 메소드  < 12
		 * 
		 * Q. 2부터 시작하고 싶으면?
		 * 예) 2부터 ~13까지 (그니까 2부터 14까지라고 생각하면 됨)
		 * => 0 * 12 + 2 < 메소드 < 12 + 2
		 * 
		 이후 => 소수점 제거를 위해 int추가해서 강제형변환*/
		
		
		int ran = (int)(random * 10 + 1);
		System.out.println("1에서 10사이의 랜덤 값 : " + ran);
			
		int sum = 0;
		for(int i = 1 ; i <= ran; i++) {
			sum += i;
		}
		System.out.println("1부터" + ran + "까지의 합 : " + sum);
}

	
	public void method10() {
		//랜덤 구구단 
		//2부터 9사이의 랜덤 값을 random 변수에 담고 random 단 출력
	
		
		int ran = (int)(Math.random() * 8 + 2);
		
		for(int i = 1 ; i < 10 ; i++) {
			System.out.println(ran + " * " + i + " =  " + (ran * i));
		}
				
		/*4 * 1 =  4
		4 * 2 =  8
		4 * 3 =  12
		4 * 4 =  16
		4 * 5 =  20
		4 * 6 =  24
		4 * 7 =  28
		4 * 8 =  32
		4 * 9 =  36*/

		
	}
	
	public void method11() {
		
		//사용자에게 두개의 정수 값 입력 받아
		//작은 수부터 큰 수까지의 합계 구하기
		Scanner sc = new Scanner(System.in);
		
		System.out.print("첫번째 정수 : ");
		int num1 = sc.nextInt();
		System.out.print("두번째 정수 : ");
		int num2 = sc.nextInt();
		
		/*
		int sum = 0;
		for(int i = num1 ; i <= num2 ; i++) {
			sum += i;
		}
		System.out.println("합계 : " + sum);
		*/
		
		//num1이 num2보다 작은 경우에는 반복문이 동작하지만 
		//num1이 num2보다 큰 경우에는 조건을 만족하지 못해서 반복문이 동작하지 않음
		//작은 수가 초기식에 큰 수가 조건식에 들어가게끔 하려면?
		
		int min = 0; //입력된 정수 중 작은 값을 저장할 변수
		int max = 0; //입력된 정수 중 큰 값을 저장할 변수
		
		if(num1 > num2) {
			max = num1;
			min = num2;
		}else {
			max = num2;
			min = num1;
		}
		
		int sum = 0;
		for(int i = min ; i <= max ; i++){
			sum += i;
		}
		System.out.println(min + "부터 " + max + "까지의 합" + sum);
		
		/*
		 * 첫번째 정수 : 3
			두번째 정수 : 5
			3부터 5까지의 합12*/
		
	}
	
	
	
	
	//-------------중첩 반복문-----------------
	
	public void method12() {
		//1부터 5까지 출력되는 문장을 3줄 출력하기
		//1 2 3 4 5
		//1 2 3 4 5
		//1 2 3 4 5
		
		for(int i = 1 ; i <= 3  ; i++) {//외부는 3번 반복
		
			for(int j = 1 ; j <= 5 ; j++) {//내부는 5번 반복
				System.out.println(j +" ");
			}
			System.out.println();
		}
	}
			
	public void method13() {
		//0시 0분 ~ 23시 59분 => 반복문 출력
		
		// 시 -- 0시 ~ 23시까지
		// 분 -- 0분 59분까지
		
		for(int h = 0 ; h < 24 ; h++) {
			System.out.println("====" + h + "시====");
			for(int m = 0 ; m < 60 ; m++) {
				System.out.println(h + "시" + m + "분" );
			}
				
		
	}
	}
		
	public void method14() {
		//2단부터 9단까지 출력
		//단 : 2~9단 => 외부 for문
		//곱해지는 수 ; 1~9 => 내부 for문
		
		for(int d = 2 ; d <=9 ; d++) {
			System.out.println("====" + d + "단====");
			for(int n = 1 ; n<=9 ; n++) {
				System.out.println(d + " * " + n + " = " + (d*n));
			}
		}
		
	}
	
	
	public void method15() {
		// ****
		// ****
		// ****
		// ****
		// ****
		//행 지정 -> 외부, 열 지정 -> 내부
		
		for(int i = 1 ; i <= 5; i++) {
			for(int j = 1 ; j<= 4 ; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
		
		
	}
	
	public void method16() {
		//1***
		//*2**
		//**3*
		//***4
		
		
		for(int i = 1 ; i <= 4 ; i++){
			for(int j = 1 ; j <= 4 ; j++) {
				if(i == j) {
					System.out.print(i);						
				}else{System.out.print("*");
				}
			}
		System.out.println();
		}
	}
	
	
	}

 

2. While

1) 식

2) 특징

조건식이 true일 때 문장 수행

문장 수행이 끝나면 조건식 다시 확인 후 true면 수행,

조건식이 false가 될 때까지 수행

조건식이 false가 되면 반복문 종료

 

*{ } 안에 조건을 벗어나게 할 연산(증감식, 분기문) 필요

package com.kh.chap02.loop;

import java.util.Scanner;

public class B_While {
	
	public void method1() {
		/*while문
		 * [초기식]
		 * while(조건식){
		 * 		실행할 코드;
		 * 		[증감식/분기문]
		 * }
		 */
		//안녕하세요 5줄 출력
		int i = 1;
		while(i <= 5) {
			System.out.println("안녕하세요");
			i++;
		}
	}
	public void method2() {
		//1부터 10까지 출력
	int i = 1;
	while(i <= 10) {
		System.out.print(i + " ");
		i++;
	}
		
	}
	
	public void method3(){
	//10부터 1까지 출력
	int i = 10;
	while(i >= 1) {
		System.out.print( i+ " ");
		i--;
	}
	
	}			
	public void method4() {
		// 1 3 5 7 9 출력
		int i = 1;
		while(i < 10) {
			System.out.print(i + " ");
			i += 2;
		
	}
}
	
	public void method5(){
		//1부터 랜덤 값(50~100 사이의 범위)까지의 합 구하기
		int random = (int)(Math.random() * 51 + 50);
		int sum = 0;
		
		int i = 1;
		while(i <= random) {
			sum += i;
			i++;
		}
		System.out.println("1부터 " + random + "까지의 합 : " + sum);
	}
	
	public void method6() {
		//사용자에게 문자열을 입력 받아서
		//각 인덱스 별 문자를 출력
		//"apple"
		//a
		//p
		//p
		//l
		//e => 문자열의 길이에 맞춰서 반복문을 통해 출력
		Scanner sc = new Scanner(System.in);
		System.out.print("문자열 입력 : ");
		String str = sc.nextLine();
		
		//문자열 길이를 알려면 문자열 변수.length()
		System.out.println(str.length());
		//string 안의 길이를 알려주는 메소드
		
		int i = 0;
		while(i < str.length()) { //문자열길이 -1까지 반복하는 조건
			System.out.println(str.charAt(i));
			i++;
		}
		
		
		
	}
	
	public void method7() {
		//문자열 입력 받고 그 문자열이 "exit"가 아닐 때까지 반복
		//exit가 입력되면 종료
		
		Scanner sc = new Scanner(System.in);
		
		String str = "";
		
		while(!str.equals("exit")) {
			System.out.print("문자열을 입력해주세요 : ");
			str = sc.nextLine();
			System.out.println("입력 받은 문자열 : " + str);
			
		}
		System.out.println("exit 입력으로 종료 되었습니다.");
	}
	
	//==========중첩 반복문============
	
	public void method8() {
		
		// 2단부터 9단까지 while문 중첩해서 출력하기
		int dan = 2;
		while(dan <= 9) {
			
			int su = 1; //내부 while에 대한 초기식은 외부 while 반복 할 때마다 수행되어야 한다. 
				System.out.println("===" + dan + "단===");
			while(su <= 9) {
				System.out.println(dan + " * " + su + " = " + (dan * su));
				su++; //내부 while에 대한 증감식
			}
			dan++; //외부 while문에 대한 증감식(위지 중요!! 외우기)
		}
		
		
	}
	
	public void method9() {
		//for문에서 작성한 0시 0분 ~ 23시 59분 출력문 while문으로 변경
		
		int h = 0;
		while(h<=23) {
			System.out.println("=======" + h + "시=======");
			int m = 0;
			while(m <= 59) {
				System.out.println(h + "시" + m + "분");
				m++;
			}
		h++;
		}
		
	//정해진 횟수만큼 반복하고자 할 때는 for문을 활용하는 것이 편리
	//while문은 정해진 횟수가 아니라 조건을 판단하여 조건을 만족하는 동안 반복하는 상황에 사용
		
	}
	
	public void method10() {
		//메뉴를 만들고 사용자가 프로그램 종료를 선택하기 전까지는
		//계속해서 반복하는 프로그램 만들기
		Scanner sc = new Scanner(System.in);
		
		
		//while문의 조건식에 true를 넣으면 계속해서 반복하는 무한 루프를 만들 수 있음
		while(true) { //true = 항상 이 while문은 이 조건을 만족한다는 의미
		System.out.println("======메뉴======");
		System.out.println("1. 안녕하세요 5번 출력하기");//method1
		System.out.println("2. 1부터 10까지 출력하기");//method2
		System.out.println("3. 10부터 1까지 출력하기");//method3
		System.out.println("9. 프로그램 종료");
		System.out.print("메뉴 선택 : ");
		
		int menu = sc.nextInt();
		
		switch(menu) {
		case 1 : method1();break;
		case 2 : method2();break;
		case 3 : method3();break;
		case 9 : System.out.println("프로그램을 종료합니다");return;
		//return은 반복되던 것을 그만둔다는 메소드
		default : System.out.println("잘못 입력하셨습니다");
		}
		System.out.println();
		
		}
		
		
		
	}
	
}

 

3. Do~While문

1) 식

2) 특징

do 안의 내용 먼저 실행

조건식 확인 후 true면 문장 수행, false면 종료

while 뒤에 ; 꼭 필요

 

*{ } 안에 조건을 벗어나게 할 연산(증감식, 분기문) 필요

*while과 do~while의 차이점 do~while은 조건문이 true가 아니더라도 무조건 한 번 이상 수행

package com.kh.chap02.loop;

import java.util.Scanner;

public class C_DoWhile {

	public void method1() {
		
		/*dowhile문
		 * 
		 * [초기식]
		 * do {
		 *		실행할 코드;
		 * 		[증감식/분기문]
		 * } while(조건식);
		 * 
		 */
		int num = 0;
		
		while(num != 0) {
			System.out.println("while문 : " + num );
		}
		do {
			System.out.println("do while문 : " + num);
		} while(num != 0);
		//do while이 while과 다른 점은 조건이 맞지 않아도
		//반듯 ㅣ한 번은 수행 먼저 하고 조건 검사를 한다는 점
	}
	
	
	public void method2() {
		//문자열 입력 받아 하나의 문자씩 출력하기
		Scanner sc = new Scanner(System.in);
		System.out.print("문자열 입력 : ");
		String str = sc.nextLine();
		
		int i = 0;
		do {
			System.out.println(str.charAt(i));
			i++;
		}while (i < str.length());
		//빈 문자열을 입력했을 때는 오류가 나고, 
        //똑같은 현상을 while에 입력했을 때는 아무 문제가 발생하지 않는다.
		//while문과 같이 charAt 호출 전 길이 값 확인 절차 필요
	}
	
		
	}
package com.kh.chap02.run;

import com.kh.chap02.loop.A_For;
import com.kh.chap02.loop.B_While;

public class Run {

	public static void main(String[] args) {
		
		A_For a = new A_For();
		a.method15();
		
		//B_While b = new B_While();
		//b.method10();

	}

}

'웹개발 수업 > JAVA' 카테고리의 다른 글

[Day +8] 배열1  (0) 2021.07.11
[Day +7]분기문  (0) 2021.07.11
[Day +5]조건문  (0) 2021.07.11
[Day +4] 연산자  (0) 2021.07.11
[Day +3] 선언과 초기화, 형변환, 데이터 오버플로우, printf, escape문자  (0) 2021.07.11