반복문(for
문)을 사용한 구간 반복
반복문을 사용하면 반복적으로 처리해야할 일을 컴퓨터에게 빠르게 시킬 수 있습니다. 이번 강의는 반복문의 첫 번째인 for
문(for 루프)에 대해서 알아보겠습니다.
> // `for` 문(for 루프): 초기식부터 조건식을 만족하는 동안 실행문을 실행하고 증감식을 진행
TIP
for
문은 영어로 for statement로 표현합니다. 박용준 강사의 강의에서는 for
문 또는 for 반복문으로 표현합니다.
for
문으로 반복하기
for
문은 특정 구문을 여러 번 반복(Iteration)해서 실행할 때 사용됩니다. for
문의 형식은 다음과 같습니다. 일반적으로, for
문을 말할 때 for
루프(Loop)라고 말합니다.
for (초기식; 조건식; 증감식)
{
실행문;
}
for
문은 초기식부터 조건식까지 증감식 크기만큼 증가 또는 감소를 시키면서 작업 명령문을 반복하여 실행합니다. 말이 조금 어렵죠? 걱정하실 필요없이 실제 사용 가능한 코드를 여러 번 반복하다보면 금방 이해할 수 있습니다. 이 강의의 글이 어렵게 느껴지면 그냥 쭉 읽어보면서 넘어가도 전혀 문제가 되지 않습니다. 중요한 것은 소스는 반드시 타이핑 후 결과를 본 후 그리고 나서 내용을 이해하려고 노력해야한다는 점입니다.
참고로, for
문을 순서도로 표현해보면 다음과 같습니다.
그림: for
문 순서도
for 문 순서도 - for 문(for loop) 순서도(flowchart)
for loop 순서도: 기능에 초점
프로그래밍 관련 자격증 시험에서는 for 문의 범위를 명확히 나타내기 위해 다음과 같은 순서도가 자주 사용됩니다.
이 형태는 제가 집필한 정보처리 실기 관련 책에서도 활용되었습니다.
for statement 순서도: 흐름에 초점
for 문의 진행 흐름을 중심으로 표현할 때는 아래와 같은 형태를 사용합니다.
특히, 조건식이 마지막으로 이동하면 for 문은 while 문과 유사한 흐름으로 바뀌게 됩니다.
for 문 순서도 간략 표현: 의미에 초점
아래는 제가 집필한 C# 교과서에서 사용한 for 문 순서도의 간략화된 표현입니다.
이 순서도의 핵심은 끝 값에 도달했는지 여부를 판단하는 의미를 강조하는 데 있습니다.
for 문 순서도: 함수 스타일
전체 흐름을 왼쪽에 표현하고, 함수(Function) 기능 또는 서브 프로시저 역할을 오른쪽에 추가하여 잠시 이동하는 형태로 for 문 순서도를 그릴 수 있습니다.
이 표현법은 최근 제가 가장 선호하는 방식입니다.
반복문(for
문)을 사용하여 구간 반복하기 의사 코드
다음 코드 조각들은 for
문 사용전에 미리 보기 형태로 C# Interactive에서 미리 타이핑 후 결과를 확인해 보세요.
> var result = "";
> for (var i = 0; i < 3; i++)
. {
. result += "Hello\n";
. }
>
> result
"Hello\nHello\nHello\n"
> var result = "";
>
> for (var i = 1; i <= 3; i++)
. {
. result += "Hello\n";
. }
>
> result
"Hello\nHello\nHello\n"
> var result = "";
>
> for (var i = 0; i < 3; i++)
. {
. result += "Hello " + (i + 1) + "\n";
. }
>
> result
"Hello 1\nHello 2\nHello 3\n"
> var sum = 0;
>
> for (var i = 1; i <= 100; i++)
. {
. sum += i;
. }
>
> sum
5050
>
> var sum = 0;
>
> for (var i = 1; i <= 100; i++)
. {
. if (i % 2 == 0)
. {
. sum += i;
. }
. }
>
> sum
2550
for
문을 사용하여 "안녕하세요." 3번 출력하기
for
문을 사용하여 반복해서 출력하는 내용을 다루어 보겠습니다.
참고로 Visual Studio 편집기에서 for
입력 후 탭 키를 두 번 입력하면 자동으로 for
문에 대한 코드 조각을 생성해줍니다.
코드: ForDescription.cs
using System;
class ForDescription
{
static void Main()
{
// for (초기식;조건식;증감식) { }
for (int i = 0; i < 3; i++) // i가 0, 1, 2일 때
{
Console.WriteLine("안녕하세요."); // 안녕하세요 출력
}
}
}
안녕하세요.
안녕하세요.
안녕하세요.
for (초기식;조건식;증감식) {}
형태의 구문에 "안녕하세요."를 출력하는 코드를 넣어서 3번 출력하는 구문입니다.
실행 순서를 정리해보면 다음과 같습니다.
int i = 0;
초기식 할당0 < 3;
비교하여true
가 되어for
문 진입Console.WriteLine("안녕하세요.");
출력i++;
를 실행하여i
변수 1 증가1 < 3;
비교하여true
가 되어for
문 다시 진입Console.WriteLine("안녕하세요.");
다시 출력i++;
를 실행하여i
변수 1 증가2 < 3;
비교하여true
가 되어for
문 다시 진입Console.WriteLine("안녕하세요.");
다시 출력i++;
를 실행하여i
변수 1 증가3 < 3;
비교하여false
가 되어for
문 종료
참고로, 이 강의 부록의 "디버거 사용하기" 내용을 참고하여 F11 키를 여러 번 눌러가면서 for
문의 진행 순서를 하나씩 살펴볼 수 있습니다.
for
루프를 사용하여 1부터 5까지 출력하기
이번에는 for
루프를 사용하여 1부터 5까지 출력해 보도록 하겠습니다.
코드: For.cs
> // 1부터 5까지 1씩 증가 => 5번 반복
> for (int i = 1; i <= 5; i++)
. {
. Console.WriteLine("Count: {0}", i);
. }
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
for (int i = 1; i <= 5; i++)
코드 형태에 의해서 1부터 5까지 1씩 증가하여 총 5번을 반복하여 출력문을 실행합니다.
이때 i
의 값은 1부터 5까지 출력됩니다.
0부터 4까지 2씩 증가시키기
for
문의 증감식 영역은 기본 값은 1씩 증가를 합니다. 만약, 2씩 증가를 시키려면 i = i + 2
형태로 지정하면 됩니다.
코드: ForIncrement.cs
> // 0부터 4까지 2씩 증가
> for (int i = 0; i < 5; i = i + 2)
. {
. Console.WriteLine(i); // 0, 2, 4
. }
0
2
4
for
문의 증감식 영역에 i++
대신에 i = i + 2
형태를 지정해서 i
의 값을 2씩 증가시킬 수 있습니다.
코드의 실행 순서를 한번 살펴보겠습니다:
- 반복문이 시작될 때,
i
는 0입니다. i < 5 (0 < 5)
라는 조건이 참이므로{}
내의 코드가 실행되며,Console.WriteLine(i)
로 인해 0이 출력됩니다.- 그 다음으로
i = i + 2
가 실행되어i
에 2를 더한 값을 다시i
에 대입합니다. 그러면i
의 값은 이제 2가 됩니다. - 다시
i < 5
를 체크합니다.i
가 2이므로 이는 여전히 참입니다. 따라서Console.WriteLine(i)
가 실행되고 2가 출력됩니다. i = i + 2
가 다시 실행되고i
는 이제 4가 됩니다.i < 5
를 다시 체크하면 여전히 참이므로Console.WriteLine(i)
가 실행되고 4가 출력됩니다.i = i + 2
가 다시 실행되고i
는 이제 6이 됩니다.- 이번에는
i < 5
를 체크하면 거짓이므로{}
내의 코드는 실행되지 않고, 반복문은 종료됩니다.
1부터 3까지의 합계 구하기
이번에는 for
문을 사용하여 변수 i
를 1부터 3까지 반복하여 합계를 구하는 방법에 대해 알아봅니다.
다음은 1부터 3까지의 합계를 구하는 C# 코드입니다:
코드: ForSum.cs
> int n = 3;
> int sum = 0;
>
> for (int i = 1; i <= n; i++)
. {
. sum = sum + i; // SUM
. }
>
> $"1부터 {n}까지의 합: {sum}"
"1부터 3까지의 합: 6"
for
문을 사용하면 지정된 범위의 수의 합계를 쉽게 구할 수 있습니다. 이 예제에서는 1부터 3까지의 수를 sum
변수에 누적하여 합계를 구합니다. sum = sum + i;
라는 코드는 sum += i;
로 간단히 줄여서 표현할 수 있습니다.
짝수의 합계 구하기
이번에는 지정된 범위의 수 중에서 짝수의 합계만 구하는 예제를 다루어 보겠습니다.
코드: ForSumEven.cs
//[?] 1부터 n까지 정수 중 짝수의 합을 구하는 프로그램
using System;
class ForSumEven
{
static void Main()
{
int n = 5;
int sum = 0;
for (int i = 1; i <= n; i++) // n == 5이므로 i가 1, 2, 3, 4일 때
{
if (i % 2 == 0) // 모든 숫자를 2로 나누었을 때 0과 같으면 짝수
{
sum += i; // 짝수만(2, 4) 더하기
}
}
// 1부터 5까지 짝수의 합: 6
Console.WriteLine($"1부터 {n}까지 짝수의 합: {sum}");
}
}
1부터 5까지 짝수의 합: 6
for
문으로 1부터 5까지 반복을 하면서 다시 if
문을 사용하여 짝수(2로 나누었을 때 0)일 때에만 i
의 값을 누적하여 합계를 구할 수 있습니다.
1부터 100까지 정수의 합계 구하기
이번에는 1부터 100까지 정수의 합을 구하는 방법을 알아보겠습니다.
코드: SeeSharpSum100.cs
//[?] 1부터 100까지 정수의 합계 구하기
using System;
class SeeSharpSum100
{
static void Main()
{
//[1] Input(입력)
int sum = 0;
//[2] Process(처리)
for (int i = 1; i <= 100; i++) // i가 1에서 100까지 100번 반복
{
sum += i; // sum = sum + i; // 누적(SUM)
}
//[3] Output(출력)
Console.WriteLine("1부터 100까지 정수의 합: {0}", sum); // 5050
}
}
1부터 100까지 정수의 합: 5050
사람이 직접 수작업으로 1부터 100까지의 정수의 합계를 구하려면 시간이 많이 필요합니다. 하지만, 컴퓨터를 사용하여 프로그래밍을 하게 되면 아주 빠른 시간에 구할 수 있습니다. 1부터 1,000까지 또는 1부터 10,000까지도 for
문의 조건식만 바꾸면 바로 구할 수 있습니다.
숫자를 증가시키거나 감소시켜 출력하기
for
문에 대한 일반적인 코드 모양은 0번째 인덱스부터 특정 값까지 증가하는 모양인데, 다음 코드처럼 그 반대로 값을 감소시켜가면서 반복을 진행할 수 있습니다. for
문에 대한 모양은 이처럼 다양하게 사용될 수 있습니다.
자, 그러면 for
문을 사용하여 숫자를 증가시키거나 감소시키는 방법을 알아보겠습니다.
코드: ForDemoCountDown.cs
> //[1] i 변수의 값이 0, 1, 2, 3, 4로 증가
> for (int i = 0; i < 5; i++)
. {
. Console.Write($"{i + 1}\t"); // 탭(\t)으로 간격 띄우기
. }
1 2 3 4 5
>
> //[2] i 변수의 값이 5, 4, 3, 2, 1로 감소
> for (int i = 5; i > 0; i--)
. {
. Console.Write($"{i}\t");
. }
5 4 3 2 1
일반적인 경우에는 0부터 인덱스 변수가 시작합니다. 초기식에서 i
의 값을 5로 설정한 후 조건 판별 후 증감식에서 i--
코드 형태로 지정하면 5부터 하나씩 감소하면서 반복을 진행합니다.
1부터 100까지 짝수의 합 구하기
이번에는 1부터 100까지 짝수의 합을 구하는 방법을 알아보겠습니다.
코드: ForEven.cs
// 1부터 100까지 짝수의 합을 구하는 프로그램
using System;
class ForEven
{
static void Main()
{
//[1] Input
int sum = 0;
//[2] Process : 주어진 범위(`for` 문)에 주어진 조건(if 문)
for (int i = 1; i <= 100; i++)
{
if (i % 2 == 0) // 짝수만 필터링
{
sum += i; // 짝수일 때만 합 구하기
}
}
//[3] Output
Console.WriteLine($"1부터 100까지 짝수의 합: {sum}");
}
}
1부터 100까지 짝수의 합: 2550
프로그래밍에서 알고리즘은 주어진 문제를 해결하는 절차를 의미합니다. 일반적인 알고리즘은 입력(Input), 처리(Process), 출력(Output)의 절차를 가집니다. 1부터 100까지 짝수의 합을 구하려면 1부터 100까지의 범위와 짝수라는 조건이 필요한데 이를 각각 for
문과 if
문을 사용하여 처리할 수 있습니다.
반복문과 연산자와 함께 사용하면 여러 형태로 값을 출력할 수 있습니다.
코드: ForDemo.cs
using System;
class ForDemo
{
static void Main()
{
//[1] 1부터 5까지 3개씩 출력하는 프로그램
for (int i = 1; i <= 5; i++)
{
Console.Write("{0}\t", i);
if (i % 3 == 0)
{
Console.WriteLine();
}
}
Console.WriteLine();
//[2] 1~100까지 정수의 합을 구하는 프로그램
int sum1 = 0; // 합을 저장할 변수
for (int i = 1; i <= 100; i++)
{
sum1 += i; // 누적
}
Console.WriteLine($"1부터 100까지의 합 : {sum1}");
//[3] 1~100까지 정수 중 짝수의 합을 구하는 프로그램
int sum2 = 0;
for (int i = 1; i <= 100; ++i)
{
if (i % 2 == 0)
{
sum2 += i; // 짝수만...
}
}
Console.WriteLine($"1부터 100까지의 짝수의 합 : {sum2}");
}
}
1 2 3
4 5
1부터 100까지의 합 : 5050
1부터 100까지의 짝수의 합 : 2550
코드는 총 3개의 예제로 구성되어 있습니다.
- 1부터 5까지의 정수를 출력하되, 3개의 숫자가 출력된 후 줄바꿈을 실행하는 예제입니다.
- 1부터 100까지의 정수의 합을 구하는 예제입니다.
- 1부터 100까지의 정수 중에서 짝수만의 합을 구하는 예제입니다.
for
문을 사용하여 별표 기호로 삼각형 만들기
이번에는 2개의 for
문을 사용하여 특정 문자열을 반복해서 출력하는 내용을 다루어 보겠습니다.
코드: ForTriangle.cs
using System;
class ForTriangle
{
static void Main()
{
// 행 반복
for (int i = 1; i <= 5; i++)
{
// 열 반복
for (int j = 1; j <= i; j++)
{
Console.Write("*");
}
Console.WriteLine();
}
}
}
*
**
***
****
*****
바깥 쪽 for
문은 일반적으로 세로 행을 반복하는데 사용됩니다. 그리고 안 쪽 for
문은 가로 열을 반복할 때 사용됩니다.
무한 루프
프로그래밍에서 무한 루프(Infinite Loop)는 루프가 멈추지 않고 계속 실행하여 프로그램이 종료하지 않음을 말합니다. 잘못 작성된 코드에 의해서 무한 루프가 발생하면 프로그램에 심각한 문제가 발생합니다.
다음 코드를 작성 후 실행하면 무한 루프가 발생하여 "무한 루프" 문자열을 계속해서 출력됩니다.
명령 프롬프트에서 무한 루프를 종료하려면 "닫기" 버튼을 클릭하거나 단축키로 Ctrl + C를 눌러 종료할 수 있습니다.
코드: InfiniteLoop.cs
using System;
class InfiniteLoop
{
static void Main()
{
// 무한 루프
for ( ; ; )
{
Console.WriteLine("무한 루프");
}
}
}
무한 루프
무한 루프
무한 루프
무한 루프
^C
위 실행 결과는 4개만 실행된 모양으로 보여지지만 실제로는 강제로 종료하기 전까지는 무한 루프 문자열이 계속 출력됩니다.
for
문을 사용하여 1부터 4까지의 팩토리얼 값을 출력하는 프로그램
이번에는 약간 복잡한 수학의 팩토리얼 값을 구하는 예제를 다루어 보겠습니다. 팩토리얼이란 1부터 양의 정수 n까지의 정수를 모두 곱한 것을 말합니다. 1~4의 팩토리얼 값이라면 1 * 2 * 3 * 4의 결괏값인 24가 나옵니다.
다음 내용을 Visual Studio에 입력하고 실행해 보세요.
코드: ForFactorial.cs
// `for` 문을 사용하여 1부터 4까지의 팩토리얼 값을 출력하는 프로그램
using System;
class ForFactorial
{
static void Main()
{
int fact = 0;
for (int i = 1; i <= 4; i++)
{
Console.Write($"{i}! -> ");
fact = 1; // 1로 초기화
for (int j = 1; j <= i; j++)
{
fact = fact * j; // 1 * (1 * 2 * 3 * 4)
}
Console.WriteLine($"{fact,2}");
}
}
}
1! -> 1
2! -> 2
3! -> 6
4! -> 24
팩토리얼을 구하는 방법은 굉장히 많이 있는데요. 가장 단순한 형태로 fact
변수에 1부터 n
까지의 정수의 값을 곱해서 누적하는 방법이 있습니다. $"{fact,2}"
코드 형태를 사용하여 2자릿수를 잡고 숫자를 출력하고 있습니다.
이 예제에 대한 강의는 다음 영상을 참고하세요.
5. 구구단을 가로로 출력하기
for
문을 2개 사용하는 예제를 소개하고자 합니다. 프로그래밍 학습시 가장 많이 사용되는 구구단 프로그램을 세로로 출력하는게 아닌 가로로 출력하는 프로그램을 다음과 같이 작성해 볼 수 있습니다.
구구단을 가로로 출력하는 프로그램을 만들어보겠습니다.
코드: TimesTable.cs
// 구구단 출력하기
using System;
class TimesTable
{
static void Main()
{
for (int i = 2; i <= 9; i++)
{
Console.Write($"{i,4}단 ");
}
Console.WriteLine();
for (int i = 1; i <= 9; i++) // 행 반복: 구구단 세로 출력
{
for (int j = 2; j <= 9; j++) // 열 반복: 구구단 가로 출력
{
Console.Write($"{j}*{i}={j * i,2} "); // i와 j의 위치를 바꿔서 출력
}
Console.WriteLine(); // 1줄 출력 후 줄바꿈
}
}
}
2단 3단 4단 5단 6단 7단 8단 9단
2*1= 2 3*1= 3 4*1= 4 5*1= 5 6*1= 6 7*1= 7 8*1= 8 9*1= 9
2*2= 4 3*2= 6 4*2= 8 5*2=10 6*2=12 7*2=14 8*2=16 9*2=18
2*3= 6 3*3= 9 4*3=12 5*3=15 6*3=18 7*3=21 8*3=24 9*3=27
2*4= 8 3*4=12 4*4=16 5*4=20 6*4=24 7*4=28 8*4=32 9*4=36
2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 7*5=35 8*5=40 9*5=45
2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 7*6=42 8*6=48 9*6=54
2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 8*7=56 9*7=63
2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 9*8=72
2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
이 프로그램은 중첩된 for
문을 활용하여, 첫 번째 열에서는 2부터 9까지의 수를 곱하는 단을 반복하고, 각 행에서는 1부터 9까지 곱하는 값을 순차적으로 증가시키며 구구단을 가로로 출력합니다. 결과적으로, 첫 행에는 각 단의 1을 곱한 값이, 두 번째 행에는 2를 곱한 값이 출력되는 식으로, 전체 구구단이 가독성 좋게 가로로 표현됩니다.
6. 장 요약
모든 프로그래밍 언어는 for
문과 같은 반복문을 가지고 있습니다. 컴퓨터는 사람과 달리 연산 처리가 굉장히 빠르기에 반복 사용되어야 하는 부분은 for
문을 사용하여 컴퓨터에게 프로그래밍을 시키면 효율적으로 빠르게 작업을 완료할 수 있습니다. 이러한 for
문과 비슷한 기능을 하는 추가적인 반복문들을 계속해서 학습해 나가도록 하겠습니다.
반복문 퀴즈 및 연습문제
퀴즈
(1) 다음 중 for
문을 사용하여 5번 반복하는 올바른 방법을 모두 고르세요.
a.
for (int i = 0; i < 5; i++)
b.
for (int i = 1; i <= 5; i++)
c.
for (int i = 0; i <= 4; i++)
d.
for (int i = 1; i < 6; i++)
정답: a, b, c, d
위 네 가지 방법 모두 5번 반복합니다.
- a:
i
가 0부터 4까지 반복 (총 5회)- b:
i
가 1부터 5까지 반복 (총 5회)- c:
i
가 0부터 4까지 반복 (총 5회)- d:
i
가 1부터 5까지 반복 (총 5회)
연습문제: 3의 배수 출력하기
다음 소스 코드를 완성하여 1부터 10까지의 정수 중 3의 배수만 출력하는 프로그램을 작성하세요.
코드
using System;
class ForPractice
{
static void Main()
{
for (int i = 1; i <= 10; i++)
{
if (i % 3 == 0)
{
Console.WriteLine(i);
}
}
}
}
실행 결과
3
6
9
정답
int i = 1; i <= 10; i++
해설
for
문 내부에서 if (i % 3 == 0)
조건을 사용하여 i
가 3의 배수일 때만 출력하도록 합니다. 따라서 for
문에서는 1부터 10까지 반복
하는 코드가 필요합니다.