C++ 반복문 for 루프
목차
C++에서 반복문은 동일한 코드를 일정 조건을 가지고 반복하는 것입니다.
반복문이야 말로 컴퓨터가 인간에 비해 압도적인 능력을 발휘하는 부분입니다. 어떤 문장을 반복하는가? – 를 세밀하게 쪼개 나가다 보면 결국 덧셈과 뺄셈 정도의 가장 기본적인 연산의 반복이라는 것을 알 수 있습니다. 허나 워낙 빠르게 반복하다 보니 훨씬 복잡한 연산도 간단하게 처리하는 것처럼 보이는 것 입니다.
컴퓨터 초창기의 반복문은 좀 원초적입니다. 지금은 특별한 경우가 아니면 사용하지 않는 goto 문을 사용했습니다.
goto문 반복 예제
아래는 goto문 예제입니다. CPU에는 프로그램 카운터라고 하는 다음 명령어가 실행되는 주소를 표시하는 레지스터(CPU의 기억장치)가 있습니다. goto문에 레이블을 설정하면 그 명령어의 실행 주소로 돌아가도록 합니다.
반복을 하기 때문에 앞쪽 명령어로 되돌아 가서 코드를 실행시킵니다. 그런데 이렇게만 해두면 프로그램은 무한반복에 빠져서 바깥으로 나오지 못하게 됩니다. 따라서 중간에 if 문 처럼 조건분기를 걸어두고 바깥의 레이블을 지정하여 루프를 탈출하게 됩니다.
for 루프나 while 루프도 형식은 다르지만 결과적으로 로직은 같습니다. 단지 for 나 while의 문법을 사용하면 goto 문을 사용할 때의 단점이 줄어들게 됩니다.
#include <iostream> using namespace std; int main() { int count = 0; label1: cout << "count: " << count << endl; count++; if (count == 5) goto label2; goto label1; label2: cout << "this is the end" << endl; return 0; }
count: 0 count: 1 count: 2 count: 3 count: 4 this is the end
goto문은 CPU의 프로그램 카운터를 사용하는 방식으로 기계의 입장에서 봤을 때는 문제가 없습니다. 그러나 문제가 되는 것은 인간이 goto 문을 사용했을 때 코드의 가독성이 기하급수적으로 어려워진다는 것을 알았습니다. 일명 스파게티 코드라고 불리는 도무지 이해할 수 없는 코드가 늘어나자 프로그래머들은 goto문을 줄이고 for 문과 while 문을 사용하기 시작합니다. 지금 현대 언어에서는 거의 사용을 하지 않거나 있더라도 goto문을 사용한 코드는 매우 낮게 평가하고 있습니다.
goto 문은 명령어의 순서를 무시하고 프로그램의 실행 위치를 마음대로 설정할 수 있기 때문인데요. 그렇게 해서는 유지보수가 안됩니다. 어떤 몇몇 사람들의 문제라기 보다는 인간의 사고와 기계의 사고가 다르기 때문이라고 이해할 수 있습니다.
for 문과 while 문은 반복(루프)에 특화시켜 등장한 문법입니다.
또 반복문이 두개나 되는 것은 각각 사용 방법의 차이 때문입니다.
for 문 예제
for의 문법은 아래와 같습니다.
for(인덱스 초기화; 조건식 검사; 증감연산자) { 코드블록 }
for ( ) 이 안을 헤드라고 하는데 루프를 돌기위한 모든 조건이 이 안에 다 들어 있습니다.
이 한줄만 보면 프로그래머는 이 코드블록이 얼마나 반복할 것인지 언제 끝날 것인지 쉽게 알 수 있습니다. 보통은 횟수가 정해진 루프를 돌 때 for 문을 사용합니다.
#include <iostream> using namespace std; int main() { for (int i = 0; i < 5; i++) { cout << "index: " << i << endl; } return 0; }
index: 0 index: 1 index: 2 index: 3 index: 4
goto 문과 비교를 해보면 goto 문은 전체적으로 어수선합니다. for 문은 정리가 잘 되있습니다. goto 문처럼 마음대로 제어를 넘길 수 있는 구조가 아닙니다. 조건식의 결과는 true 와 false 두 가지 밖에 없습니다. 코드블록이 언제끝날지 정확하게 예측이 가능합니다.
for 문의 강력함은 반복을 한번이 아니라 수십억번이라도 진행할 수 있다는 점 입니다. for 문의 특성을 잘 이용하면 대량의 데이터의 연산작업도 오래 걸리지 않습니다. 연산에 걸리는 시간은 컴퓨터 하드웨어의 성능과 연산의 특성에 영향을 받지만 인텔 10세대 컴퓨터 정도라면 1초에 수억번도 누산이 가능한 정도입니다. 그러니까 컴퓨터의 엄청난 연산 능력을 제대로 활용할 수 있게 해주는 것이 for 문입니다.
for 문을 배우고 나면 매일 사용하게 될 겁니다.
for 루프의 단계적 처리 과정
문장으로 설명하면 조금 이해하기 편할 것 입니다.
- for 문의 카운터(인덱스)를 초기화
- 조건식을 검사해서 true 면 실행 false 면 루프를 종료
- 코드블록을 실행
- 카운터를 갱신 후 다시 2에 조건식을 검사
for 문은 반복횟수를 알고 있는 경우 주로 사용합니다. 카운터를 증가시키는 방법과 감소시키는 방법 둘 중에 하나를 사용할 수 있습니다.
for 문 피보나치 수열
for 문으로 피보나치 수열을 만들어 보겠습니다.
피보나치 수열은 0과1부터 시작해서 앞의 두숫자를 더하여 새로운 수를 만드는 증가하는 수열입니다. 코드로 구현하면 아래와 같습니다. for 문으로 항의 수를 입력하면 루프를 돌면서 계속 더합니다. 수를 더하고 SWAP(변수를 서로 바꾸는 것)하고 더하고 SWAP 을 반복하다 보면 N의 항까지 이르게 됩니다.
#include <iostream> using namespace std; int main() { int n, a = 0, b = 1, nextTerm = 0; cout << "피보나치 항의 수를 입력하시오. "; cin >> n; cout << "피보나치 수열 : "; for (int i = 1; i <= n; ++i) { // 첫번째 숫자 두개 if (i == 1) { cout << a << ", "; continue; } if (i == 2) { cout << b << ", "; continue; } // swap nextTerm = a + b; a = b; b = nextTerm; cout << nextTerm << ", "; } return 0; }
피보나치 항의 수를 입력하시오. 10 피보나치 수열 : 0, 1, 1, 2, 3, 5, 8, 13, 21, 34,
for 문 팩토리얼(factorial)
팩토리얼은 계승이라고 하며 n! 은 1부터 n까지의 곱입니다. 식으로는 n(n-1)! 이 되며 0!는 1로 정의합니다.
for 루프로 구할 수 있습니다. 각 계승의 값은 배열에 저장합니다. double 자료형이 더 넓은 범위를 사용할 수 있겠지만 long long 형으로도 20!까지는 구할 수 있습니다. 64비트 정수형의 한계가 보입니다.
#include <iostream> using namespace std; const int SIZE = 20; int main() { long long myFactorial[SIZE]; // 팩토리얼 0!과 1!을 1로 설정 myFactorial[0] = 1LL; myFactorial[1] = 1LL; for (int i = 2; i < SIZE; i++) { myFactorial[i] = i * myFactorial[i - 1]; } for (int i = 0; i < SIZE; i++) { cout << i << "! = " << myFactorial[i] << endl; } return 0; }
0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320 9! = 362880 10! = 3628800 11! = 39916800 12! = 479001600 13! = 6227020800 14! = 87178291200 15! = 1307674368000 16! = 20922789888000 17! = 355687428096000 18! = 6402373705728000 19! = 121645100408832000
for 문으로 할 수 있는 계산은 while 문이나 재귀함수(recursive)로도 해결할 수 있습니다. 앞으로 하나씩 알아가 보겠습니다.
요약
C++ 반복문 for 루프의 기본 문법을 알아봤습니다.
문법적인 부분을 익히는 것도 중요하지만 반복한다는 개념은 계속 나오기 때문에 이 반복하는 과정을 세밀하게 컨트롤 하는 법에 대해서 하나씩 하나씩 배워야 합니다.
결국 for 문이라는 하나의 틀 안에서 여러가지 변수들을 접목시켜서 사용하는 방법을 알아야 합니다. for 문 안에서 조건문도 사용하고 함수도 사용할 수 있어야 합니다.
다른 것보다 for 문은 연습을 좀 할 필요가 있습니다.
참고문서
7.9 — For statements | Learn C++ (learncpp.com)
Statements and flow control – C++ Tutorials
요즘 여기 글로 c++ 공부하고 있습니다. 감사합니다.
부족한 내용인데 도움이 되셨으면 좋겠습니다~