제어문 - 반복문(loop문)
while, do~while, for문이 있고, 서로서로 바꾸면서 다룰 줄 알아야 한다.
반복구문 세 가지 각각의 특징이 있고, 실무에서는 주로 for문을 쓴다.
while
반복의 횟수가 많은 경우. whlie의 경우, 조건에 따라 0번 실행하게 될 수도 있다.
do~while
일단 한 번은 실행해야하는 경우. 최소 한 번 실행하고 while의 조건 검사를 해서 반복할지를 정한다.
for
반복의 횟수가 정해진 경우에 사용한다.
* while, do~whlie의 경우에는 (루프)변수 선언, 조건식, 증감식이 루프 영역 이곳 저곳 흩어져 있는 경우가 많지만, for문은 한 곳에 있어서 보기 좋다.
* 반복문 안의 조건문에서 자주 보이는 키워드 continue, break
- continue : (뒷부분은 무시하고 반복문 처음으로 돌아가서) 계속해라.
- break : (진행하던 반복문을) 멈춰라. 그리고 (break를 감싸는 가장 가까운)반복문을 빠져나가라.
* 무한루프 : 반복문의 조건문으로 항상 참이도록 하여 무한히 반복하는 구문을 만든다. 반복문 내에 if와 같은 조건문을 넣어 필요한 조건을 충족했을 때 무한루프에서 빠져나가도록 사용한다.
- while(true)
- for ( ; ; )
* break 레이블
- break는 기본적으로 자신을 감싸는 반복문 '하나' 밖에 벗어나지 못한다.
- 둘 이상으로 중첩된 반복문을 벗어나려면 break 레이블을 사용하면 된다..!
- 하지만 다른 언어의 goto 문과 같이 개연성을 고려하지 않는 방법이므로 사용하지 않기를 권장한다.
- 다른 언어에서 지원하는 'goto'문은 논리의 개연성을 무시한 채 소스코드를 강제적으로 이동시킬 때 사용된다. 자바에서는 논리의 개연성을 무시한 goto 키워드를 지원하지 않은 것이 특징이였다. 하지만 버전을 거듭하면서 등장한 break 레이블은 자바에서 (거의) 유일하게 논리를 무시하는 키워드이다.
int cnt=0;
OuterLoop:
while(true)
{
cnt++;
while(cnt<10000)
{
if(cnt>=100)
break OuterLoop; // break 레이블. 3행의 OuterLoop로 이동한다.
}
}
* 반복문은 리소스 소모가 크다. 반복문을 덜 수행하는 게 리소스 소모가 적고 효율성이 높다.
while
/*=========================================
■■■ 실행 흐름의 컨트롤 (제어문) ■■■
- 반복문(while) 실습
=========================================*/
/*
○ 반복문의 개요
주어진 조건이 『참』인 경우
일정한 영역의 문장들을 반복 수행하다가
조건식이 거짓이 되는 순간이 오면,
반복 수행을 중단하는 문장이다.
이러한 반복문에는 『while』, 『do~while』, 『for』문 등이 있으며
반복문의 제어를 위해 『break』, 『continue』문을
사용하는 경우가 있다.
○ while 문
조건식을 먼저 비교하여
조건식의 처리 결과가 참인 경우, 특정 영역을 반복 수행하는 문장으로
반복 횟수가 정해져 있지 않은 경우나
반복 횟수가 비교적 많은 경우 주로 사용한다.
while 문은 조건이 맞지 않은 경우
반복은 커녕 단 한 번도 실행되지 않을 수 있다.
○ while 문의 형식 및 구조
while(조건식)
{
실행문;
}
*/
public class Test043
{
public static void main(String[] args)
{
/*
int n=0;
while (n<=10)
{
System.out.println("n = " + n);
n++;
}
*/
/*
int n=0;
while (n<=10)
{
n++;
System.out.println("n = " + n);
}
*/
/*
int n=1;
while (n<10)
{
n++;
System.out.println("n = " + n);
}
*/
/*
int n=0;
while (n++<=10)
{
System.out.println("n = " + ++n);
}
*/
// 1 부터 100 까지의 합을 계산하여
// 결과를 출력하는 프로그램을 작성한다.
// 단, while 반복문을 사용한다.
// 실행 예)
// 1 부터 100 까지의 합 : 5050
// 계속하려면 아무 키나 누르세요...
// ※ 문제 인식 및 분석
// 1. 출력 구문이 반복문의 영역 밖에 위치해야 한다.
// 2. 1부터 1씩 증가할 변수와 누적합을 담을 변수
// 이렇게 두 개의 변수가 필요하다.
// 1부터 차례로 담아 1씩 증가하는 변수 선언 및 초기화
int n = 0;
// 누적합을 계산하여 담아낼 변수 선언 및 초기화
int sum = 0;
// 연산 및 처리(반복문 구성)
/* 내가 푼 것
while(++n<=100)
sum += n;
*/
while (n<=100)
{
// sum 을 n 만큼 증가시켜라~!!!
sum += n;
// n 이 1씩 증가해 나가는 연산 필요~!!!
n++;
}
// 결과 출력(반복문 영역 밖에 위치)
//-- 실행 예에서 최종 결과값이 한 번 출력되기 때문...
// 즉, 연산은 반복하되 출력은 한 번만~!!!
System.out.println("1 부터 100 까지의 합 : " + sum);
}
}
do~while
/*=========================================
■■■ 실행 흐름의 컨트롤 (제어문) ■■■
- 반복문(do~while) 실습
=========================================*/
/*
○ do~while 개요
『do~while』문은 『while』문과 마찬가지로
특정한 영역을 반복 수행하는 반복문이다.
『while』문과 다른 점은
조건식에 대한 검사를 반복문을 수행한 이후에 한다는 것이다.
이와 같은 성격으로 인해 반드시 한 번은 수행하게 되는 특징을 갖는다.
○ do~while 형식 및 구조
do
{
실행문;
}
while(조건식);
*/
public class Test054
{
public static void main(String[] args)
{
/*
int n=1;
do
{
System.out.println("n = " + n);
n++;
}
while (n<=10);
*/
/*
int n=1;
do
{
n++;
System.out.println("n = " + n);
}
while (n<=10);
*/
/*
int n=0;
do
{
n++;
System.out.println("n = " + n);
}
while (n<10);
*/
/*
int n=0;
do
{
System.out.println("n = " + ++n);
}
while (n<=10);
*/
/*
int n=100;
do
{
n++;
System.out.println("n = " + n);
}
while (n<10);
*/
// do ~ while 문의 활용 모델
// 예를 들어... 사용자로부터 특정 범위의 수가 입력될 때 까지
// 입력받는 행위를 반복해서 수행해야 하는 상황이라 가정한다.
java.util.Scanner sc = new java.util.Scanner(System.in);
int num;
do
{
System.out.print("100 이상의 정수를 입력하세요 : ");
num = sc.nextInt();
}
while (num<100);
System.out.println(num + " → 100 이상의 정수를 입력 완료~!!!");
}
}
for
/*=========================================
■■■ 실행 흐름의 컨트롤 (제어문) ■■■
- 반복문(for) 실습
=========================================*/
/*
○ for 반복문 개요
『for』문은 정해진 횟수만큼 반복해야 하는 경우
유용하게 사용되어지는 반복문으로
『while』문과 마찬가지로 반복 실행해야 하는 구문이
조건에 만족하지 않을 경우 한 번도 수행하지 않을 수 있으며
루프 변수의 초기값, 조건식, 증감식 등을 한 지점에서 확인할 수 있기 때문에
가독성이 높은 반복문에 해당한다.
○ for 문의 형식 및 구조
for (수식1; 수식2; 수식3)
{
실행문;
}
수식1은 루프 변수의 초기화를 위해 사용되며,
최초 단 한 번만 실행된다.
수식2는 조건식을 나타내는 것으로 이 조건식(수식2)이 만족하면
루프를 반복해서 수행하게 된다.
『for』문의 진행 순서는 수식2가 참이면 반복문을 수행하고
수식3을 실행한 후 수식2의 조건식을 다시 검사하는 구조로 진행된다.
따라서 처음에 조건식이 거짓일 경우
『for』루프를 한 번도 수행하지 않게 되는 것이다.
수식3은 루프 변수의 재초기화를 위해 사용되어지며,
반복문의 조건식을 무너뜨리게 되는 증감식으로 처리하는 것이 일반적이다.
컴마(『,』)를 이용하여 여러 문장을 동시에 수행할 수도 있다.
*/
public class Test056
{
public static void main(String[] args)
{
int n=1, m;
while (n<=10)
{
System.out.println("n : " + n);
n++;
}
System.out.println();
for(m=1; m<=10; m++)
System.out.println("m : " + m);
}
}
// 실행 결과
/*
n : 1
n : 2
n : 3
n : 4
n : 5
n : 6
n : 7
n : 8
n : 9
n : 10
m : 1
m : 2
m : 3
m : 4
m : 5
m : 6
m : 7
m : 8
m : 9
m : 10
계속하려면 아무 키나 누르십시오 . . .
*/
break
/*=========================================
■■■ 실행 흐름의 컨트롤 (제어문) ■■■
- break
=========================================*/
// 다음과 같은 처리가 이루어지는 프로그램을 구현한다.
// 단, 입력받는 정수는 1~100 범위 안에서만
// 가능하도록 처리한다.
// 실행 예)
// 임의의 정수 입력 : -10
// 임의의 정수 입력 : 0
// 임의의 정수 입력 : 2020
// 임의의 정수 입력 : 10
// >> 1 ~ 10 까지의 합 : 55
// 계속하시겠습니까(Y/N)? : y
// 임의의 정수 입력 : 100
// >> 1 ~ 100 까지의 합 : 5050
// 계속하시겠습니까(Y/N)? : N
// 계속하려면 아무 키나 누르세요... → 프로그램 종료
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test066
{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n, s, i;
//-- n : 외부로부터의 입력값을 담아둘 변수
// s : 누적합 연산 결과를 담아둘 변수
// i : 1부터 1씩 증가
char ch;
while (true)
{
do
{
System.out.print("\n임의의 정수 입력 : ");
n = Integer.parseInt(br.readLine());
}
while (n<1 || n>100);
s = 0; // 누적합을 담아낼 변수 초기화 → 위치 check~!!!
for (i=1; i<=n; i++)
s += i;
System.out.printf(">> 1 ~ %d 까지의 합 : %d\n", n, s);
System.out.print("계속하시겠습니까(Y/N)? : ");
ch = (char)System.in.read();
// 그만할래~!!! 의사표현
//ch=='N' || ch=='n'
if (ch!='Y' && ch!='y')
{
// 반복문(while)을 빠져나갈 수 있는 코드 작성 필요
//-- 위와 같은 의사표현을 했다면
// 그동안 수행했던 반복문을 멈추고 빠져나가야 한다.
break;
//-- 멈춘다. ( + 그리고 빠져나간다.) check~!!!
}
// 엔터값(\r\n) 처리
System.in.skip(2);
}//while_end
}//main()_end
}//class_end
'자바 풀스택 과정 수업 정리 > 자바' 카테고리의 다른 글
자바 9 (2020.08.13) : 객체지향 프로그래밍에 대해(기초) (0) | 2020.08.18 |
---|---|
자바 8 (2020.08.12) : 메소드, 변수의 스코프, 지역변수, 전역변수, 재귀함수 (0) | 2020.08.18 |
자바 6 (2020.08.10) : if ~ else, switch, break (0) | 2020.08.13 |
자바 5 (2020.08.07) : 조건연산자, if ~ else if ~ else (0) | 2020.08.11 |
자바 4 (2020.08.06) : IO에 관해(BufferedReader, Scanner) (0) | 2020.08.06 |
최근댓글