반복문 (for, while)

이동주·2025년 3월 1일

JAVA

목록 보기
9/30

for

-> 실행문을 여러 번 실행하여 코드를 간결하게 하는 구문!
-> 형태

for(초기화식;조건식;증감식) {
실행문
}

-> 실행 과정
1. 초기화식을 실행
2. 비교 연산자를 사용한 조건식을 평가 후 true와 false여부 판단
(false의 경우 실행 종료)
3. 실행문 실행
4. 증감식 실행 (횟수 추가)

package ch04.sec04;

public class ForExam1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i=1;i<=10;i++) {
			// for문 : 실행문을 원하는 횟수만큼 반복실행함
			// (초기값;조건식;증감문){실행문}의 구조를 가짐
			// 본 for문은 같은 실행문을 10번 실행하는 것
			// 1부터 10까지 수를 나열하는 구문
			System.out.print(i + " ");
		}
	}

}
package ch04.sec04;

public class For1to100Sum {
	public static void main(String[] args) {
		int sum = 0; // 값을 저장해야 함으로 초기값을 0으로 설정
		int i;
		
		for(i=1;i<=100;i++) {
			sum += i; // sum = sum + i -> sum 값이 없을 경우 에러 발생
		}
		// 1부터 100까지의 수를 더하는 for문
		// i의 초기값을 1로 설정
		// i 값이 100과 같거나 작은지 확인 -> 이 결과가 false일 경우 실행 종료
		// 실행문 실행
		// i에 1이 더해짐 (실행 횟수도 1 추가)
		
		System.out.println(sum);
	}

}

다중 for문

-> for문 안에 for문이 들어간 형태로 내부의 for문을 실행하고 외부의 for문을 실행하는 구조!
-> 아래는 구구단을 출력하는 for문

package ch04.sec04;

public class Gugudan {
	public static void main(String[] args) {
		for(int x=2;x<=9;x++) {
			System.out.println(x + "단");
			for(int y=2;y<=9;y++) {
				System.out.println(x + "x" + y + "=" + (x*y));
			}
			System.out.println();
		}
		
		// 구구단을 출력하는 문제
		// for문안에 for문 사용 가능! (중첩 for문)
		// 중첩 for문의 경우 가장 안쪽에 있는 for문부터 실행!
	}
}

실수 형태의 for문

-> 실수 형태의 값은 오차범위가 존재하기 때문에 실수 형태의 값으로 for문을 실행시킬 경우 원하는 대로 반복되지 않을 가능성이 큼
-> for문에서 정수 형태의 값으로 실행 시키고 for 실행문 부분에 실수 형태의 값의 증감식을 진행하면 됨!
-> 물론 위와 같이 진행한다고 하더라도 실수 형태의 값이 오차범위가 있기 때문에 원하는 만큼 반복은 하더라도 결과값에 오차가 있을 가능성이 있음

package ch04.sec04;

public class floatFor {
	public static void main(String[] args) {
		for(float x=0.1f; x<=1.0f; x+=0.1f) {
			System.out.println(x);
		}
		// for문에 실수를 넣지 않는게 좋음
		// 실수는 정밀도가 떨어져 오차범위가 있기 때문에 원하는 횟수만큼 반복하기 어려움
		System.out.println();
		
		float x = 0; // float 변수 x값에 초기값을 줌
		
		for(int i=1;i<=10;i++) {
			x += 0.1f; // x에 0.1씩 더함
			System.out.println(x);
		}
		// for문에 정수를 넣고 실행시키면 원하는 횟수만큼 반복이 가능함
		// 하지만 실수값은 오차범위가 존재하기에 값의 정밀도는 떨어지는 것은 감안해야함
		System.out.println();
		
		float y = 0;
		float z = 1;
		
		for(int i=1;i<=10; i++, y+=0.1f, z-=0.1f) { 
        //for문 증감식에 여러 증감식을 사용할 수 있음
			System.out.println(y);
			System.out.println(z);
		}
		
		
	}
	
	
}

while

-> 괄호 안의 조건식이 true일 경우 실행문이 계속 실행되는 구문
-> 조건식의 경우 비교 연산자나 boolean 변수나 값이 사용됨
-> boolean 변수가 사용될 경우 구문 내부에 빠져나갈 수 있는 구문을 만들어줘야함 (false)
-> 비교 연산자가 조건식에 사용될 경우 실행문 안에 증감식을 넣어주면 됨!
-> 구조
while(조건식){
실행문
}

-> 실행
1. 조건식의 결과가 true일 경우 실행문이 계속 실행됨
2. 조건식의 결과가 false일 경우 실행이 중지됨

package ch04.sec05;

public class whileExam1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i = 1;
		while(i<=10) { //i가 10이 될때까지 계속 실행
 			System.out.print(i + " ");
			i++; // i에 1씩 더하기
		}
	}
}
package ch04.sec05;

public class WhileSum1to100 {
	public static void main(String[] args) {
		int sum = 0; // 합계 구하는 변수, 초기값을 정해줘야 값을 더할 수 있음
		int i = 1;
		
		while(i<=100) { //i가 100이 될때까지 실행
			sum += i; // sum 변수에 i를 더함
			i++; // i에 1을 더함
		}
		
		System.out.println(sum);
	}

}
package ch04.sec05;

import java.util.*; //Scanner 함수를 불러오기 위해 임포트함

public class WhileExam2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in); // Scanner를 사용하기 위한 함수
		boolean run = true; // while문 실행을 위한 변수
		int speed = 0; // speed 값의 증감을 위해 초기값 설정
		
		while(run) { // run = true이면 실행
			System.out.println("1.증속 | 2.감속 | 3.중지");
			System.out.print("선택: ");
			
			String strNum = sc.nextLine(); // 문자열 입력
			
			if(strNum.equals("1")) { // 문자열 값이 1이면 실행
				speed++; // speed 값 1씩 증가
				System.out.println("현재 속도: " + speed);
			}
			
			else if(strNum.equals("2")) { // 문자열 값이 2이면 실행
				speed--; // speed 값 2씩 증가
				System.out.println("현재 속도: " + speed);
			}
			else if(strNum.equals("3")) { // 문자열 값이 3이면 실행
				run = false; // while문의 조건을 false로 바꾸어 실행 중지
			}
			else {
				System.out.println("잘못 입력하셨습니다.");
			}
		}
		System.out.println("프로그램 종료");
	}

}
package ch04.sec05;

import java.util.*;

public class whileExam3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		int speed = 0;
		boolean run = true;
		
		while(run) {
			System.out.println("1.증속 | 2.감속 | 3.중지");
			System.out.print("선택: ");
			
			int num = sc.nextInt(); // 정수를 입력받음
			
			if(num==1) {
				speed++;
				System.out.println("현재 속도: " + speed);
			}
			else if(num==2) {
				speed--;
				System.out.println("현재 속도: " + speed);
			}
			else if(num==3) {
				run = false;
			}
			else {
				System.out.println("잘못 입력됨");
			}
		}
		
		System.out.println("프로그램 종료");

	}

}
package ch04.sec05;

import java.util.*;

public class WhileBaseballTeam{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		String team = "";
		
		while(!team.equals("SSG")) {
			System.out.print("팀 이름 입력: ");
			team = sc.nextLine();
			
			if(team.equals("LG")) {
				System.out.println("LG트윈스");
			}
			
			else if(team.equals("키움")) {
				System.out.println("키움히어로즈");
			}
			
			else if(team.equals("KIA")) {
				System.out.println("KIA타이거즈");
			}
			else {
				System.out.println("몰라");
			}
		}
		
		System.out.println("SSG랜더스");

	}

}
package ch04.sec05;

import java.util.Scanner;

public class WhileExam3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		String input;
		int speed = 0;
		boolean run = true;
		
		while(run) {
			System.out.println("1.증가 | 2.감소 | U:속도 10증가 | D:속도 10감소 | 3.종료");
			System.out.print("선택: ");
			input = sc.nextLine();
			
			if(input.equals("1")) {
				speed++;
				System.out.println("현재 속도: " + speed);
			}
			else if(input.equals("2")) {
				speed--;
				System.out.println("현재 속도: " + speed);
			}
			else if(input.equalsIgnoreCase("u")) { 
            // .equalsIgnoreCase : 대소문자 상관 x
				speed += 10;
				System.out.println("현재 속도: " + speed);
			}
			else if(input.equalsIgnoreCase("d")) {
				speed -= 10;
				System.out.println("현재 속도: " + speed);
			}
			else if(input.equals("3")) {
				run = false;
			}
		}

		System.out.println("프로그램 종료");
	}

}

.equalsIgnoreCase()

-> 대/소문자 상관하지 않는 함수
-> 구조 : 문자열변수.equalsIgnoreCase

do~while

-> 블록 내부를 실행시키고 실행 결과에 따라 반복 실행을 할지 결정
-> 일단 실행시키고 조건식을 마지막에 판단함
-> 조건이 성립되지 않으면 실행이 되지 않는 while문과 달리 최소 1번 이상은 실행이 가능함
-> 마지막에 while문 뒤에 세미콜론(;) 붙여야함
-> 주로 채팅창 같은 것에 쓰임
-> 구조
do{
실행문
}while(조건식);

package ch04.sec06;

import java.util.*;

public class doWhileExam {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("메세지를 입력하세요");
		System.out.println("프로그램을 종료하려면 q를 입력하세요");
		
		Scanner sc = new Scanner(System.in);
		String inputString;
		
		do {
			System.out.print(">");
			inputString = sc.nextLine();
			System.out.println(inputString);
		} //do에서 구문 실행
		while(!inputString.equalsIgnoreCase("q")); // 대문자/소문자 구분없이 q가 나오면 종료. 조건을 나중에 하는 방식
		
		// do~while문의 특징
		// 먼저 실행을 하고 계속 실행할지 나중에 판단하는 구문
		// do 구문 블록안에 실행문을 넣음
		// do의 실행문을 확인하고 계속 실행할지 뒤에있는 while문의 조건식에서 판단함
		// 일반 while문과 다르게 do~while문의 while문에는 뒤에 ;를 꼭 붙여줘야함
		
		System.out.println();
		System.out.println("프로그램 종료");
	}

}

break

-> for, while, do~while문의 실행을 중지하거나 switch문을 종료할 때
-> 보통 if문과 같이 사용되어 조건식에 따라 반복문을 종료함
-> break문은 해당 구문의 블록 안의 실행만 멈출 수 있음
-> 중첩 for문의 경우 내부 for문에 break 설정 시 내부 for문에만 적용됨

package ch04.sec07;

public class breakExam1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		while(true) { // while문 실행
			int num = (int)(Math.random()*6) + 1; // 1~6의 임의의 수 받기
			System.out.println(num);
			if(num == 6) { // num이 6이라면
				break; // 실행을 멈춰라!
			}
		}
		System.out.println("프로그램 종료");

	}

}

Label

-> 해당 구문 블록의 바깥의 블록의 반복문까지 중지시키는 법
-> Label 적용!
-> Label : 반복문 앞에 임의로 문구를 붙여 해당 반복문임을 명시하는 것
-> break문에 label 문구와 같이 적어주기
-> 사용법
Label(임의 설정) : for(조건문){
break Label(임의 설정);

package ch04.sec07;

public class BreakLabel {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Outter : for(char upper='A';upper<='Z';upper++) { // Outter(Label)의 역할 : 반복문에 임의로 이름을 정하는 것!
			for(char lower='a';lower<='z';lower++) {
				System.out.println(upper + "," + lower);
				if(lower=='k') {
					break Outter; 
					// 내부의 블록 구문에서 바깥 반복문까지 실행을 멈추고 싶을 때 임의로 정해놓은 라벨(바깥 for문의 이름)을 선언하여 멈추게 할 수 있음
					// 라벨을 선언하지 않을 경우 내부의 for문에서만 break되고 외부 블록의 구문은 계속 실행됨
				}
			}
		}
		System.out.println("실행 종료");

	}

}

Continue

-> 특정 조건을 건너 뛰고 반복문을 계속 실행하는 것
-> for, while, do~while에서만 적용

package ch04.sec08;

public class ContinueExam {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i=1;i<=10;i++) {
			if(i%2 != 0) { // i를 2로 나누었을 때 나머지가 0이 아닐 때! (2의 배수일때!)
				continue; // 위의 조건을 충족할 시 반복문의 조건을 건너뛴다는 개념!
			}
			System.out.print(i + " ");
		}
	}

}
profile
끄작끄작

0개의 댓글