Java

반복문(iteration statements) - for & while & do-while

제주니어 2022. 8. 19. 22:00

반목문 - for, while, do-while

  • 반복문은 특정 코드를 반복적으로 실행시키는 구문이다.

1. for문

  • 반복 횟수를 알고 있을 때 적합하다.
for(초기화; 조건식; 증감식) { // 반복되는 부분 LOOK FOR 
    // 조건식이 true일 때 수행될 문장들을 적는다. LOOK FOR문
}

1) for문의 구조와 수행순서

  • 초기화 → 조건식 → 수행 될 문장 → 증감식, 조건식이 false이 되면 for문 전체를 빠져나가게 된다.

2) 초기화

  • 반복문에 사용될 변수를 초기화하는 부분이며 처음에 한번만 수행된다.
  • 보통 변수 하나로 for문을 제어하지만, 둘 이상의 변수가 필요할 때는 ‘,’를 구분자로 변수를 초기화하며 두 변수의 타입은 같아야 한다.

3) 조건식

  • 조건식의 값이 true이면 반복을 계속하고, false이면 반복을 중단하고 for문을 벗어난다.
  • 조건식을 잘못 작성하면 블럭{} 내의 문장이 한 번도 수행되지 않거나 영원히 반복된다.

4) 증감식

  • 반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식이다.
  • 매 반복마다 변수의 값이 증감식에 의해서 점진적으로 변하다가 조건식이 false이 되어 for문을 벗어나게 된다.
  • 연산자(++,- -)을 주로 사용하며, ‘,’를 이용해서 두 문장 이상을 하나로 연결해서 쓸 수 있다.
public void method1() {
		
		for(int i = 1; i <=10; i+=2) { // 1 3 5 7 9
			System.out.println(i + "번째 출력");
		}
		
		System.out.println();
		
		for (int i = 20; i > 15; i--) { // 20 19 18 17 16
			System.out.println(i + "번째 출력");
		}
	}

 

public void method2() {
		// 1부터 10까지의 정수들의 합계를 출력
		// 1 + 2 + 3 + 4 ... + 10
		// sum + = 1;
		// sum + = 2;
		// ...
		// sum + = 10;
		
		int sum = 0;
		
		for(int i = 1; i < 10; i++) {
//			sum = sum + i;
			sum += i;
//			System.out.println(i); // 연산 과정을 보고 싶으면 이렇게 하거나 debug 이용하기
//			System.out.println(sum);
		}
		
		System.out.println("합계 : "+ sum);
	}

 

public void method3() {
		// 1부터 랜덤값(1~10)까지의 합계를 구하시오.
		// java.lang.Math 클래스에서 제공하는 random() 메소드를 사용해서 랜덤값을 발생시킬 수 있다.
		// Math.random() 호출 시 -> 0.0 ~ 0.999999 사이의 랜덤값을 발생 (0.0 <= 랜덤값 < 1.0)
		
//		int random = Math.random(); // error
//		int random = (int) (Math.random() * 10); // 0.0 ~ 9.999999f.. -> 0 ~ 9
		int random = (int) (Math.random() * 10 + 1); // 1.0 ~ 10.999999f.. -> 1 ~ 9
		int sum = 0 ;
		
		
		System.out.println("1 ~10 사이의 랜덤값 : " + random);
		
		for (int i = 1; i <= random; i++) {
			sum +=i;
			
		}
		System.out.printf("1부터 %d까지의 합 : %d\\n", random, sum);
		
	}

 

실습문제

 

/*
	 * 실습 문제 1
	 * 1부터 사용자로부터 입력받은 수까지의 합계를 구하시오.
	 * 예시) 
	 * 	정수 > 10
	 * 	총 합계 > 55
	 */
	
	public void practice1() {
		int num = 0;
		int sum = 0;
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("정수 > ");
		num = scanner.nextInt();
		
		for(int i = 1; i <= num; i++) {
			sum +=i;
		}
		System.out.println("총 합계 : " + sum);
		scanner.close();
	}
	
	/*
	 * 실습 문제 2
	 * 사용자가 입력한 단을 출력하시오.
	 * 	예시) 
	 *  단 수(2~9)를 입력해 주세요. > 3
	 *  3 x 1 = 3
	 *  ...
	 *  3 x 9 = 27
	 *  
	 *  단 수(2~9)를 입력해 주세요. > 12
	 *  1~9 사이의 양수를 입력하여야 합니다.
	 */
	
	public void practice2() {
		int num = 0;
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("단 수(2~9)를 입력해 주세요 >");
		num = scanner.nextInt();
		
		if(num >= 2 && num < 10) {
			for(int i = 1; i < 10; i++) {
			System.out.printf("%d X %d = %d\\n",num, i, num * i);
			} 
		} else {
			System.out.println("2~9사이의 양수를 입력하여야 합니다.");
		}
		
		scanner.close();
	}

5) 중첩 for문

  • for문 안에 또 다른 for문을 포함시키는 것이며 중첩의 횟수는 거의 제한이 없다.
public void method4() {
		/*
		 *  2단 ~ 9단까지
		 * 단  -> 2 ~ 9까지 1씩 증가 (바깥쪽 for 문을 통해 해결)
		 * 곱해지는 수 -> 1 ~ 9까지 1씩 증가 (안쪽 for 문을 통해 해결)
		 * == 2단 ==
		 * 2 x 1 = 2  
		 * 2 x 2 = 4  
		 * 2 x 3 = 6  
		 * ...
		 * == 9단 == 
		 * 9 x 1 = 9
		 * 9 x 2 = 18
		 * 9 x 3 = 27
		 * 9 x 4 = 36
		 * ...
		 */
		
		for(int i = 2; i <= 9; i++) {
			System.out.printf("== %d단 == \\n", i);
			
			for(int j = 1; j <= 9; j++) {
				System.out.printf("%d x %d = %d\\n", i, j, i*j);
			}
			System.out.println();
		}
		
	}

 

public void method5() {
		/*
		  ***** 
		  *****
		  *****
		  *****
		 */
		
		// 행이 1 ~ 4까지 반복 (바깥쪽 for 문)
		// 열이 1 ~ 5까지 반복 (안쪽 for 문)
		
		for (int i = 0; i < 4; i++) {
			for(int j = 0; j < 5; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}

 

실습문제

/*
	 * 실습 문제 3
	  아래와 같이 출력 되도록 중첩 for 문을 작성하시오.
	  
	  예시)
	  1***
	  *2**
	  **3*
	  ***4
	 */
	
	public void practice3() {
		// 행이 1 ~ 4까지 반복
		// 열이 1 ~ 4까지 반복
		// 행과 열의 값이 같으면 숫자를 출력, 이외에는 * 출력
		for(int i = 0; i < 4; i++) {
			for(int j = 0; j < 4; j++) {
				if(i==j) {
					System.out.print(i + 1);
				} else {
					System.out.print("*");
				}
		}
			System.out.println();
		}
	}
	
	/*
	 * 실습 문제 4
	  아래와 같이 출력 되도록 중첩 for 문을 작성하시오.
	  
	  예시)
	  *
	  **
	  ***
	  ****
	  *****
	 */
	
	public void practice4() {	// 자바의 정석 p163 코드 참고 
		// 행이 1 ~ 5까지 반복
		// 열이 1 ~ 5까지 반복
		// 열의 값이 행보다 작거나 같을 때까지 * 출력
		for(int i = 0; i < 5; i++) {
			for(int j= 0; j < i + 1; j++) {
					System.out.print("*");
		}
			
//			for(int j= 0; j < 5; j++) {
//				if(j <= i) {
//					System.out.print("*");
//				}
//			}
			System.out.println();
	}
}
	
	/*
	 * 실습 문제 5
	 * 
	 * 사용자가 "안녕하세요."라고 입력하면 아래와 같이 출력되도록 코드를 작성하시오.
	 * "안"
	 * "녕"
	 * "하"
	 * "세"
	 * "요"
	 * "."
	 * 
	 * 참고 - length(), charAt() 메소드를 활용
	 * 
	 */
	
	public void practice5() {
		String str = null;
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("문자열 입력 > ");
		str = scanner.nextLine();
		
		for(int i = 0; i < str.length(); i++){
			System.out.printf(" \\"%c\\"\\n", str.charAt(i));
		}
		scanner.close();
	}
}

6) 향상된 for문(enhanced for statement)

for(타입 변수명 : 배열 또는 컬렉션){
	// 반복할 문장
}
  • 위의 문장에서 타입은 배열 또는 컬렉션의 요소의 타입이어야 한다.
  • 배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀서 변수에 저장된다.
  • 반복문의 괄호{}내에서는 이 변수를 사용해서 코드를 작성한다.

2. while문

  • while 문은 조건식이 true 일 경우에 코드를 반복 실행하는 구문이다.
  • while 문을 빠져나가기 위한 코드(증감식, 분기문)가 필요하다.
while (조건식) {
	// 조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다. 
}
  • while문의 조건식은 생략불가
while (true){
	// 조건식이 항상 참 ...
}

 

public class D_While {
	/*
	 * while 문
	 * 
	 * [표현식]
	 * 	[초기식]
	 * 	while(조건식){
	 * 	 ..실행 코드..
	 * 
	 * 	 [증감식, 분기분]
	 * 	}
	 */
	
	public void method1() {
		// 1부터 랜덤값(1 ~ 10)까지의 합계
		int sum = 0;
		int random = (int)(Math.random()*10+1);
		
		int i = 0;
		
		while(i <= random) {
			sum +=i;
			
			i++;
		}
		System.out.printf("1부터 %d까지의 합 : %d", random, sum);
	}
	
	// 사용자에게 계속 문자열을 입력 받고 그 문자열을 출력한다.
	// 단, "exit"문자열을 입력하면 프로그램을 종료한다. 
	public void method2() {
		String str = "";
		Scanner scanner = new Scanner(System.in);
		
//		while(true) {
//			System.out.print("문자열을 입력해주세요 > ");
//			str = scanner.nextLine();
//			
//			if(str.equals("exit")) {
//				break;
//			}
//			
//			System.out.println(str);
//		}
		
		while(!str.equals("exit")) {
			System.out.print("문자열을 입력해주세요 > ");
			
			str = scanner.nextLine();
			
			System.out.println(str);
		}
		System.out.println("프로그램을 종료합니다.");
		scanner.close();
	}
}

3. do-while문

  • do-while 문은 while 문과 동일하게 조건식에 의해 코드를 반복 실행하는 구문이지만 조건식이 true가 아니더라도 무조건 한 번은 실행되는 구문이다.
do {
    // 조건식의 연산결과가 참일 때 수행될 문잗들을 적는다
    // 증감식 or 분기문
} while(조건식); -> 끝에 ';'을 잊지 않도록 주의 

4. break문

  • break 문은 switch 문과 for 문, while 문, do-while 문의 실행을 중지하고 빠져나갈 때 사용한다.
  • 반복문이 중첩되어 있는 경우 break 문이 포함되어 있는 반복문만 중지하고 빠져나간다.
while(true) {
    for(int i = 0; i < 10; i++ ) {
        if (i == 5) {
            break;
        }
        System.out.println("i : " + i);
    }
}

 

public class F_Break {
	public void method1() {
		// 1부터 랜덤값(1 ~ 10)까지의 합계를 반복문을 통해서 출력한다.
		// 단, 랜덤값이 숫자 5가 나오면 프로그램을 종료한다. 
		int sum;
		int random; 
		// 밑에 초기화 하기 때문에 
		
		while(true) {
			sum = 0; // 반복할 때마다 sum을 초기화하지않으면 전의 값에 누적해서 더해주기 때문에 초기화해야 한다. 
			random = (int)(Math.random() * 10 + 1); // 0.0 ~ 0.999999
			
			if(random == 5) {
				break; // break가 포함되어 있는 반복문을 빠져 나간다. 
			}
			
			for(int i = 1; i <= random; i++) {
				sum +=i;
			}
			
			System.out.printf("1부터 %d까지의 합계 : %d\n", random, sum);
		}
		
		System.out.printf("랜덤값이 %d이므로 프로그램을 종료합니다.", random);
	}

5. continue문

  • continue 문은 반복문에서 이후의 문장을 실행하지 않고 증감식 또는 조건식으로 이동할 때 사용한다.
  • 반복문이 중첩되어 있는 경우 continue 문이 포함되어 있는 가장 가까운 반복문의 증감식 또는 조건식으로 이동한다.
  • 반복문 전체를 벗어나지 않고 다음 반복을 계속 수행할 수 있다는 점이 break문과 다르다.
  • 전체 반복 중에서 특정 조건을 만족하는 경우를 제외하고자 할 때 유용하다.
while(true) {
    for(int i = 0; i < 10; i++ ) {
        if (i == 5) {
            continue;
        }
        System.out.println("i : " + i);
    }
}
public class G_Continue {

	public void method1() {
		// 1부터 100까지 정수들의 합을 출력하시오.
		// 단, 5의 배수는 제외하고 덧셈 연산을 한다. 
		int sum = 0;
		
		for(int i = 0; i <= 100; i++) {
			if(i % 5 == 0) {
				continue;
			}
			sum +=i; // sum = sum + i;
		}
		
		System.out.println("합계 : " + sum);
	}
	
	public void method2() {
		// 2 ~ 9단까지 출력하시오.
		// 단, 홀수단을 빼고 출력한다.
		
		for(int i = 2; i <= 9; i++) {
			if(i % 2 != 0) {
				continue;
			}
			System.out.printf("=== %d단 ===\n", i);
			
			for(int j = 1; j <=9; j++) {
				System.out.printf("%d x %d = %d\n", i, j, (i * j));
			}
			System.out.println();
		}
	}
}

6. 이름 붙은 반복문

  • break문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에, 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다.
  • 이때 반복문의 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.
Loop1 : for(int i =2; i<=9; i++){
	for(int j=1; i<=9; j++){
		if(j==5)
			break Loop1;
			break;
			continue Loop1;
			continue;
		System.out.println(i+"*"+j+"="+i*j);
}
System.out.println();
}
  • j가 5일 때 반복문 Loop1을 벗어나도록 했으므로 2단의 4번째 줄까지 밖에 출력되지 않았다.
  • 만일 반복문의 이름이 지정되지 않은 break문이었다면 2단부터 9단까지 모두 네 줄씩 출력되었을 것이다.