[Java] #6 제어문 2 (for문, while문, do~while문)

febCho·2023년 10월 4일
0

Java

목록 보기
10/53

제어문

2. 반복문

java의 반복문으로는 for문, while문, do~while문이 있다.

2-1. for문

흐름: 변수를 하나 할당 > 변수 초기화(임의의 값) > 조건 체크(중괄호 영역에서 반복) > 증감 > 조건 달성하여 false가 되면 반복문을 빠져 나옴(≠ 출력)

즉, for문은 조건이 true일 때만 수행문을 반복한다.
그리고 위의 흐름을 for문에서 사용하는 명칭으로 바꾸어 보면 다음과 같다.

  1. 초기식: 변수를 하나 할당 > 변수 초기화(임의의 값)
  2. 조건식: 조건 체크(중괄호 영역에서 반복)
  3. 증감식: 증감

아래 예제를 통해 for문을 더 자세히 알아 보자.

2-1-1. 단일 for문

package kr.s05.operation;

public class ForMain01 {
	 public static void main(String[] args) {
		 System.out.println("===for문===");
		      //초기식;조건식;증감식
		 for(int i=1;i<=5;i++) {
			 System.out.println(i);
		 }
		 System.out.println("================");
		 //수행문이 한 줄일 경우 {} 생략 가능
		 for(int i=1;i<=5;i++)
			 System.out.println(i);
         
         for(int i=5;i>=1;i--) {
			System.out.print(i + "\t");
		}
		System.out.println("\n===============");

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

여기서 int i=1;이 초기식, i<=5;가 조건식, i++가 증감식에 해당하며
i가 1에서 출발해 5 이하일 동안, i를 하나씩 증가시키면서 출력하는 for문임을 알 수 있다.

또한, 아래와 같이 for문과 대입 연산자 혹은 if문을 함께 활용 시 짝수만 출력할 수 있다.

package kr.s05.operation;

public class ForMain02 {
	public static void main(String[] args) {
	
		for(int i=0;i<=10;i+=2) {
			System.out.print(i + "\t");
		}
		System.out.println("\n================");
		
		for(int i=0;i<=10;i++) {
			if(i%2==0) {
				System.out.print(i + "\t");
			}
		}
	}
}

1번 방법은 i+=2 복합 대입 연산자를 활용해 i를 2씩 더해준 뒤 출력하는 것이고
2번 방법은 i가 2로 나누었을 때 나머지가 0인, 즉 짝수일 때만 출력되도록 if문의 중괄호 안에 출력식을 넣어준 것이다.

package kr.s05.operation;

public class ForMain03 {
	public static void main(String[] args) {
		//1부터 100까지의 합 구하기
		int sum = 0;
		
		for(int i=1;i<=100;i++) {
			sum += i;//sum = sum + i
		}
		
		System.out.println("1부터 100까지의 합 : " + sum);
		
		System.out.println("=====================");
		
		//1부터 100까지의 범위에서 짝수의 합을 구하기
		int total = 0;
		
		for(int i=1;i<=100;i++) {
			if(i%2==0) {//짝수일 경우 누적
				total += i;
			}
		}
		System.out.println("1부터 100까지 짝수의 합 : " + total);
		
	}
}

또한, for문과 복합 대입 연산자를 활용하면 일련의 숫자들을 더해 합계를 구하는 것도 손쉽게 할 수 있다.

for문 안에서 sum+= i와 같은 방법을 '누적'이라고 표현하며 if문을 통해 짝수를 구하는 방식을 접목해 1부터 100까지 짝수의 합을 구할 수도 있다.


다음은 Scanner를 통해 정수를 입력 받은 다음, for문을 통해 간단한 구구단 프로그램을 만드는 방법이다.
> Scanner, for문을 활용해 구구단 프로그램 만들기

2-1-2. 다중 for문

순차적으로 증감하는 값이 여러 개 필요할 경우 다중 for문을 사용하게 되는데, 프로그램이 느려질 위험이 있어 가급적 덜 쓰는 것이 좋으며 가장 많이 사용되는 것은 '이중 for문'이다.

package kr.s05.operation;

public class ForMain05 {
	public static void main(String[] args) {
		//2~9단까지 출력하기 위해 다중for문을 사용
		for(int dan=2;dan<=9;dan++) {//dan : 구구단의 단 2~9
			
			System.out.println("***" + dan + "단****");
			
			for(int i = 1;i<=9;i++) {//i : 곱해지는 수 1~9
				System.out.println(dan + "*" + i + "=" + dan*i);
			}
		}
	}
}

위 예제는 앞선 구구단 프로그램과 달리 단(dan)과 곱해지는 수 모두가 변하는 프로그램을 만들기 위해 이중 for문 형태를 띈다.

출력)
***2단****
2*1=2
2*2=4
2*3=6
2*4=8
2*5=10
2*6=12
2*7=14
2*8=16
2*9=18
***3단****
3*1=3
3*2=6
3*3=9
3*4=12
3*5=15
.
.
.

2-2. while문

흐름: while문 바깥에서 변수를 하나 할당 > 변수 초기화(임의의 값) > while문 안에서 조건 체크 > 조건에 부합할 때만 증감(중괄호 영역에서 반복)

while문은 조건 비교에 만족할 때만 수행문을 수행하는 반복문이다.

  1. 초기식: while문 바깥에서 변수를 하나 할당 > 변수 초기화(임의의 값)
  2. 조건식: while문 안에서 조건 체크
  3. 증감식: 조건에 부합할 때만 증감(중괄호 영역에서 반복)

다음 예제를 통해 더 자세히 알아 보자.

package kr.s05.operation;

public class WhileMain01 {
	public static void main(String[] args) {
		int i = 1;
		
		while(i <=10) {
			System.out.println(i++);
		}
		System.out.println("================");
		
		int j = 10;
		
		while(j >=0) {
			System.out.println(j--);
		}
	}
}

1) 여기서 int i = 1;이 초기식, i<=10;가 조건식, System.out.println(i++);가 증감식에 해당하며
i가 1에서 출발해 10 이하일 동안, i를 하나씩 증가시키면서 출력하는 for문임을 알 수 있다.

2) 만약 while문에서 증감식을 작성해 주지 않으면, 무한루프에 빠지게 된다.
ex.

while(i <=10) {
System.out.println(i);
}

→ 이때는 콘솔의 빨간 네모 버튼(terminate)을 눌러 루프를 멈추고 코드를 수정해야 한다.
terminate

또한, for문과 마찬가지로 복합 대입 연산자를 활용해 일련의 숫자들을 더해 합계를 구하는 것이 가능하다.

package kr.s05.operation;

public class WhileMain02 {
	public static void main(String[] args) {
		//1부터 100까지의 합 구하기
		int sum = 0, su = 1;//초기값
		
		    //조건식
		while(su <=100) {
			//누적
			sum += su;
			su++; //증감식
		}
		System.out.println("1부터 100까지의 합 : " + sum);
	}
}

이때 int sum = 0은 while문을 돌며 숫자들이 누적될, 합계가 될 변수에 해당하고 su = 1의 경우 증감식에 따라 1씩 증가하며 sum에 누적될 숫자에 해당한다.


Scanner로 입력 받는 구구단 프로그램을 while문으로 작성하면 다음과 같다.
> Scanner, while문을 활용해 구구단 프로그램 만들기


위에서 배운 내용을 토대로 실습을 진행하였다.

package kr.s05.operation;

public class WhileMain04 {
	public static void main(String[] args) {
		/*
		 * [실습]
		 * 입력받은 정수값부터 0까지 출력하는 프로그램을 작성하시오.
		 * (0보다 큰 수를 입력하는데 만약 0을 입력하면
		 * "0보다 큰 수를 입력하세요"라고 출력)
		 * 
		 * [입력 예시]
		 * 정수 입력: 3
		 * 
		 * [출력 예시]
		 * 3
		 * 2
		 * 1
		 * 0
		 */
		
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		System.out.print("정수 입력 : ");
		int num = input.nextInt();
		
		if(num >0) {
			while(num >=0) {
				System.out.println(num--);
			}
		}else {
			System.out.println("0보다 큰 수를 입력하세요");
		}
		input.close();
	}
}
  1. Scanner를 통해 입력 받은 정수를 int num에 저장한다.
  2. while문 역시 조건이 true일 때만 수행문을 수행하므로, if를 통해 먼저 true와 false 상황을 나누어 코드를 작성, true 수행문 안에 while을 넣어준다.
    1) if(num >0){ 0 초과면 while문으로
    2) while(num >=0) 입력받은 정수값을 0까지
    3) System.out.println(num--); 1씩 감소하며 출력한다.
    4) 만약 }else {System.out.println("0보다 큰 수를 입력하세요");} 0과 음수라면 "0보다 큰 수를 입력하세요" 문구를 출력한다.
  3. 입력을 받고나면 input.close();

--
다음은 '0 전까지 입력받은 정수로 합 구하기' 예제에 대한 코드를 2가지 방법으로 작성해 보았다.

package kr.s05.operation;

public class WhileMain05 {
	public static void main(String[] args) {
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		int a, total = 0;
		
		System.out.println("0 전까지 입력받은 정수로 합 구하기");
		
		System.out.print("누적할 정수 데이터 입력: ");
		
		while((a = input.nextInt()) != 0) {
			total += a; //누적
			System.out.print("누적할 정수 데이터 입력: ");
		}
		System.out.println("total = " + total);
		
		
		input.close();
	}
}

0 전까지 입력받은 정수들의 합을 구한다는 말은 곧,
① 0을 입력하면 while문을 통한 반복이 멈춘다는 뜻이고,
② 이 말은 false가 되는 조건이 입력받은 정수가 0이 된다는 뜻이며
③ 바꾸어 말하면 0이 아닌 정수들은 무엇을 입력하던 true라는 뜻이다.

그리고 조건문 자체에 입력값을 넣어 입력값이 변동되기 때문에 증감식이 필요하지 않다.

  1. while((a = input.nextInt()) != 0) { 입력 받은 정수(변수 a)가 0이 아니면
  2. total += a; 정수형 변수 total에 누적한다.
  3. 그 후 System.out.print("누적할 정수 데이터 입력: ");} 다시 출력하여 입력받도록 한다.
  4. 만약 0이 입력된다면 while문을 빠져나와 System.out.println("total = " + total); 누적된 데이터를 출력한다.
  5. 끝나면 input.close();
package kr.s05.operation;

public class WhileMain06 {
	public static void main(String[] args) {
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		int a, total = 0;
		System.out.println("0 전까지 입력받은 정수로 합 구하기");
		
		while(true) {
			System.out.print("누적할 정수 입력> ");
			a = input.nextInt();
			if(a == 0) {
				break;
			}
			total += a;
		}
		
		System.out.println("total = " + total);
		
		input.close();
	}
}

다음은 무한루프 형태 를 활용해 '누적할 정수 입력>'이라는 가이드를 두 번 쓰지 않고, 보다 효율적인 코드를 작성할 수 있는 방법이다.

  1. while(true) { 조건 자체가 이미 true이므로 수행문을 실행한다.
  2. while문 안의 System.out.print("누적할 정수 입력> "); 문구를 출력한다.
  3. a = input.nextInt(); 정수를 a라는 변수에 입력 받는다.
  4. if(a == 0) {break;} 만약 0을 입력한다면, 'break;'를 통해 while 반복문을 빠져나간다.
  5. 0이 아니라면 total += a; 정수형 변수 total에 입력 받은 정수를 계속 누적한다.
  6. 0을 입력해 반복문을 빠져 나오면 System.out.println("total = " + total); 누적된 데이터를 출력한다.
  7. 끝나면 input.close();


다음은 메뉴 반복을 통해 조금 더 고도화된 은행 프로그램을 만들어 보았다.
> Scanner, if문, while문을 활용한 은행 프로그램 만들기


이어 위에서 배운 내용을 바탕으로 다음과 같이 실습을 진행하였다.
> Scanner, if문, while문을 활용한 커피 주문 프로그램 만들기


2-3. do~while문

흐름: do~while문 바깥에서 변수를 할당 > 변수 초기화(임의의 값) > do 블럭 안에서 수행문을 수행한 뒤 > while문 안에서 조건 체크 > 조건에 부합할 때 증감(do 블럭 안의 수행문 반복)

조건이 맞지 않으면 수행문으로의 진입이 불가한 while문과는 달리, do while문은 선처리후비교 방식이다.

아래 예제를 통해 while문과 do~while문의 차이를 알아 보자.

package kr.s05.operation;

public class DoWhileMain01 {
	public static void main(String[] args) {
		int su = 0;
		String str = "Hello world";
		
		//선 처리, 후 비교
		do {
			System.out.println(str);
		}while(su++ < 5);
		System.out.println("==============");
		
		
		int su2 = 0;
		
		//선 비교, 후 처리
		while(su2++ < 5) {
			System.out.println(str);
		}
	}
}

출력)
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
==============
Hello world
Hello world
Hello world
Hello world
Hello world

위와 같이 do~while문을 활용하게 될 경우, do 블럭에서 str 변수가 한 번 더 호출되기 때문에 'Hello world'가 6번 출력된다.
하지만 while문의 경우 su2 변수가 0에서부터 출발해 5 전인 4까지 증가하기 때문에 'Hello world' 문구가 5번 출력된다.


조금 더 심화된 예제를 통해 do~while문의 특징을 알아 보자.
> Scanner, do~while, switch문을 활용해 성적 프로그램 구하기

profile
Done is better than perfect.

0개의 댓글