mir.pe (일반/어두운 화면)
최근 수정 시각 : 2025-01-01 22:49:33

반복문


프로그래밍 언어 문법
{{{#!wiki style="margin: -16px -11px; word-break: keep-all" <colbgcolor=#0095c7><colcolor=#fff,#000> 언어 문법 C( 포인터 · 구조체 · size_t) · C++( 자료형 · 클래스 · 이름공간 · 상수 표현식 · 특성) · C# · Java · Python( 함수 · 모듈) · Kotlin · MATLAB · SQL · PHP · JavaScript · Haskell( 모나드)
마크업 문법 HTML · CSS
개념과 용어 함수( 인라인 함수 · 고차 함수 · 람다식) · 리터럴 · 상속 · 예외 · 조건문 · 반복문 · 참조에 의한 호출 · eval · 네임스페이스
기타 #! · == · === · deprecated · NaN · null · undefined · 배커스-나우르 표기법
프로그래밍 언어 예제 · 목록 · 분류 }}}

1. 개요2. 구조
2.1. While
2.1.1. Do-While
2.2. For
2.2.1. 순회용 For
2.3. Break, Continue
3. 다중 반복문 탈출4. 기타5. 관련 문서

1. 개요

Loop

프로그래밍 언어에서 특정 부분의 코드를 반복적으로 실행하는 문법이다.

2. 구조

여러 프로그래밍 언어들에서 반복문은 주로 For와 While을 사용하며, 반복문 도중에 종료하거나 반복을 재개하려는 경우 Break와 Continue를 사용한다.

2.1. While

조건이 맞을 경우 실행한 뒤 다시 조건을 검사해 맞을 경우 실행하는 것을 반복하는 구문.

일반적으로 아래와 같은 형태이다.
#!syntax cpp
while (<조건식>) {
    <조건식이 참일 경우>
}


If와 마찬가지로 조건식 부분에는 반환값이 존재하는 식이 올 수 있으며 반환값의 타입은 TRUE/FALSE 만을 표현하는 boolean 값이어야 한다. 언어에 따라서 반환값의 타입이 boolean인지에 대한 검사 기준이 다른데, C언어 계열은 여기에 integer를 넣으면 값이 0일 경우 거짓, 0이 아닐 경우 참으로 판단하는 식으로 동작하지만, Java계열 언어에선 타입이 boolean이 아니면 컴파일 에러가 난다.

If와의 차이점은 조건식이 참일 경우에 실행되는 구문을 모두 실행한 뒤 조건식을 한번 더 검사한다는 점이다. 여기서 조건식이 거짓이면 While 문에서 나가지만, 참일 경우 구문을 실행한다. 그리고 조건식을 검사하는 것을 반복한다.

2.1.1. Do-While

#!syntax cpp
do{
    <구문>
}while (<조건식>);


조건을 검사하기 전에 일단 먼저 구문을 실행한 다음 조건을 검사하는 방식이다. 조건이 참이면 구문을 다시 실행하며 거짓이면 While문에서 나간다.

2.2. For

#!syntax cpp
for (<선언>; <조건식>; <진행>) {
    <구문>
}


반복문을 사용할 때 일반적으로 변수를 먼저 선언하고, 선언한 변수가 조건에 맞는지 검사한 다음 참이면 실행하고, 변수의 값을 변경한 다음 검사하는 것을 반복하는데, 이를 하나의 구문으로 축약한 형태이다.

먼저 선언 부분을 실행한 다음 조건식을 검사해서 거짓이면 For문에서 나간다. 참이면 구문을 실행한 다음 진행을 하고 조건식을 검사하는 것을 반복한다.

내용을 비울 수 있으며 이 경우 무한 루프가 된다.

2.2.1. 순회용 For

언어에 따라 특정 자료구조의 원소들을 순회하는 용도로 제공된 전용 For 문이 있으며, 사용되는 형태는 언어마다 다르다. 예를 들어 C++ Java에서는 for(<원소>:<자료구조>)의 형태를 사용하고, Python에서는 for <원소> in <자료구조> 식으로 사용한다.

C++의 경우 자료구조에 해당하는 클래스 내부에 순회용 클래스를 만들고, begin() 함수에서 순회용 클래스를 반환, 반복문에 숨겨진 순회용 클래스 변수에 대입한다. 그 다음 순회용 클래스에 오버로딩된 != 함수에서 end()함수의 반환값을 넘겨서 false를 반환하면 반복문에서 나가고 true를 반환하면 원소 변수에 순회용 클래스에 오버로딩된 * 연산자 함수를 반환시키고 구문을 진행한 다음 순회용 클래스에 오버로딩된 ++연산자 함수에서 순회용 클래스를 다음 위치로 이동시킨 다음 오버로딩된 != 함수를 실행하는 것을 반복한다. 정해진 함수명을 사용해야 하기 때문에 한 클래스에 한 가지의 순회용 For만 사용할 수 있다.

코드로 표현하면 다음과 같다.
#!syntax cpp
//선언
class <클래스>{
    class <순회용 클래스>{
    public:
        <순회용 클래스>(<초기값>){
            <생성자>
        }
        void operator++(){
            <진행>
        }
        <반환형> operator*(){
            return <반환값>
        }
        bool operator!=(<순회용 클래스>&){
            return <반환값>
        }
    };
public:
    <순회용 클래스> begin(){
        return <순회용 클래스>(<초기값>);
    }
    <순회용 클래스> end(){
        return <순회용 클래스>(<거짓값>);
    }
};

#!syntax cpp
//사용
for (<원소> : <클래스 변수>) {
    <구문>
}


보다시피 매우 비직관적인데다 클래스 하나당 순회용 For 문을 하나만 쓸 수 있다는 문제가 있기 때문에 최근 언어에서는 람다식으로 대체하는 추세이다.

2.3. Break, Continue

Break는 반복문을 종료시키고, Continue는 반복문 상단으로 가서 조건을 다시 검사한다. 주로 반복문 중간에 조건을 검사해야 하는 경우 사용한다.

#!syntax cpp
while (<조건식>) {
    <구문>
    if(<조건식>){
        continue;
    }
    <구문>
    if(<조건식>){
        break;
    }
    <구문>
}

3. 다중 반복문 탈출

반복문이 여러개가 겹처져 있을 경우 일반적으로는 각 반복문의 조건으로 가서 일일히 검사를 하는 과정을 거처야 한다. 하지만 이는 성능 하락이 있을 뿐 아니라 쓰기도 불편하고 직관적이지도 않다.

때문에 다중 반복문을 탈출하는 방법이 있는데, GOTO문을 이용하거나 예외 처리를 이용한다. 이를 이용해 다중 반복문의 조건들을 무시하고 한번에 탈출할 수 있다.

4. 기타

5. 관련 문서