반복문 for, while, do-while
반복문은 어떤 작업이 반복적으로 수행되도록 할 때 사용된다.
for문이나 while문에 속한 문장은 조건에 따라 한 번도 수행되지 않을 수 있지만,
do-while문에 속한 문장은 최소한 한 번은 수행될 것이 보장된다.
반복문은 주어진 조건을 만족하는 동안 주어진 문장들을 반복적으로 수행하므로 조건식을 포함하며,
if문과 마찬가지로 조건식의 결과가 true이면 참이고, false이면 거짓으로 간주된다.
for문과 while문은 구조와 기능이 유사하여 어느 경우에나 서로 변환이 가능하기 때문에반복문을 작성해야할 때 for문과 while문 중 어느 쪽을 선택해도 좋으나 for문은 주로 반복횟수를 알고 있을 때 사용한다.
for문
for문은 반복 횟수를 알고 있을 때 적합하다.
for (초기화;조건식;증감식) {
//조건식이 참일 때 수행될 문장들을 적는다.
//반복하려는 문장이 단 하나일 때는 괄호{}를 생략할 수 있다.
}
for (int = 1; i <= 5; i++) { //1부터; 5까지; 1씩 증가
System.out.println("05._.nov")
}
초기화
for (int i = 1; i <= 10; i++) {...} //변수i의 값을 1로 초기화
for (int i = 1, j = 0; i <= 10; i++) {...} //int타입의 변수 i와 j를 선언하고 초기화,
//두 변수의 타입은 같아야 함
조건식
for (int i = 1; i <= 10; i++) {} //'i <= 10'이 참인 동안 블럭{}안의 문장들을 반복
증감식
for (int i = 1; i <= 10; i++) {...} //1부터 10까지 1씩 증가
for (int i = 1; i <= 10; i--) {...} //10부터 1까지 1씩 감소
for (int i = 1; i <= 10; i+=2) {...} //1부터 10까지 2씩 증가
for (int i = 1; i <= 10; i*=3) {...} //1부터 10까지 3배씩 증가
// 증감식도 쉼표','를 이용해 두 문장 이상을 하나로 연결해서 쓸 수 있다.
for (int i = 1, j = 10; i <= 10; i++, j--) {...} //i는 1부터 10까지 1씩 증가
//j는 10부터 1까지 1씩 감소
위의 세 가지 요소는 필요하지 않을 경우 생략이 가능하며, 모두 생략하는 것도 가능하다.
for (;;) {...} //초기화, 조건식, 증감식 모두 생략. 조건식은 참이 된다.
입력
class ForrEx1 {
public static void main(String [] args) {
for(int i = 1; i <= 5; i++)
System.out.println(i); //i의 값을 출력한다.
for(int i = 1; i <= 5; i++)
System.out.print(i); //println() 대신 print()를 쓰면 가로로 출력된다.
System.out.println();
}
}
출력
1
2
3
4
5
12345
중첩 for문
입력
class ForrEx2 {
public static void main(String[] args) {
for(int i = 1; i <= 5; i++) {
for(int j = 1; j <= 10; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
출력
**********
**********
**********
**********
**********
향상된 for문(enhanced for statement)
for (타입 변수명 : 배열 또는 컬렉션) {
//반복할 문장
}
위의 문장에서 타입은 배열 또는 컬렉션의 요소의 타입이어야 한다.
// 아래와 같이 배열 arr이 선언되어 있을 때,
int[] arr = {10, 20, 30, 40, 50};
//이 배열의 모든 요소를 출력하는 for문은 아래와 같다.
//일반적인 for문
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
//향상된 for문
for(int tmp : arr) {
System.out.println(tmp);
}
그러나 향상된 for문은 일반적인 for문과 달리 배열이나 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용할 수 있다는 제약이 있다.
while문
for문에 비해 while문은 구조가 간단하다. 다만 if문과 달리 while문은 조건식이 '참(true)인 동안', 즉 조건식이 거짓이 될 때 까지 블럭{} 내의 문장을 반복한다.
while (조건식) {
//조건식의 연산결과가 참(true)인 동안 반복될 문장들
}
① 조건식이 참(true)이면 블럭{}안으로 들어가고, 거짓(false)이면 while문을 벗어난다.
② 블럭{}안의 문장을 수행하고 다시 조건식으로 돌아간다.
for문과 while문 비교
1부터 10까지의 정수를 순서대로 출력
for문
//초기화, 조건식, 증감식
for(int i = 1; i <= 10; i++) {
System.out.println(i);
}
while문
int i = 1; //초기화
while(i <= 10) { //조건식
System.out.println(i);
i++; //증감식
}
초기화나 증감식이 필요하지 않은 경우라면, while문이 더 적합할 것이다.
while문의 조건식은 생략불가for문은 for(;;)와 같이 조건식을 생략할 수 있지만, while문의 조건식은 생략할 수 없다.따라서 while문의 조건식이 항상 참이 되도록 하려면 while(true) { ... 와 같이 반드시 true를 넣어야 한다.
do-while문
do-while문은 while문의 변형으로 기본적인 구조는 while문과 같으나 조건식과 블럭{}의 순서를 바꿔놓은 것이다. 그래서 while문과 반대로 블럭{}을 먼저 수행한 후에 조건식을 평가한다.
while문은 조건식의 결과에 따라 블럭{}이 한 번도 수행되지 않을 수 있지만,
do-while문은 최소한 한번은 수행될 것을 보장한다.
do {
//조건식의 연산결과가 참일 때 수행될 문장들
} while (조건식); ←끝에 ';'을 잊지 않도록 주의!
do-while문은 많이 쓰이지는 않지만, 다음의 예제처럼 반복적으로 사용자의 입력을 받아서 처리할 때 유용하다.
입력
import java.util.*;
class DowhEx1 {
public static void main(String[] args) {
int input = 0;
int answer = 0;
answer = (int)(Math.random() * 100) + 1; //1~100 사이의 임의의 수를 저장
Sanner scanner = new Scanner(System.in);
do {
System.out.print("1과 100 사이의 정수를 입력하세요.>");
String tmp = scanner.nextLine();
input = Integer.parseInt(tmp);
if(input > answer) {
System.out.println("더 작은 수로 다시 시도해보세요.");
} else if(input < answer) {
System.out.println("더 큰 수로 다시 시도해보세요.");
}
} while(input != answer);
System.out.println("정답입니다.");
}
}
출력
1과 100사이의 정수를 입력하세요.>50
더 작은 값으로 다시 시도해보세요.
1과 100사이의 정수를 입력하세요.>6
더 큰 값으로 다시 시도해보세요.
1과 100사이의 정수를 입력하세요.>9
정답입니다.
break문
break문은 자신이 포함된 가장 가까운 반복문을 벗어난다.
주로 , if문과 함께 사용되어 특정 조건을 만족하면 반복문을 벗어나도록 한다.
입력
public static void main(String[] args) {
int sum = 0;
int i = 0;
while(true) {
if(sum > 100)
break; //break문이 수행되면 line9, 10은 실행되지 않고 while문을 완전히 벗어남.
++i;
sum += i;
} //end of while
System.out.println("i=" + i);
System.out.println("sum=" + sum);
}
출력
i=14
sum=105
continue문
continu문은 반복문 내에서만 사용될 수 있으며, 반복이 진행되는 도중에 continu문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다.
for문의 경우 증감식으로 이동하며, while문과 do-while문의 경우 조건식으로 이동한다.
continu문은 반복문 전체를 벗어나지 않고 다음 반복을 계속 수행한다는 점이 break문과 다르다.
주로 if문과 함께 사용되어 특정 조건을 만족하는 경우에 continu문 이후의 문장들을 수행하지 않고 다음 반복으로 넘어가서 계속 진행하도록 한다.
또한, 전체 반복 중에 특정조건을 만족하는 경우를 제외하고자 할 때 유용하다.
다음 예제는 1과 10 사이의 숫자를 출력하되 그 중에서 3의 배수인 것은 제외하도록 한다.
입력
public static void main(String[] args) {
for(int i = 0; i <= 10; i++) {
if(i%3 == 0)
continue; //조건식이 참이 되어 continue문이 수행되면 line8로 이동
//break문과 달리 반복문을 벗어나지 않는다.
System.out.println(i);
}
}
출력
1
2
4
5
7
8
10
이름 붙은 반복문
break문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에, 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다. 이때는 중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.
입력
public static void main(String[] args) {
Loop1:
for (int i = 1; i <= 2; i++) {
System.out.println("첫 번째 for문");
for (int k = 1; k <= 10; k++) {
if(k==3) break Loop1;
System.out.println("두번째 for문");
}
}
}
출력
첫 번째 for문
두 번째 for문
두 번째 for문
참고자료 : 자바의 정석 3rd Edition, https://dkswnkk.tistory.com/428
'Back-end > JAVA' 카테고리의 다른 글
JAVA 기본 문법 정리 - 4. 조건문과 반복문 ① (0) | 2022.11.29 |
---|---|
JAVA 기본 문법 정리 - 3. 연산자(Operator) ② (0) | 2022.11.22 |
JAVA 기본 문법 정리 - 3. 연산자(Operator) ① (0) | 2022.11.12 |
JAVA 기본 문법 정리 - 2. 변수(Variable) ③ (0) | 2022.11.12 |
JAVA 기본 문법 정리 - 2. 변수(Variable) ② (0) | 2022.11.12 |
댓글