반복문

  • 어떤 작업이 반복적으로 수행되도록 할 때 사용

  • for문, while문, do-while(while 변형문)문이 있음

  • 주어진 조건을 만족하는 동안 주어진 문장을 반복적으로 수행

  • 조건식 포함

  • true ; 반복

  • false ; 반복하지 않음

  • do-while문은 1번 이상 반복

  • for/while은 0번 이상 반복

  • for/while은 구조와 기능이 유사하여 어느 쪽을 선택해도 좋음

  • for는 보통 반복횟수를 알고있을 때 사용



for문 : 정의

  • 반복 횟수를 알고 있을 때 적합

  • 구조가 조금 복잡할 수 있지만 직관적이라 이해하기 쉬움

  • for(초기화;조건식;증감식) 형태

  • 중첩 가능



for문 : 형태(초기화, 조건식, 증감식)

  • 초기화

    • 반복문에 사용될 변수를 초기화, 처음 한 번만 수행

    • 둘 이상의 변수가 필요할 경우 콤마’,’로 구분하여 변수를 여러개 초기화 할 수 있음(단, 타입은 같아야 함)
      ex) int i = 1, j = 2;

    • for문에 사용되는 변수가 적은 것이 더 효율적이고 간단하므로 변수들의 관계를 잘 파악하여 불필요한 변수의 사용을 줄이는 것이 좋음

  • 조건식

    • true/false로 결과를 반환하는 식

    • 잘못 작성하면 무한 루프에 빠질 수 있기 때문에 유의하여 작성

  • 증감식

    • 반복문을 제어하는 변수의 값을 증가 또는 감소

    • ++, --, +=, -= 등 사용

    • 초기화와 마찬가지로 둘 이상 콤마’,’로 연결해서 사용 가능

  • 초기화, 조건식, 증감식 모두 생략이 가능함

    • 필요하지 않으면 생략을 할 수 있으며, 모두 생략도 가능

    • 단, 모두 생략한 경우 조건식은 참(true)으로 고정



Enhanced for Statement (향상된 for문)

  • JDK 1.5부터 제공

  • 배열과 컬렉션에 저장된 요소에 접근할 때 편한 방법

  • 초기화 변수 타입은 배열 또는 컬렉션 요소의 타입이어야 함

  • 배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀서 변수에 저장됨

  • 반복문에서는 이 변수를 이용한 문장을 수행

  • 일반적인 for문보다 간결함

  • 일반적인 for문과 달리 배열이나 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용할 수 있다는 제약

for (타입 변수명 : 배열 또는 컬렉션) {
    // 반복할 문장
}



for문 예제

  • 예제 1. 기본적인 for문

      1. 초기화 → 2. 조건식 → 3-1 (참) 문장 수행 → 4. 증감식 → 2. 조건식 → (반복) → 3-2 (거짓) Pass
for (초기화; 조건식; 증감식) {
    // 조건식이 참(true)일 때 수행될 문장들을 적음
}
  • 예제 2. 중첩 for문
for (초기화A; 조건식A; 증감식A) {
    // 조건식A가 참(true)일 때 수행될 문장들을 적음
	for (초기화B; 조건식B; 증감식B) {
        // 조건식A가 참(true)이고
    	// 조건식B가 참(true)일 때 수행될 문장들을 적음
    }
}
  • 예제 3. 블럭 내 문장이 1개라면 괄호 생략 가능. 단, 가독성 주의
// 1
for (초기화A; 조건식A; 증감식A) {
	for (초기화B; 조건식B; 증감식B) {
        // 조건식A가 참(true)이고 조건식B가 참(true)일 때 수행될 문장들을 적음;
    }
}
// 2. 중첩 for문 안의 문장이 1개기때문에 괄호 생략
for (초기화A; 조건식A; 증감식A) {
	for (초기화B; 조건식B; 증감식B)
        // 조건식A가 참(true)이고 조건식B가 참(true)일 때 수행될 문장들을 적음;
}
// 3. 바깥 for문에게는 중첩 for문 전체가 하나의 문장(;)이므로 바깥쪽도 생략 가능
for (초기화A; 조건식A; 증감식A)
	for (초기화B; 조건식B; 증감식B)
        // 조건식A가 참(true)이고 조건식B가 참(true)일 때 수행될 문장들을 적음;
  • 예제 4. (주의) for문 뒤에 ;를 붙이면 for문은 {} (빈 블럭)을 인식하고, 그 아래 블럭은 블럭으로 인식되서 그냥 한 번 수행

    • 1 == 2 == 3
// 1
for (초기화; 조건식; 증감식); {
    System.out.println("wow");
}
// 2
for (초기화; 조건식; 증감식) {
}
{
    System.out.println("wow");
}
// 3
for (초기화; 조건식; 증감식) {
}
System.out.println("wow");



while문

  • for문에 비해 구조가 간단

    • 조건식이 ‘참(true)’인 동안, 블럭 { } 내의 문장을 반복

    • for과 다르게 조건식을 생략할 수는 없음

  • 항상 참이 되려면 true를 넣어줄 것

  • 사용할 변수의 초기화는 while문 인입 전 해줘야함

while (조건식) { 
    // 조건식의 연산결과가 참(true)인 동안, 반복될 문장
}

/* 사용 예 */
int i = 0; // 초기화 - while 위해서

while (i < = 10) { // 조건식
    System.out.println(i); // 실행할 문장
    i++; // 증감식
}

/* 사용 예 - 조건식에 증감식을 넣을 수 있음
 * 단, 전위형 후위형 구분해서 사용할 것
 * 전위형 : 값을 증감한 후 계산
 * 후위형 : 값을 계산한 후 증감
 */
while (++i < 10);
while (i-- < 10);



do-while문

  • 그리 많이 쓰지 않지만, 반복적으로 사용자의 입력을 받아서 처리할 때 유용

  • while문의 변형으로, 기본적인 구조는 while과 같고 조건식과 블럭{ }의 순서를 바꾸어 둔 것

    • 최소한 한 번은 수행됨
do {
    // 조건식의 연산결과가 참일 때 수행될 결과를 적음, 시작할땐 무조건 참으로 시작
} while (조건식); // 끝에 ; 꼭!! 붙여야 함



break문

  • 반복문에서도 switch문을 사용할 수 있음

  • 자신이 포함된 가장 가까운 반복문(블럭)을 벗어남

  • 무한 반복문에서는 조건문과 break문이 항상 같이 사용

    • 그렇지 않으면 무한 루프에 빠지기 때문에 프로그램이 종료되지 않음
while(조건식A) {
    if(조건식B) {
        break; // 요게 (가장 가까운 반복문인)조건식 A를 탈출시킴
    }
    i++;
    a += 1;
}



continue문

  • 반복문 내에서만 사용 가능

  • 반복 중 Continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어감

    • for : 증감식으로 이동

    • while / do-while : 조건식으로 이동
      주의) 증감식이 continue 아래에 있다면 무한 루프에 빠지게 됨

  • break와 차이점

    • break : 조건문 탈출

    • continue : 조건문의 현재 조건을 끝내고 다음 조건을 확인하러 감

  • 전체 반복 중 특정 조건을 만족하는 경우를 제외하고자 할 때 유용함

while(조건식A) {
    if(조건식B) {
        continue; // 요게 아래를 진행하지 않고 다음 조건으로 진행시킴
    }
    i++;
    a += 1;
}



반복문에 이름 붙이기(with break & continue)

  • break와 continue는 가장 근접한 반복문에 대해서 적용됨

  • 반복문에 이름을 붙일 경우 break와 continue에 이름을 명시해주면, 해당 반복문에 대해 적용 가능

  • 이름 붙이는 법 : for문이나 while문 앞에 이름:를 붙임

    • 방법 1. 이름: 조건문

    • 방법 2. 이름:
      조건문

// for문에 Loop1 이름 붙여주기
Loop1 : for(초기화A;조건식A;증감식A) {
    for(초기화B;조건식B;증감식B) {
        if(조건식1) {
            break; // 조건식B를 쓰는 for문 탈출
        } else if(조건식2) {
            break Loop1; // 조건식A를 쓰는 for문 탈출
        } else if(조건식3) {
            continue; // 조건식B의 현재 조건을 마무리하고 증감식B로 이동
        } else {
            continue Loop1; // 조건식A의 현재 조건을 마무리하고 증감식A로 이동
        }
        //수행문장
    }
}

// while문에 outer 이름 붙여주기
outer:
while(true) {
}