맨위로가기

For 루프

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

For 루프는 대부분의 명령형 프로그래밍 언어에서 지원하는 반복 구조의 일종이다. 숫자 범위, 임의의 집합, 초기화-조건식-증감문 형식을 포함하여 여러 종류가 있으며, 각 언어는 고유한 문법을 가진다. C 언어에서 파생된 스타일의 for 루프가 널리 사용되며, 루프 카운터라는 제어 변수를 사용하여 반복 횟수를 관리한다. 파스칼, 베이직, 파이썬 등 다양한 언어에서 for 루프를 구현하며, 언어에 따라 루프의 종료 조건, 증감 방식, 사용 가능한 구문 등이 다르다.

더 읽어볼만한 페이지

  • 제어 흐름 - 프로그램 카운터
    프로그램 카운터는 CPU 내에서 다음에 실행될 명령어의 주소를 저장하는 레지스터로, 명령어 사이클의 fetch 단계에서 사용되어 명령어를 가져오고 실행 후 갱신되며, CPU 성능 향상 기술과 현대 프로그래밍 모델에 영향을 미친다.
  • 제어 흐름 - 예외 처리
    예외 처리는 프로그램 실행 중 예외 발생 시 정상적인 실행 흐름을 유지하거나 안전하게 종료하기 위한 메커니즘으로, 많은 프로그래밍 언어에서 제공하며 예외 안전성을 목표로 한다.
  • 프로그래밍 구성체 - 형 변환
    형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다.
  • 프로그래밍 구성체 - 연산자 오버로딩
    연산자 오버로딩은 프로그래밍 언어에서 기존 연산자를 사용자 정의 자료형에 대해 재정의하여 내장 자료형처럼 다루도록 하는 기능으로, 코드 가독성과 표현력을 높이지만 남용 시 코드 의미를 모호하게 만들 수 있다.
For 루프
개요
유형제어 흐름 구문
목적코드 블록의 반복 실행
사용법특정 조건이 충족되는 동안 또는 지정된 횟수만큼 코드 블록을 반복
구문 (일반적인 형태)
초기화루프 변수 초기화 (예: i = 0)
조건루프 실행 조건 (예: i < 10)
증감루프 변수 증감 (예: i++)
본문반복 실행될 코드 블록
변형
언어별 구문C/C++, Java, JavaScript: `for (초기화; 조건; 증감) { ... }`
Python: `for 변수 in 시퀀스: ...`
Pascal: `for 변수 := 시작값 to 종료값 do ...`
Fortran: `DO 변수 = 시작값, 종료값, 증감값 ... END DO`
COBOL: `PERFORM VARYING 변수 FROM 시작값 BY 증감값 UNTIL 조건 ... END-PERFORM`
특징
장점반복 횟수가 명확할 때 유용, 코드 간결성 증가
단점무한 루프에 빠질 가능성, 초기화/조건/증감 관리 필요
관련 개념
관련 구문while 루프, do-while 루프, foreach 루프
제어 흐름break 문, continue 문
주의 사항
무한 루프루프 종료 조건을 신중하게 설정하여 무한 루프 방지
성능루프 내부 연산 최적화, 불필요한 연산 줄이기
역사적 맥락
기원초기 프로그래밍 언어부터 존재, 반복 작업 자동화 필요성 반영
영향구조적 프로그래밍의 핵심 요소, 다양한 알고리즘 구현에 활용

2. 종류

for 루프는 대부분의 명령형 프로그래밍 언어에서 지원되지만, 언어별로 지원하는 for 문의 종류와 문법에는 차이가 있다.

종류설명지원 언어예시
숫자 범위등차수열 안의 숫자들을 루프 변수에 대입하여 안쪽 코드를 실행한다.베이직, 포트란, 파스칼
임의의 집합집합 또는 목록 안의 원소들을 순서대로 루프 변수에 대입하여 안쪽 코드를 실행한다.파이썬, PHP
초기화-조건식-증감문 형식세 개의 식(초기화, 조건식, 증감문)으로 루프를 정의한다.C, C++, C#, Java, JavaScript 등
조건절 추가while 루프와 같은 조건절을 추가하여, 조건이 참일 경우에만 루프를 실행한다.ALGOL 68, PL/I


2. 1. 숫자 범위

이 종류의 for 루프는 특정 루프 변수에 주어진 숫자 범위, 더 정확하게는 등차수열 안의 숫자들을 대입하여 안쪽 코드를 실행하는 형식으로 이루어져 있다. 숫자 범위는 시작점과 끝점으로 대표되며, 보통은 시작점부터 1씩 커져 끝점보다 작지 않을 때까지 루프가 수행되지만 1 대신 증감될 값을 직접 선택해서 루프를 반대로 수행하는 것도 가능하다.[2]

많은 베이직 계열 언어들과 포트란 등이 이 형태의 for 문을 지원한다. 예를 들어 다음 베이직 코드는 1부터 시작해서 10으로 끝나고, 3씩 차이 나는 숫자들(즉 1, 4, 7, 10)을 출력한다.

'''FOR''' ''I'' = 1 '''TO''' 10 '''STEP''' 3

'''PRINT''' ''I''

'''NEXT''' ''I''

350px


PL/I와 ALGOL 68은 루프 변수가 단일 범위 대신 값 범위 목록을 통해 반복되는 루프를 허용한다. 다음 PL/I 예제는 i의 여섯 가지 값(1, 7, 12, 13, 14, 15)으로 루프를 실행한다.[2]

```rexx

do i = 1, 7, 12 to 15;

/*명령문*/

end;

```

Pascal에서의 구문은 다음과 같다 (BASIC의 기본적인 구문도 동일하다).[2]

```pascal

for 변수 := 초기값 to 종료값 do

문장

```

이 루프는 다음과 같은 순서로 실행된다.[2]

1. 카운터 변수에 초기값을 대입한다.

2. 카운터 변수의 값이 종료값보다 크면 루프를 종료한다. (조건 평가)

3. 문장을 실행한다.

4. 카운터 변수의 값을 다음 값 (Succ 함수의 결과. 정수형 변수라면 1을 더한다)으로 하고, 조건 평가로 돌아간다.

C 언어 등과 달리, 초기화와 카운터 변수의 갱신이 각각 초기값의 대입과 1을 더하는 것 (또는 빼는 것)으로 한정되며, 루프 지속 조건이 "카운터 변수가 종료값보다 큰지 여부"로만 한정되어 있다. 따라서 C의 for문보다 특수화된 것으로 생각할 수 있다.[2]

FOR 변수 = 초기값 TO 종료값 STEP 증가값

명령문

NEXT 변수

이 루프는 다음과 같은 절차로 실행된다.[2]

1. 카운터 변수에 초기값을 대입한다.

2. 카운터 변수의 값이, 초기값이 종료값보다 작을 경우 클 경우, 또는 초기값이 종료값보다 클 경우 작을 경우, 루프를 종료한다.(조건 평가)

3. 명령문을 실행한다.

4. 카운터 변수의 값에 증가값을 더하고, 조건 평가로 돌아간다.

"STEP 증가값"이 생략된 경우, 증가값은 1로 간주된다.[2]

2. 2. 임의의 집합

파이썬은 이 형태의 for 루프 외에 다른 형태의 문법을 가지고 있지 않은 것으로 잘 알려져 있다. 파이썬에서 숫자 범위를 사용해서 for 루프를 흉내 내려면 배열을 반환하는 `range` 함수(또는 반복자만을 구현하는 `xrange` 자료형)를 사용하여 쓸 수 있다.

```python

for i in range(1, 11, 3):

print i

```

some_iterable_object영어는 암시적 반복을 지원하는 데이터 모음(예: 직원 이름 목록)이거나, 반복자 자체일 수 있다. 일부 언어는 다른 for 루프 구문 외에도 이를 가지고 있다. 특히, PHP는 `for each`라는 이름으로 이 유형의 루프와 `for`라는 이름으로 세 개의 표현식이 있는 for 루프를 모두 지원한다.

2. 3. 초기화-조건식-증감문 형식

초기화-조건식-증감문으로 이루어진 for 루프의 동작


이 종류의 for 루프는 C에서 유래한 문법을 사용하는 대부분의 언어들이 지원하며, 세 개의 식 내지는 문장으로 루프를 정의한다.

  • 초기화: 루프 안에서 사용할 변수를 초기화한다. C++의 경우 `int i = 0`과 같이 지역 변수를 선언하면서 초기화하는 것도 가능하다.
  • 조건식: 루프 안쪽 코드가 실행되기 전에 참인지 여부를 검사하며, 참이 아니면 루프를 종료한다. 이 식은 초기화 직후에도 평가될 수 있다.
  • 증감문: 루프 안쪽 코드가 실행된 후에 실행되는 문장이다. 보통 루프 변수를 증감시키는 용도로 쓰인다.


다음은 초기화, 조건식, 증감문을 모두 사용하는 C++ 코드 예제이다.

```cpp

for (int i = 1; i <= 10; i += 3)

printf("%d\n", i);

/* C의 경우 다음 코드가 필요하다. */

int i;

for (i = 1; i <= 10; i += 3)

printf("%d\n", i);

```

각 식은 아무것도 없이 세미콜론 구분자만을 둬서 생략할 수 있다. 만약 조건식이 생략되면, 조건식은 항상 참으로 평가되며 이는 무한 루프를 구현하는 데 사용된다. 다음은 세 식을 모두 생략하여 같은 의미를 구현한 것이다.

```cpp

int i = 1;

for (;;) {

printf("%d\n", i);

i += 3;

if (i > 10) break;

}

```

awk, C, C++, C#, D, Java, JavaScript, Perl 등에서 기본적인 구문은 다음과 같다.

```c

for(초기화; 루프의 지속 조건; 카운터 변수의 갱신)



```

문은 어떤 문이라도 좋지만, 다음과 같은 문이 자주 사용된다.

```c

for(…; …; …)

식; /* 단문 */

```

```c

for(…; …; …){

0개 이상의 문 /* 복문 */

}

```

```c

for(…; …; …)

for(…; …; …) /* 중첩된 for문 */

식;

```

이 루프는 다음과 같은 순서로 실행된다.

1. 초기화를 실행한다.

2. 조건을 평가한다. 조건이 거짓이면, 루프를 종료한다.

3. 참 문을 실행한다.

4. 카운터 변수의 갱신을 실행한다.

5. 조건의 평가로 돌아간다.

조건이 처음부터 거짓인 경우에는 참 문은 한 번도 실행되지 않는다. 초기화, 조건, 카운터 변수의 갱신은 각각 생략할 수 있다. 조건을 생략한 경우, 조건은 항상 참으로 간주되어, 루프에서 강제적으로 벗어나는 구문 (break, return 등)이 없으면 무한 루프가 된다.

예를 들어, 초기화와 카운터 변수의 갱신을 생략하고 조건만을 기술하는 경우, 다음이 된다.

```c

for (; x < 100;)

……

```

초기화 등을 생략한 경우에도, 괄호 내에서 구분 기호로 사용되는 세미콜론(`;`)은 생략할 수 없다.

C99, C++, C#, Java 에서는 초기화는 식에 한정되지 않고, 지역 변수를 선언할 수 있다. for문은 암묵적인 블록을 만들며, 다음 코드와 같다.

```c

{

for(…; …; …)

……

}

```

따라서, 선언된 변수의 스코프는 for문 내 ( `for(…; …; …)`를 포함)에 한정된다. C99 및 C++에서는 바깥쪽 스코프에서 정의한 변수와 같은 이름의 변수를 안쪽 스코프에서 정의할 수 있다. 예를 들어 다음 코드에서, 각각의 `i`는 다른 블록에 있기 때문에 정상적인 코드가 된다.

```c

int i = 1;

for(int i = 0; i < 10; i++)

……

for(int i = 0; i < 10; i++)

for(int i = 0; i < 10; i++)

……

/* 여기에서의 i는 1 */

```

하지만 ANSI C++ 규격이 제정되기 전 (AT&T C++ 2.0까지)의 C++에서는 암묵적인 블록이 없었기 때문에, 이 코드에서는 같은 블록 내에서 `i`가 여러 번 선언되어 컴파일 에러가 발생했다. C# 및 Java에서는 바깥쪽 스코프에서 정의한 변수와 같은 이름의 변수를 안쪽 스코프에서 정의할 수 없기 때문에 컴파일 에러가 발생한다.

초기화(식의 경우), 루프의 지속 조건, 카운터 변수의 갱신은 각각 하나의 식만이 허용된다. 하지만 쉼표 연산자를 사용해서 실질적으로 두 개의 연산을 하나의 식으로 나타낼 수 있다. 초기화에서 선언을 하는 경우도 하나의 선언 문만이 허용된다. 따라서 같은 형의 경우에 한해서 여러 변수를 선언할 수 있다.

```c

for (int i = 0, j = 0; i < 10; i++, j++)

……

```

```c

int x;

for (x = 0; x < 100; x++) {

printf("x 는 %d 입니다。\n", x);

}

```

이 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있다.

```text

x 는 0 입니다.

x 는 1 입니다.

…………

x 는 98 입니다.

x 는 99 입니다.

```

처음 변수 x의 값은 0이며, 참 문장이 1회 실행될 때마다 1이 더해진다. 참 문장이 100회 실행되면 x의 값은 100이 되어 조건이 성립하지 않게 되므로, 이때 이 루프는 종료된다.

루프를 종료하려면 루프의 조건을 거짓으로 만드는 것 외에 참 문장 내에서 break 문을 사용하는 방법도 있다. 루프의 조건이 항상 참이고 참 문장에 break 문이 포함되어 있지 않은 경우(또는 break 문이 실행되지 않는 경우), 루프는 무한 루프가 된다. 참 문장이 여러 문장으로 구성된 경우, continue 문을 사용하여 참 문장의 실행을 중지하고 카운터 변수의 갱신부터 처리를 재개할 수 있다.

C 언어의 while 문은 초기화와 카운터 변수의 갱신을 생략한 for 문으로 바꿔 쓸 수 있다. 따라서 C 언어에서의 for 문은 while 문을 일반화한 것이라고 할 수 있다.

2. 4. 조건절의 추가

일부 언어들은 보통의 for 루프에 while 루프와 같은 조건절을 추가하기도 한다. 이런 형태의 문법은 ALGOL 68에서 처음 소개되고 PL/I에서도 사용되었다. 다음은 ALGOL 68 코드 예시이다. i가 10보다 작거나 같을 때까지만 반복을 수행한다.

```algol68

for i from 1 by 3 to 42 while i≤10

do

print((i,newline));

od

```

ALGOL 68에 처음 도입되어 PL/I에서 이어진 이 방식을 사용하면, 테스트와 루프의 반복을 결합할 수 있다. 즉, 루프 변수 ''i''에 값이 할당되고, ''while 표현식''이 '''참'''일 경우에만 루프 본문이 실행된다. 결과가 '''거짓'''이면, for 루프의 실행은 중단된다.

3. 문법과 의미론

for 루프는 루프 변수의 초기화나 증감 과정을 안쪽 코드에 명시적으로 포함하고 조건문만 남겨 while 루프로 변환할 수 있다. 그러나 일부 경우에는 변수에 접근할 수 있는 코드 영역이 변환 과정에서 변경될 수 있으므로 주의해야 한다.[2]

C 계열 언어에서 제공하는 break 문이나 continue 문과 같이, 일부 언어는 루프를 도중에 중단하거나 뒤에 실행될 코드를 건너뛰고 증감문 또는 조건 검사로 바로 넘어가는 명령을 지원한다.

파이썬과 같은 언어는 for 루프가 break 문과 같은 다른 명령에 의해 갑작스럽게 종료되지 않고, 조건문이 실패하여 정상적으로 종료되는 경우에만 실행되는 코드를 지정할 수 있는 기능을 제공한다.

4. 언어별 for 루프 구문

명령형 프로그래밍 언어에서 for 루프는 다양한 구문으로 표현된다.


  • ALGOL, Simula, BASIC, 파스칼, Modula, 오베론, Ada, MATLAB, OCaml, F# 등: 시작 값과 종료 값을 가진 제어 변수를 사용한다. 파스칼 예시는 다음과 같다.




for i = first to last do statement


  • C 언어 스타일: 초기화, 조건, 다음 반복으로의 진행의 세 부분으로 구성된다. 자바 예시는 다음과 같다.




// 0부터 99까지의 숫자(100은 아님)를 출력하고 각 숫자 뒤에 공백을 추가한다.

for (int i=0; i<100; i++)

{

System.out.print(i);

System.out.print(' ');

}

System.out.println();


  • 파이썬: 항목 집합을 열거한다. 예시는 다음과 같다.




for an item in some_iterable_object:

do_something()

do_something_else()


  • Fortran 95: `for all` 키워드는 모든 우변 표현식이 어떠한 할당이 이루어지기 전에 평가된다.

  • COBOL: `PERFORM` 동사를 사용한다.




PERFORM VARYING I FROM 1 BY 1 UNTIL I > 1000

ADD I**2 TO SUM-SQ.

END-PERFORM


  • BASIC: `for-next` 루프를 사용한다.




10 REM THIS FOR LOOP PRINTS ODD NUMBERS FROM 1 TO 15

20 FOR I = 1 TO 15 STEP 2

30 PRINT I

40 NEXT I



C99부터 C 언어 스타일의 for 루프 내에서 초기 선언이 허용된다.

4. 1. C 계열 언어

C에서 유래한 문법을 사용하는 대부분의 언어들은 세 개의 식 내지는 문장으로 루프를 정의하는 for 루프를 지원한다.

  • 초기화: 루프 안에서 사용할 변수를 초기화한다. C++의 경우 `int i = 0`과 같이 지역 변수를 선언하면서 초기화하는 것도 가능하다.
  • 조건식: 루프 안쪽 코드가 실행되기 전에 참인지 여부를 검사하며, 참이 아니면 루프를 종료한다. 이 식은 초기화 직후에도 평가될 수 있다.
  • 증감문: 루프 안쪽 코드가 실행된 후에 실행되는 문장이다. 보통 루프 변수를 증감시키는 용도로 쓰인다.


다음은 초기화, 조건식, 증감문을 모두 사용하는 C++ 코드 예제이다.



for (int i = 1; i <= 10; i += 3)

printf("%d\n", i);

/* C의 경우 다음 코드가 필요하다. */

int i;

for (i = 1; i <= 10; i += 3)

printf("%d\n", i);



각 식은 아무것도 없이 세미콜론 구분자만을 둬서 생략할 수 있다. 만약 조건식이 생략되면, 조건식은 항상 참으로 평가되며 이는 무한 루프를 구현하는 데 사용된다.

B 프로그래밍 언어에서 비롯된 이러한 유형의 "세미콜론 루프"는 스티븐 존슨에 의해 발명되었다.[2]

다음은 자바에서 C 스타일의 전통적인 for 루프의 예이다.



// 0부터 99까지의 숫자(100은 아님)를 출력하고 각 숫자 뒤에 공백을 추가한다.

for (int i=0; i<100; i++)

{

System.out.print(i);

System.out.print(' ');

}

System.out.println();



C의 루프는 단어의 역순을 출력하는 데에도 사용될 수 있다.



for (i = 0; i < 6; i++) {

scanf("%c", &a[i]);

}

for (i = 4; i >= 0; i--) {

printf("%c", a[i]);

}



여기서 입력이 `apple`이면, 출력은 `elppa`가 된다.

C 언어의 for 루프 기본 구조는 다음과 같다.



for (초기화; 조건; 증감/감소)

구문



ISO/IEC 9899:1999 출판물 (C99)은 루프 내에서 초기 선언도 허용하며, for 루프의 세 섹션은 모두 선택 사항이며, 빈 조건은 true와 동일하다.

다음은 펄(Perl)의 for 루프 예시이다.



for ($counter = 1; $counter <= 5; $counter++) { # 암묵적으로 또는 미리 정의된 변수

# 문장;

}

for (my $counter = 1; $counter <= 5; $counter++) { # 루프에 프라이빗한 변수

# 문장;

}

for (1..5) { # 변수가 암묵적으로 $_로 호출됨; 1..5는 이 5개의 요소의 리스트를 생성

# 문장;

}

statement for 1..5; # 거의 동일 (단 하나의 문장) 자연어 순서로

for my $counter (1..5) { # 루프에 프라이빗한 변수

# 문장;

}



다음은 자바(Java)의 for 루프 예시이다.



for (int i = 0; i < 5; i++) {

// 루프 내에서 함수 수행;

// 'break;' 문을 사용하여 조기에 종료할 수 있습니다;

// 'continue;' 문을 사용하여 현재 반복을 건너뛸 수 있습니다

}



자바스크립트는 C 스타일의 "세 표현식" 루프를 지원한다. `break` 및 `continue` 문은 루프 내에서 지원된다.



for (var i = 0; i < 5; i++) {

// ...

}



다음은 PHP의 for 루프를 사용하여 별표(*) 삼각형을 출력하는 예시이다.




for ($i = 0; $i <= 5; $i++) {

for ($j = 0; $j <= $i; $j++) {

echo "*";

}

echo "
\n";

}

?>



다음은 Go(고) 언어의 for 루프 예시이다.



for i := 0; i <= 10; i++ {

// 구문

}



awk, C, C++, C#, D, Java, JavaScript, Perl 등에서 for 루프의 기본적인 구문은 다음과 같다.

```c

for(초기화; 루프의 지속 조건; 카운터 변수의 갱신)



```

이 루프는 다음과 같은 순서로 실행된다.

# 초기화를 실행한다.

# 조건을 평가한다. 조건이 거짓이면, 루프를 종료한다.

# 참 문을 실행한다.

# 카운터 변수의 갱신을 실행한다.

# 조건의 평가로 돌아간다.

C99, C++, C#, Java 에서는 초기화는 식에 한정되지 않고, 지역 변수를 선언할 수 있다. for문은 암묵적인 블록을 만든다.

초기화와 카운터 변수의 갱신을 생략하고, 조건만을 기술하는 경우, 다음과 같이 작성할 수 있다.

```c

for (; x < 100;)

……

```

초기화 등을 생략한 경우에도, 괄호 내에서 구분 기호로 사용되는 세미콜론(`;`)은 생략할 수 없다.

C 언어의 while 문은 초기화와 카운터 변수의 갱신을 생략한 for 문으로 바꿔 쓸 수 있다. 따라서, C 언어에서의 for 문은 while 문을 일반화한 것이라고 할 수 있다.

4. 2. 파스칼 (Pascal)

파스칼에서 `for` 루프는 다음과 같은 형태를 가진다.[2]

```pascal

for 변수 := 초기값 to 종료값 do

문장

```

`to` 대신 `downto` 키워드를 사용하면 감소(역순) 계산을 수행한다.

```pascal

for Counter:= 5 down to 1 do

(*statement*);

```

이 루프는 다음 순서로 실행된다.

1. 카운터 변수에 초기값을 대입한다.

2. 카운터 변수의 값이 종료값보다 크면 루프를 종료한다. (조건 평가)

3. 문장을 실행한다.

4. 카운터 변수의 값을 다음 값 (일반적으로 정수형 변수의 경우 1을 더하거나 뺌)으로 하고, 조건 평가로 돌아간다.

파스칼의 for 루프는 초기화, 카운터 변수 갱신, 루프 지속 조건이 제한적이기 때문에 C 언어의 for 루프보다 특수한 형태라고 할 수 있다.

다음은 파스칼 for 루프의 예시이다.

```pascal

for x := 0 to 99 do

writeln('x は ', x, ' です。')

4. 3. 베이직 (BASIC)

vbnet

FOR 변수 = 초기값 TO 종료값 STEP 증가값

명령문

NEXT 변수

```

위와 같은 형태로 사용하며, `NEXT` 변수로 루프를 종료한다.
예시:```vbnet

10 REM THIS FOR LOOP PRINTS ODD NUMBERS FROM 1 TO 15

20 FOR I = 1 TO 15 STEP 2

30 PRINT I

40 NEXT I

```

종료 루프 표시는 인덱스 변수의 이름을 지정하며, 이는 for 루프의 시작 부분에 있는 인덱스 변수의 이름과 일치해야 한다. Fortran은 `EXIT` 및 `CYCLE` 문을 사용하여 이 텍스트의 이름을 지정할 수 있도록 허용한다. 루프 중첩에서 이를 통해 의도한 루프가 명확해진다. 그러나 이러한 언어에서는 레이블이 고유해야 하므로 동일한 인덱스 변수를 사용하는 연속적인 루프는 동일한 텍스트를 사용할 수 없으며, 레이블은 루프의 인덱스 변수와 같은 변수 이름과 같을 수도 없다.[2]

이 루프는 다음과 같은 절차로 실행된다.

1. 카운터 변수에 초기값을 대입한다.

2. 카운터 변수의 값이 초기값보다 작고 종료값보다 클 경우, 또는 초기값이 종료값보다 크고 종료값보다 작을 경우 루프를 종료한다. (조건 평가)

3. 명령문을 실행한다.

4. 카운터 변수의 값에 증가값을 더하고, 조건 평가로 돌아간다.

"STEP 증가값"이 생략된 경우, 증가값은 1로 간주된다.
예시:```vbnet

FOR x = 0 TO 99 STEP 1

PRINT "x는 " & x & " 입니다."

NEXT x

```

실행 결과는 C 및 이와 유사한 언어의 경우에 표시된 것과 동일하다.

4. 4. Python

파이썬은 다른 형태의 for 루프 문법을 가지고 있지 않다. 파이썬에서 숫자 범위를 사용하여 for 루프를 사용하려면 배열을 반환하는 `range()` 함수를 사용한다.

일반적인 사용법은 다음과 같다.

```python

for 변수 in 반복가능객체:

# 실행할 코드

```

`range()` 함수를 사용한 예시는 다음과 같다.

```python

for i in range(1, 11, 3):

print(i)

```

`range(1, 11, 3)`는 1부터 10까지 3씩 증가하는 숫자들을 의미한다.

`range()` 함수의 일반적인 사용법은 다음과 같다.

```python

for i in range(1, 6): # i에 1부터 5까지의 값을 할당 (6은 포함하지 않음)

# 명령문

print(i)

# 만약 6까지 원한다면 다음과 같이 해야 한다.

for i in range(1, 6 + 1): # i에 1부터 6까지의 값을 할당

# 명령문

print(i)

```

`range(6)`을 사용하면 루프가 0부터 5까지 실행된다.

4. 5. 기타 언어

ALGOL은 슈퍼플랜(Superplan) 형태를 사용하여 `for` 구문을 도입했다. 예를 들어 0부터 10까지 1씩 증가시키며 출력하려면 다음과 같이 한다.



FOR x = 0 (1) 10 BEGIN

PRINT (FL) = x END



Ada에서 `exit` 문은 루프를 종료하는 데 사용될 수 있다. 루프는 레이블을 지정할 수 있으며, `exit`는 중첩된 루프 그룹에서 특정 레이블이 지정된 루프를 벗어날 수 있다.



Counting:

For Counter in 1 .. 5 loop

Triangle:

for Secondary_Index in 2 .. Counter loop

  • - statements

exit Counting;

  • - statements

end loop Triangle;

end loop Counting;



Fortran의 `for` 루프에 해당하는 것은 `DO` 루프이며, `for` 대신 `do`라는 키워드를 사용한다. FORTRAN 77(또는 그 이후 버전)에서는 다음과 같이 작성할 수도 있다.



do counter = 1, 5

write(*, '(i2)') counter

end do



COBOL은 1959년 말에 공식화되었으며, 여러 가지 개선이 이루어졌다. COBOL은 다양한 옵션을 가진 `PERFORM` 동사를 사용한다. 1980년대에, 인라인 루프와 `END-PERFORM`과 같은 ''구조적 프로그래밍'' 구문의 추가로 인해, 더욱 익숙한 구조의 `for`-루프가 등장했다.



PERFORM VARYING I FROM 1 BY 1 UNTIL I > 1000

ADD I**2 TO SUM-SQ.

END-PERFORM



Maple에는 두 가지 형태의 for 루프가 있는데, 하나는 값의 범위를 반복하는 것이고 다른 하나는 컨테이너의 내용을 반복하는 것이다. 값 범위 형식은 다음과 같다.

'''for''' ''i'' '''from''' ''f'' '''by''' ''b'' '''to''' ''t'' '''while''' ''w'' '''do'''

''# 루프 본체''

'''od''';



for n = 1:5

  • - 구문

end


Perl 프로그래밍의 모토는 "세상에는 여러가지 방법이 있다"이다. 다음은 for 루프의 예시이다.



for ($counter = 1; $counter <= 5; $counter++) { # 암묵적으로 또는 미리 정의된 변수

# 문장;

}

for (my $counter = 1; $counter <= 5; $counter++) { # 루프에 프라이빗한 변수

# 문장;

}

for (1..5) { # 변수가 암묵적으로 $_로 호출됨; 1..5는 이 5개의 요소의 리스트를 생성

# 문장;

}

statement for 1..5; # 거의 동일 (단 하나의 문장) 자연어 순서로

for my $counter (1..5) { # 루프에 프라이빗한 변수

# 문장;

}



스몰토크에서 for 루프는 언어 구성이 아니라, 시작 값을 `self`로 사용하여 종료 값과 클로저의 두 매개변수를 가진 메소드로 `Number` 클래스에 정의되어 있다.

1 to: 5 do: [ :counter | "statements" ]

루비는 여러 가지 가능한 구문을 가지고 있다. 다음은 그 예시들이다.



for counter in 1..5

# statements

end

5.times do |counter| # counter는 0에서 4까지 반복한다.

# statements

end

1.upto(5) do |counter|

# statements

end



Haskell에서 내장된 명령형 `forM_`은 모나드 표현식을 리스트로 맵핑하며, 다음과 같다.

```haskell

forM_ [1..5] $ \indx -> do 문장

```



for j = 1:10

# 명령문

end



자바스크립트는 C 스타일의 "세 표현식" 루프를 지원한다. `break` 및 `continue` 문은 루프 내에서 지원된다.



for (var i = 0; i < 5; i++) {

// ...

}


5. 루프 카운터

컴퓨터 프로그래밍에서 '''루프 카운터'''는 프로그래밍 언어의 루프 반복을 제어하는 변수이다. 루프 카운터는 정해진 순서의 정수 값 범위(예: 0부터 시작하여 1씩 증가하여 10에서 끝나는 경우)를 갖도록 설계되므로 이러한 이름이 붙었다.

루프 카운터는 루프가 반복될 때마다 변경되어 각 반복에 고유한 값을 제공한다. 루프 카운터는 루프가 종료되고 프로그램 흐름이 루프 다음의 명령어로 진행되어야 하는 시점을 결정한다.

일반적인 식별자 명명 규칙은 루프 카운터 변수 이름으로 '''i''', '''j''', '''k''' 등을 사용하는 것이다. 여기서 '''i'''는 가장 바깥쪽 루프, '''j'''는 그 다음 안쪽 루프를 나타낸다. 일부 프로그래머는 이 순서를 반대로 사용하기도 한다. 이 스타일은 Fortran의 초기 프로그래밍에서 유래된 것으로, 이 언어에서는 '''i''', '''j''', '''k''' 등으로 시작하는 변수 이름이 암묵적으로 정수 유형으로 선언되었기 때문에 루프 카운터로 자주 사용되었다. 이는 수학적 표기법에서 색인으로 합계와 곱셈에 '''i''', '''j''' 등을 사용하는 것에서 비롯되었다. 변형 규칙으로 '''ii''', '''jj''', '''kk'''와 같이 문자를 중복하여 사용하기도 하는데, 이는 단일 문자를 사용하는 것보다 검색 및 바꾸기가 더 쉽기 때문이다.[3]

프로그래밍 언어마다 루프 변수가 루프 종료 시 어떤 값을 유지하는지에 대한 규칙이 다르다. 실제로 일부 언어에서는 이를 "정의되지 않음"으로 간주한다. 이는 컴파일러가 루프 변수에 어떤 값이든 남겨두거나, 루프 값이 레지스터에 보관되어 메모리에 저장되지 않은 경우 값을 변경하지 않은 채로 남겨두는 코드를 생성하도록 허용하기 때문이다. 실제 동작은 컴파일러의 최적화 설정에 따라 달라질 수 있다.

일부 언어(C 또는 C++ 제외)에서 루프 변수는 루프 본문 범위 내에서 불변 객체이며, 해당 값을 수정하려는 시도는 의미론적 오류로 간주된다. 이러한 수정은 프로그래머 오류의 결과일 수 있으며, 발견하기 어려울 수 있다. 그러나 명백한 변경 사항만 컴파일러에 의해 감지될 가능성이 높다.

다음은 Fortran 스타일의 예시이다.

```Fortran

DO I = 1, N

I = 7 ! 루프 변수의 명백한 조정. 컴파일러 오류 발생 가능성 높음.

Z = ADJUST(I) ! "ADJUST" 함수는 "I"를 변경할 수 있으며, 그 영향은 불확실함.

Normal statements ! 메모리가 사라지고 "I"는 루프 변수임.

PRINT (A(I), B(I), I = 1, N, 2) ! 배열 A와 B의 홀수 요소를 인쇄하기 위한 암시적 for-루프, "I" 재사용...

PRINT I ! 어떤 값이 표시될까?

END DO ! 루프는 몇 번이나 실행될까?

```

일반적인 접근 방식은 루프 시작 시 반복 횟수를 계산하고, 각 반복마다 이 횟수를 감소시키면서 루프 변수의 값도 조정하는 것이다. 이 경우 중복 계산이 발생할 수 있지만, 루프 내에서 루프 변수의 값을 조정해도 실행되는 반복 횟수는 변경되지 않는다.

생성된 코드가 루프 변수로 보조 변수를 사용할 수도 있다. 이 보조 변수는 기계 레지스터에 보관될 수 있으며, 각 반복마다 루프 변수에 복사될 수도 있고 그렇지 않을 수도 있다. 루프 변수의 수정은 루프 제어에 영향을 미치지 않지만, 루프 내에서 루프 변수의 값에 대한 참조가 현재 루프 변수의 값(변경되었을 수 있음) 또는 보조 변수(부적절한 수정으로부터 안전하게 보호됨) 중 어느 것을 참조하는지에 따라 혼란스러운 결과가 발생할 수 있다.

awk, C, C++, C#, D, Java, JavaScript, Perl 등에서 기본적인 구문은 다음과 같다.

```c

for(초기화; 루프의 지속 조건; 카운터 변수의 갱신)



```

위 코드는 다음과 같은 순서로 실행된다.

1. 초기화를 실행한다.

2. 조건을 평가한다. 조건이 거짓이면 루프를 종료한다.

3. 참 문을 실행한다.

4. 카운터 변수의 갱신을 실행한다.

5. 조건 평가로 돌아간다.

조건이 처음부터 거짓이면 참 문은 한 번도 실행되지 않는다. 초기화, 조건, 카운터 변수의 갱신은 각각 생략할 수 있다. 조건을 생략하면 항상 참으로 간주되어 무한 루프가 된다.

예를 들어 초기화와 카운터 변수의 갱신을 생략하고 조건만 기술하면 다음과 같다.

```c

for (; x < 100;)

……

```

C99, C++, C#, Java에서는 초기화에서 지역 변수를 선언할 수 있다. for문은 암묵적인 블록을 만들기 때문에 선언된 변수의 스코프는 for문 내에 한정된다.

Pascal에서의 구문은 다음과 같다.

```pascal

for 변수 := 초기값 to 종료값 do

문장

```

이 루프는 다음과 같은 순서로 실행된다.

1. 카운터 변수에 초기값을 대입한다.

2. 카운터 변수의 값이 종료값보다 크면 루프를 종료한다. (조건 평가)

3. 문장을 실행한다.

4. 카운터 변수의 값을 다음 값으로 하고, 조건 평가로 돌아간다.

C 언어 등과 달리 Pascal의 for문은 초기화와 카운터 변수의 갱신이 제한적이다.

BASIC의 기본적인 구문도 Pascal과 유사하다.

```basic

FOR 변수 = 초기값 TO 종료값 STEP 증가값

명령문

NEXT 변수

```

이 루프는 다음과 같은 절차로 실행된다.

1. 카운터 변수에 초기값을 대입한다.

2. 조건 평가를 수행하여 루프 종료 여부를 결정한다.

3. 명령문을 실행한다.

4. 카운터 변수의 값에 증가값을 더하고, 조건 평가로 돌아간다.

"STEP 증가값"이 생략된 경우 증가값은 1로 간주된다.

6. 추가적인 의미 및 구성

일부 프로그래밍 언어는 `for` 루프의 반복 방식을 변경하는 추가 구문을 제공한다. C 언어와 그 파생 언어들에서는 `break`와 `continue` 구문이 사용된다. `break`는 즉시 가장 안쪽 루프를 종료하고, `continue`는 현재 반복을 건너뛰고 다음 반복으로 넘어간다. `for` 구문은 구문 본문 내에서 `break`, `goto`, `return` 구문이 실행될 때도 종료된다. 다른 언어들도 유사한 구문을 제공하거나 `for` 루프 진행을 변경하는 다른 방법을 제공한다. 예를 들어 Fortran 95에서는 다음과 같은 코드를 사용할 수 있다.

```fortran

DO I = 1, N

statements! 모든 "I" 값에 대해 실행됩니다.

IF (no good) CYCLE! 이 "I" 값은 건너뛰고, 다음 값으로 계속 진행합니다.

Statements! 긍정적인 경우에만 실행됩니다.

IF (disaster) EXIT! 루프를 중단합니다.

Statements! 긍정적이고, 재앙이 없는 경우.

END DO! "DO"와 정렬되어야 합니다.

```

Fortran 95와 같은 일부 언어는 중첩 루프에서 어떤 루프가 관련되는지 명확하게 하기 위해 루프 구문에 이름을 지정하는 기능을 제공한다.

```fortran

X1:DO I = 1, N

statements

X2:DO J = 1, M

statements

IF (trouble) CYCLE X1

statements

END DO X2

statements

END DO X1

```

위 코드에서 `CYCLE X1`은 내부 루프(`X2`)가 아닌 외부 루프(`X1`)의 다음 반복으로 건너뛰도록 한다. 컴파일러는 `END DO` 문의 레이블 일치 여부도 확인하여 오류를 방지한다.

awk, C, C++, C#, D, Java, JavaScript, Perl 등에서 `for` 루프의 기본 구문은 다음과 같다.

```c

for(초기화; 루프의 지속 조건; 카운터 변수의 갱신)



```

위 구문은 다음과 같은 순서로 실행된다.

1. 초기화 실행

2. 조건 평가. 거짓이면 루프 종료.

3. 참 문 실행.

4. 카운터 변수 갱신.

5. 조건 평가 단계로 돌아감.

처음부터 조건이 거짓이면 참 문은 실행되지 않는다. 초기화, 조건, 카운터 변수 갱신은 생략 가능하다. 조건을 생략하면 항상 참으로 간주되어 `break`, `return` 등으로 강제 종료하지 않으면 무한 루프가 된다.

```c

for (; x < 100;)

……

```

위와 같이 초기화 등을 생략해도 구분 기호 `;`는 생략할 수 없다.

C99, C++, C#, Java에서는 초기화에서 지역 변수를 선언할 수 있다. `for` 문은 암묵적 블록을 생성하여, 아래 코드와 동일하게 작동한다.

```c

{

for(…; …; …)

……

}

```

따라서, 선언된 변수의 스코프는 `for` 문 내부로 한정된다. C99 및 C++에서는 외부 스코프 변수와 같은 이름의 변수를 내부에서 정의할 수 있다.

```c

int i = 1;

for(int i = 0; i < 10; i++)

……

for(int i = 0; i < 10; i++)

for(int i = 0; i < 10; i++)

……

/* 여기에서의 i는 1 */

```

하지만 ANSI C++ 규격 이전(AT&T C++ 2.0까지)의 C++에서는 암묵적 블록이 없어 위 코드는 같은 블록 내에서 `i`가 여러 번 선언되어 컴파일 오류가 발생했다. C# 및 Java에서는 외부 스코프 변수와 같은 이름의 변수를 내부에서 정의할 수 없어 컴파일 오류가 발생한다.

초기화, 루프 지속 조건, 카운터 변수 갱신에는 각각 하나의 식만 허용되지만, 쉼표 연산자를 사용하여 여러 연산을 하나의 식으로 나타낼 수 있다. 초기화에서 선언을 하는 경우에도 하나의 선언 문만 허용되므로, 같은 형의 변수만 여러 개 선언할 수 있다.

```c

for (int i = 0, j = 0; i < 10; i++, j++)

……

```

Pascal에서의 구문은 다음과 같다. ( BASIC의 기본 구문도 동일하다.)

```pascal

for 변수 := 초기값 to 종료값 do

문장

```

이 루프는 다음과 같은 순서로 실행된다.

1. 카운터 변수에 초기값 대입.

2. 카운터 변수 값이 종료값보다 크면 루프 종료 (조건 평가).

3. 문장 실행.

4. 카운터 변수 값을 다음 값(Succ 함수의 결과, 정수형 변수라면 1 증가)으로 변경하고 조건 평가로 돌아감.

C 언어 등과 달리 Pascal의 `for` 문은 초기값 대입과 1 증가(또는 감소)로 제한되고, 루프 지속 조건은 "카운터 변수가 종료값보다 큰지 여부"로만 제한되어 C의 `for` 문보다 특수하다.

BASIC에서의 `for` 루프는 다음과 같다.

```basic

FOR 변수 = 초기값 TO 종료값 STEP 증가값

명령문

NEXT 변수

```

이 루프는 다음과 같은 절차로 실행된다.

1. 카운터 변수에 초기값 대입.

2. 카운터 변수 값이 (초기값이 종료값보다 작을 경우) 클 경우, 또는 (초기값이 종료값보다 클 경우) 작을 경우 루프 종료 (조건 평가).

3. 명령문 실행.

4. 카운터 변수 값에 증가값을 더하고 조건 평가로 돌아감.

`STEP 증가값`이 생략되면 증가값은 1로 간주된다.

7. 한국의 특수한 관점

(이전 출력에서 주어진 원본 소스가 없어 섹션 내용 작성이 불가능했으므로, 수정할 내용이 없습니다. 따라서 이전과 동일하게 빈칸으로 출력합니다.)

참조

[1] 서적 Systematic Programming: An Introduction Prentice-Hall
[2] 간행물 VCF East 2019 – Brian Kernighan interviews Ken Thompson https://www.youtube.[...] 2020-11-16
[3] 문서 Analysis of loop control variables in C http://www.knosof.co[...]
[4] 웹사이트 Compiler Warning (level 4) C4127 http://msdn.microsof[...] Microsoft 2011-06-29
[5] 서적 PostScript Language Reference Addison-Wesley Publishing Company
[6] 웹사이트 PostScript Tutorial - Loops http://pscript.dubmu[...]
[7] 웹사이트 OCaml expression syntax http://caml.inria.fr[...] 2013-03-19
[8] 문서 ".. iterator" https://nim-lang.org[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com