특정 코드가 반복되서 사용되어야 할 때 사용됩니다.
반복문의 종류
1. for
2. while
3. do-while
보통 반복 횟수를 사용자가 지정해줄 때 사용
예를 들어 hello world 라는 문구를 5번 출력하기 위한 코드를 작성해보면
public static void main(String[] args){
System.out.println("hello world");
System.out.println("hello world");
System.out.println("hello world");
System.out.println("hello world");
System.out.println("hello world");
}
위 코드처럼 작성됩니다. 같은 코드가 5번 반복되기 때문에 우리는 반복문을 사용하면 보다 편리하게 작성할 수 있습니다.
public static void main(String[] args){
for (int i=1; i<=5; i++){
System.out.println("hello world");
}
}
풀이하자면
첫번째 인자(초기화) int i=1;
은 코드가 실행할 때 딱 한번 선언하고 실행하는 코드입니다.
두번째 인자(조건식) i<=5;
은 for문의 {}블럭이 끝까지 다 실행 후 두번째 인자안의 조건식을 실행하여 true
값이면 {}블럭 코드를 실행, false
이면 반복을 종료한다는 뜻입니다.
세번째 인자(증감식) i++;
은 for문의 {}블럭이 끝까지 다 실행 후 바로 실행되는 코드로 두번째 인자의 조건식이 실행되기 전에 실행됩니다.
선언된 i 변수는 {} 안에서만 사용할 수 있습니다.
public static void main(String[] args){
for (int i=1; i<=5; i++){
System.out.println(i);
}
// System.out.println(i); -- 에러
}
초기화, 조건식, 증감식은 생략이 가능합니다. 이 때는 무한 반복문이 됩니다.
public static void main(String[] args){
for (;;){
System.out.println("hello world");
}// 무한 반복해서 hello world 출력
}
이 때는 조건식(if)과 break문을 {}블럭안에 넣어 반복을 빠져 나올 수 있게 해주어야 합니다.
public static void main(String[] args){
int i = 0;
for (;;){
if (i > 5){
break;
}
System.out.println("hello world");
i++;
}
}
이렇게 작성하고 싶을 때는 for문보다 while문이 더 적합합니다.
조건이 만족할 때까지 반복하고 싶을 때 사용
보통 반복의 횟수가 정해지지 않고 조건에 따라 프로그램의 순서를 제어하고 싶을 때 사용됩니다.
public static void main(String[] args){
int i = 0;
while (i <= 5){ // i 가 5보다 크면 반복문 탈출!
System.out.println("hello world");
i++;
}
}
public static void main(String[] args){
int i = 0;
while (true){
if (i > 5){ // i가 5보다 크면 반복문 탈출!
break;
}
System.out.println("hello world");
i++;
}
}
이 코드는 위 for문과 동일한 결과를 출력합니다.
while의 인자에는 조건식만 들어갑니다.
이 때 주의할 점은 while문을 사용할 때는 꼭 반복을 빠져나오게 하는 코드(break)나 조건식이 false가 되는 코드를 {}안에 작성해주어야 합니다.
break: 해당 블럭의 반복문 탈출!
continue: for문일 경우 증감식으로 이동하고, while문일 경우 조건식으로 이동
public static void main(String[] args){
int i = 0;
while (true){
if (i > 5){ // i가 5보다 크면 반복문 탈출!
break;
}else if (i == 2){ // i가 2일 땐 while의 true 조건식으로 이동
continue;
}
System.out.println(i);
i++;
}
}
>> 0
>> 1
>> 3
>> 4
>> 5
위 코드처럼 break문은 더이상 반복을 하고 싶지 않을 때 사용하고 continue는 다음 코드를 실행하지 않고 다시 조건문의 처음 실행과정을 반복하고 싶을 때 사용합니다.
반복문은 2중으로 사용이 가능합니다.
3중, 4중도 가능하지만 프로그램의 실행 속도에 영향을 미칠 수 있기 때문에 가급적이면 피하는게 좋습니다.
대표적인 예시로 구구단이 있습니다.
public static void main(String[] args){
for(int i=1; i<=9; i++){
for(int j=1; j<=9; j++){
System.out.printf("%d * %d = %d%n", i, j, i*j);
}
}
}
실행 순서를 보면
1. i가 1일 때 j가 1~9까지 반복 실행되고 바깥 for문의 증감식i++
이 실행됩니다.
2. i는 2가 되고 다시 j가 1~9까지 반복 실행되고 바깥 for문의 증감식이 실행됩니다.
3. 이를 반복하면 바깥쪽 for문이 9번 반복할 때 안쪽 for문은 81번 반복되는 것을 알 수 있습니다.
시간 복잡도
알고리즘에서 보통 시간 복잡도에 신경을 쓰게 되는데 특히 for, while 문과 같은 반복문의 사용을 줄이려고 노력합니다.
반복문의 시간 복잡도: O(N)
예를 들어 100,000번의 for 반복문이 있다고 했을 때 이 for문의 시간 복잡도는 100000번을 하게 됩니다.
만약 똑같은 횟수의 for문이 2중으로 작성되었다면
100000 * 100000 = 10000000000 으로 총 10억번입니다.
이는 프로그램에 무리가 갈 수 있기 때문에 2중 반복문으로 작성하는 것을 되도록 피하려고 노력해야합니다.
반복문에는 변수로 명명을 하는 것처럼 이름을 붙일 수 있습니다.
이름을 붙이는 이유는 2중 반복문 처럼 반복문이 여러번 사용했을 때 break와 continue문을 햇갈리지 않고 사용하기 위해서입니다.
public static void main(String[] args){
outer:
for(int i=1; i<=9; i++){
inner:
for(int j=1; j<=9; j++){
if (i == 5){
break outer;
}else if (j == 5){
break inner;
}
System.out.printf("%d * %d = %d%n", i, j, i*j);
}
}
}
// 4*4까지 반복하는 구구단
바깥쪽 for문은 outer, 안쪽 for문은 inner라고 명명했습니다.
만약에 안쪽 for문에서 특정한 조건이 있을 때 바깥쪽 for문까지 반복을 벗어날려면 어떻게 해야할까요?
위 처럼 break문 뒤에 탈출하고 싶은 반복문에 이름을 작성해주면 됩니다.
break inner;
는 그냥 break
로 작성해도 좋습니다.
배열의 값들을 순회할 때 for문을 활용한 2가지 방법이 있습니다.
public static void main(String[] args) {
int[] arr2 = {1,2,3,4,5}; // 배열의 값들을 직접 설정
for (int i=0; i < arr2.length; i++){
System.out.println("i = " + i);
}
for (int i : arr2){
System.out.println("i = " + i);
}
}