Backend/개발 공부

[JAVA|자바] 반복문 _for, while, do- while

Deeb 2021. 9. 8. 09:07

반복문

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

 

1) for문 ( 몇바퀴 돌지 안다면 for)

구문

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

for(int i = 1; i <= 10; i++) {
	System.out.println(i + "출력");
}

정의 : ~을 하는 동안의 의미로, 조건식을 만족할 때까지 반복해라

 

- 초기식 : for문 내부에서 사용할 변수. 보통 for문의 반복 제어를 위해 사용한다.

 

- 조건식 : for문의 반복 여부를 지정하는 식.

보통 초기식에 사용한 변수를 이용하여 조건식을 작성한다. 

언제까지 반복 할 것인지에 대한 조건(true/false)

조건식이 true면 문장 수행 후 증감식 연산 조건식이 false면 수행하지 않는다. 

 

- 증감식 : 초기식에 사용된 변수를 for문이 종료할 때 마다 증가 또는 감소시켜 조건식의 결과를 변화하게한다.

보통 초기식을 이용하며 그 값을 증가 또는 감소시켜 반복문이 반복됨에 따라 조건식 결과를 변하게 되는 경우를 만들어 낸다. 

 

1회전: 초기식이 조건식을 만족하는 true면 문장 수행 후 증감식 연산

2회전부터는 조건식이 false가 나올 때까지 문장 수행

i++ (후위를 쓰는 이유) : 전위를 써도 상관은 없지만 연산이 i혼자만 이루어지기때문에 ++i써도 상관은 없다.

하지만 다른 식으로 나온다면 따져야한다

 

증감식이 단순히 초기식 1 증가/감소로 작성된 경우, 전위, 후위 연산을 구분하지 않음. 

 

기초1) 1~20까지 2씩 증가하며 출력

for(int i = 1; i <= 15; i+=2) {   
	System.out.println(i);
}

복합대입연산자( +=, -=, *=, /=)

:기존 변수의 값에 새로운 값을 누적시켜 저장한다. 

 

만약 부등호 오류나면
오류1 : 조건식 부등호 방향을 잘못 작성한 경우
한 번도 실행되지 않거나, 무한히 실행된다

 

기초+ 응용) 'A' ~ 'Z' 순서대로 알파벳 모두 출력하기

for(char i = 'A'; i <='Z'; i += 1) {
	System.out.println(i);
}

chat == 문자형 == 실제로는 정수를 저장
  -> 저장된 정수값에 맞는 문자 모양을 유니코드표에서 찾아 출력

 

응용1)정수 5개를 입력 받아 합계 출력

 

 

for(int i=1; i<=5; i++) {

결과

 

 

예제)

정수 두개 입력 받아 5의 배수인 수는 빼기

// for문 응용문제
// 정수를 두개 입력받아
// 두 정수 사이의 모든 정수의 합계를 구한다. = sum
// 단, 합계에서 3의 배수 제외  3배수 제어;

// 예시1)
// 정수 입력 : 1
// 정수 입력 : 10
// 3의 배수를 제외한 합계 : 37

 

내가 푼 코드

public void example10() { //실습
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("정수 입력1 : ");
		int num1 = sc.nextInt();
		
		System.out.print("정수 입력2 : ");
		int num2 = sc.nextInt();
		
		int sum1 = 0;
		int sum2 = 0;
	
		for(int i = num1; i <= num2; i++ ) {
			sum1 += i;
		}
		
		for(int j = num1; j <= num2; j+=3 ) {
			sum2 += j; //점수 누적
			
		}
	
		System.out.print(sum1-sum2);
			
		}

i % 3 != 0

3의 배수가 아닐때!

너무 스트레스 받아서 기억할 수 밖에 없을듯

 

 

2) 중첩 for문

구문

for(초기값1; 조건식1; 증감식1) {
	수행될 코드1;
	for(초기값2; 조건식2; 증감식2) {
		수행될 코드2;
	}//안 쪽 for문 end
	수행될 코드3;
} //바깥쪽 for문 end
for(int min = 0; min <=59 ; min++) { //min 60미만까지 1씩 증가
			
	// 1분 == 60초
	for(int sec = 0; sec < 60; sec++) {
				
	System.out.printf("%02d분 %02d초\n", min, sec ); 
	// 02d : 2칸 확보하여 오른쪽 정렬, 빈칸에 0추가
	// 01, 02,03
	}	
}

 

안의 반복문이 다 끝나야

밖으로 나온다 

==> 안쪽 반복문이 진행되면

바깥쪽 반복문이 1 증가하는 형태

 

 

그러니 안과 밖의  for문 사이에 추가하고싶은게 있다면

바깥 for문에 넣기

	public void example12() {
		//중첩 반복문 기초1
		// 구구단 2~9단 모두 출력하기
		// 단 x 수
		// 각 단을 구분할 수 있도록 한 칸 띄기
		for(int dan = 2; dan <=9; dan++) { //단 부터
			for(int su =1; su <= 9; su++) { //
				
				System.out.printf("%d x %d = %2d\n", dan, su, dan*su);
				} //수 반복
				
			//su가 끝나고 나왔을때 한 줄을 띈다
			System.out.println();
			}// dan 끝
	}

 

 

구구단 응용

한 줄에 한 단씩 출력하기

public void example13() {
		//중첩 반복문2
		// 구구단 2~9단 모두 출력하기
		// 한 줄에 한 단씩 출력하기
		
		//ex) 
		// 2 x 1 = 2
		// 3 x 1 = 3
		for(int dan = 2; dan <=9; dan++) {
			for(int su = 1; su <= 9; su++) {
				System.out.printf("%dx%d = %2d ", dan, su, dan*su); //한 단이 끝나면
			}// su 반복 끝
			System.out.println(); //
		}//dan 반복 끝
	}

 

예제

 

public void example17() {
		// 중첩 반복문 응용4
		// 알고리즘+ 로직 문제
		
		//2중 for문을 이용하여 아래 모양을 출력
		//1
		//12
		//123
		//1234
		
		// i =1 일때 1
		// i =2 일때 12
		// i =3 일때 123
		// i =4 일때 1234
		
		for(int i = 1; i <= 4; i++) {
			for(int j = 1; j <= i; j++) { //반복 되는 행의 수에 따라 출력되는 횟수가 변경
				System.out.print(j);
			}//안쪽 숫자for문
			System.out.println();
		}// 행 for문
	
	}
	
	public void example18() {
		
		// 1234
		// 123
		// 12
		// 1
				
		for(int i = 4; i >= 1; i--) { // 위의 코드에서 아래만 바꾸면된다
			for(int j = 1 ; j <= i; j++) { //반복 되는 행의 수에 따라 출력되는 횟수가 변경
				System.out.print(j);
				}//안쪽 숫자for문
			System.out.println();
			}// 행 for문
		
	}

 

3) while문 (언제까지)

 

while(조건식) {
	조건식이 true일 경우 수행할 코드;
   
	[증감식 or 분기문];
}

조건식이 만족하는 동안 수행될 코드를 한다.

 

: 별도의 초기식, 증감식이 존재하지 않고 반복 종료 조건을 자유롭게 설정하는 반복문

=> 언제 끝날지는 모르지만 종료조건은 있다

 

4) do - while문

구문

do {
	//최소 한번은 수행할 코드
} while (조건식) ;

 

// while
		
		Scanner sc = new Scanner(System.in);
		
		System.out.println("문자열 입력 (종료 시 !exit)");
		
		String str = ""; // 문자열 누적 저장용 변수
		String input = ""; // 입력 받는 용도의 변수
		
		
		// input값이 !exit일 경우 while문이 수행되지 못한다. 
		while(!input.equals("!exit")) { 
			//input에 저장된 값이 !exit과 같을 경우에만 반복 //false 
				// (input은 위에서 ""로 선언했기 때문에 while이 실행되지 않는다
			//!input.equals("!exit") : 대입과 비교값이 다를경우에만 반복한다 //true
			
			input = sc.nextLine();
			
			if(!input.equals("!exit")) {
				str += input + "\n";
			}
//			str += input + "\n";
			// if문을 쓰지 않는다면 !exit이 str안에 누적된다. 
		}
		System.out.println();
		System.out.println(str);
  }

 

while문을 do -while로 변환

// do - while
	Scanner sc = new Scanner(System.in);
		
		System.out.println("문자열 입력 (종료 시 !exit)");
		
		String str = ""; // 문자열 누적 저장용 변수
		String input = ""; // 입력 받는 용도의 변수
		
		do { 
			input = sc.nextLine();
			
			if(!input.equals("!exit")) {
				str += input + "\n";
			}
            
		} while(!input.equals("!exit"));
		
		System.out.println();
		System.out.println(str);
	}

do {}안에 있는 내용을 일단 실행한 후에 

 

일단은 do 내부에 있는 구문을 최소 한번은 수행하고 마지막에 반복 조건을 따지는 구문

 

 

for 와 while의 차이

for : 몇 번 반복할 것인가 (원하는 횟수를 조절) ex) 줄넘기 10번해라 명확한 종료조건

while: 언제까지 ex) 줄넘기 줄이 발에 걸릴때 까지 , 몇바퀴를 돌지 모르는 종료조건 

 

 

while (문자열.equals(문자열과 비교할 문자열))

 

 

if 문을 사용하다가 값이 true false가 나올 수 있는 상황 or 값이 여러개라면 flag를 사용할 수 있다. 

 

반응형