본문 바로가기

프로그래밍언어/JAVA

[JAVA] 반복문 - for, while, do-while

반응형

반복문은 어떤 작업이 반복적으로 수행되도록 할 때 사용되며 반복문의 종류로는 for문과 while, 그리고while문의 변형인 do-while문이 있다반복문은 주어진 문장을 수행하기 위한 조건이 되는 조건식을 포함하며, if문과 마찬가지로 조건식이 true인 경우에 주어진 문장을 수행하고 false이면 수행하지 않는다.

 

 

1. for

 

for문은 반복 횟수를 알고 있을 때 적합하다. for문의 구조는 다음과 같다.

 

- for문의 구조와 수행 순서

 

for(초기화; 조건식; 증감식) {
	// 조건식이 참일 때 수행될 문장들
}

// 1. 초기화 수행
// 2. 조건식 수행
// 2-1. 조건식이 참인 경우 -> 블럭 수행
// 2-2. 조건식이 거짓인 경우 -> 반복문 탈출
// 3. 조건식 내 블럭의 문장 수행
// 4. 증감식 수행
// 2-4. 반복

 

for문이 시작되면 가장 먼저 '초기화'가 수행되고 그 이후부터는 '조건식'이 참인 경우 동안 for문을 반복한다. '조건식'이 참인 경우에는 블럭 안의 문장들을 수행하고 그 다음 '증감식'을 수행한다. 그 다음 다시 '조건식'을 확인하는데 '조건식'의 결과가 참인 경우는 다시 블럭의 문장들을 수행하고 거짓인 경우에는 반복문을 탈출한다.

 

- 초기화

 

반복문에 사용될 변수를 초기화하는 부분이며 처음에 한번만 수행된다. 보통 변수 하나로 for문을 제어하지만 둘 이상의 변수가 필요한 경우에는 콤마를 사용하여 구분할 수 있다.

 

for(int i = 1; i < 10; i++) { … } // 변수 i를 선언하고 초기화
for(int i = 1, j = 0; i <= 10; i++) { ... } // int타입의 변수 i와 j를 선언하고 초기화

 

- 조건식

 

조건식이 참인 경우에 계속해서 반복하고 거짓인 경우에 반복문을 탈출한다. 조건식을 잘못 작성하면 블럭의 문장이 한번도 수행되지 않거나 무한 반복에 빠질 수 있기 때문에 주의해야 한다.

 

- 증감식

 

반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식이다. 주로 반복문을 제어하는 변수에 '++' 또는 '--'을 사용하여 값을 변화시켜 조건식이 거짓이 되어 for문을 탈출하도록 하는데 사용된다.

두개 이상의 변수 값을 증감하는 경우에 초기화 때와 같이 콤마를 사용할 수 있다.

 

for(int i = 0; i < 10; i++) { ... }
for(int i = 10; 0 < i; i--) { ... }
for(int i = 0; i < 10; i+=2) { ... }
for(int i = 0; i < 10; i*=3) { ... }
for(int i = 0; i < 10; i++, j--) { ... }

 

※ 초기화, 조건식, 증감식은 필요하지 않은 경우에 생략 가능하며, 모두 생략하는 것도 가능하다.

 

for( ; ; ) { ... } // 초기화, 조건식, 증감식 모두 생략. 조건식은 참으로 간주되어 무한 반복도니다.

 

- 중첩 for문

 

for문의 내부에 또다른 for문을 위치시켜서 수행하는 것도 가능하다. 중첩 for문의 가장 대표적인 예제 중의 하나가 바로 '별찍기' 이다.

 

라인이 하나씩 늘어갈 때마다 각 라인의 별이 하나씩 많아지는 삼각형 형태로 별을 찍으려면 어떻게 해야할까.

 

for(int i = 0; i < 5; i++) {
  for(int j = 0; j <= i; j++) {
	  System.out.print("*");
  }
  System.out.println();
}

'''
*
**
***
****
*****
'''

 

위의 예제는 for문 안에 for문을 위치시켜서 5라인에 걸쳐 별찍기를 수행하는 예제이다. 바깥의 for문은 총 5번을 반복하고 안쪽의 for문은 각 반복에서 i번 만큼 반복을 하게 된다. 안쪽 for문은 매 반복에서 i개의 별을 찍고 반복이 종료되면 println()을 통해서 줄바꿈을 수행한다.

 

이와같이 for문은 중첩해서 사용할 수 있는데, 안쪽의 for문의 경우 블럭안에 수행하는 문장이 하나밖에 없다. 이와같은 경우에 for문은 if문과 같이 괄호를 생략할 수 있다.

 

- 향상된 for문

 

JDK1.5부터 배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법으로 처리할 수 있도록 for문에 새로운 문법이 추가되었다.

 

for({타입} {변수명} : {배열 또는 컬렉션}) {
	// ...
}

 

위의 문장에서 타입은 배열 또는 컬렉션에 포함되어 있는 요소의 타입이어야 한다. 이 방식으로 for문을 사용하게 되면 배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀서 for문에서 선언한 변수에 저장된다.

 

int[] arr = {1, 2, 3};
for(int a : arr) {
	System.out.println(a);
}

'''
1
2
3
'''

 

위의 예제의 경우 배열 arr의 요소들이 순서대로 1, 2, 3 반복되어 출력이 된다.

이와같은 방식의 for문을 for-each문이라고 한다.

 

 

2. while문

 

while문은 for문과 달리 조건식과 블럭으로만 이루어져 있다. 조건식이 참인 동안 블럭 내의 문장을 수행한다.

 

while(조건식) {
	// ...
}

 

while문은 조건식을 평가하여 조건식이 거짓이면 while문을 탈출하고 참인 경우 블럭 내 문장을 수행하고 다시 조건식으로 돌아가는 과정을 반복한다. 조건식이 거짓일 될 때까지 이 과정을 반복한다.

 

int i = 0;

while(i < 5) {
	System.out.println(i);
	i++;
}

'''
0
1
2
3
4
'''

 

- while문의 조건식

 

while문의 조건식을 for문과 달리 생략이 불가하다. 조건식을 생략하는 경우에는 에러가 발생한다.

조건식에 0이 아닌 숫자나 true를 넣으면 조건식이 참이 되어서 while문 블럭을 무한 반복하게 된다. 무한 반복 시에는 블럭 내부에 while문을 탈출하는 문장을 넣어서 반복문을 탈출하도록 해야한다.

 

 

3. do-while문

 

do-while문은 while문의 변형으로 기본 구조는 같으나 조건식과 블럭의 순서를 바꿔놓은 것이다. 그래서 while문과 반대로 블럭을 먼저 수행한 후에 조건식을 평가한다. 그렇기 때문에 while문과 달리 do-while문은 최소 한번은 블럭의 내용을 수행한다.

 

do {
	// ...
} while(조건식); // 끝에 ';'을 붙여야한다.

 

 

4. break문

 

break문은 자신이 포함된 가장 가까운 반복문을 벗어난다. 주로 if문과 같이 사용되어서 특정 조건을 만족하면 반복문을 벗어나도록 한다.

 

int i = 0;
while(true) {
  System.out.println(i);
  i++;

  if(i == 5) break; // i가 10이 되면 반복문을 탈출한다.
}

'''
0
1
2
3
4
'''

 

 

5. continue문

 

continue문은 반복문 내에서만 사용할 수 있는데, 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어가게 된다. for문의 경우는 증감식으로, while문이나 do-while문의 경우 조건식으로 이동하게 된다.

 

for(int i = 0; i < 10; i++) {
  if(i % 2 == 0) continue; // i를 2로 나눈 나머지가 0인 경우 아래의 출력문을 무시하고 다음 반복으로 넘어간다.
  System.out.println(i);
}

'''
1
3
5
7
9
'''

 

위의 예제와 같이 반복문 내에서 예외사항을 처리할 때 주로 사용된다.

 

 

6. 이름이 붙은 반복문

 

break문은 근접한 단 하나의 반복문만 탈출할 수 있기에, 여러개의 반복문이 중첩되어 있는 경우에는 하나의 break만으로는 탈출할 수 없다. 이때 중첩 반복문에 이름을 붙이고 이를 사용하여 break나 continue에 적용하여 중첩 반복문에서 탈출하거나 건너뛸 수 있다.

 

// 바깥 for문에 Loop1이라는 이름을 붙여주었다.
Loop1: for(int i = 0; i < 10; i++) {
  for(int j = 0; j < i; j++) {
    if(j == 5) {
      break; // 1
      break Loop1; // 2
      continue; // 3
      continue Loop1; // 4
    }
    System.out.println(i + " " + j);
    // 3: continue문을 만나는 경우 해당 반복문의 마지막으로 이동하여 다음 반복을 수행한다.
  }
  // 1: break문을 만나는 경우 가장 근접한 for문을 탈출한다.
  System.out.println();
  // 4: continue Loop1은 Loop1 반복문의 마지막으로 이동한다.
}
// 2: break Loop1은 Loop1의 이름이 붙여진 반복문에서 탈출하도록 한다.
반응형

'프로그래밍언어 > JAVA' 카테고리의 다른 글

[JAVA] String 배열  (0) 2021.08.24
[JAVA] 배열 (Array)  (0) 2021.08.24
[JAVA] 조건문 - if, switch  (0) 2021.08.21
[JAVA] 연산자 - 논리 연산자  (0) 2021.08.13
[JAVA] 연산자 - 비교 연산자  (0) 2021.08.12