for, foreach, while문은 반복문이라는 공통점이 있지만 사용에 따라서 의도가 달리지기 때문에 어떻게 사용하느냐에 따라서 가독성 측면에서 나쁠 수도 좋을 수도 있으며, 치명적인 오류가 생길 가능성도 낮춰주기도 합니다. 이번 시간에는 각 반복문의 개념과 특징을 살펴보고, 어떤 상황에 사용해야하는지와 유의사항을 알아보겠습니다.
목차
[for문의 개념 및 사용법]
특정 조건이 참인 동안 코드 블록을 반복해서 실행하는 제어 구조입니다. for
루프는 세 가지 구성 요소로 이루어져 있습니다: 초기화식, 조건식, 반복식
- 초기화식: 루프가 시작될 때 한 번 실행되는 부분입니다. 주로 반복을 위한 카운터 변수를 초기화하는 데 사용됩니다.
- 조건식: 각 반복마다 검사되어 루프가 계속될지 여부를 결정합니다. 조건이 참일 경우 루프가 계속됩니다.
- 반복식: 각 반복이 완료된 후 실행되는 부분으로, 보통 카운터 변수를 증가시키는 등의 역할을 합니다.
using System;
class Program
{
static void Main()
{
// 1. 초기화식: 변수 i를 0으로 초기화합니다.
// 2. 조건식: i가 10보다 작을 때까지 루프를 실행합니다.
// 3. 반복식: 각 반복이 완료될 때마다 i를 1씩 증가시킵니다.
for (int i = 0; i < 10; i++)
{
Console.WriteLine("현재 i의 값은: " + i);
}
}
}
using System;
class Program
{
static void Main()
{
int[] numbers = { 1, 2, 3, 4, 5 };
// 배열의 길이를 이용하여 반복합니다.
for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine("현재 숫자는: " + numbers[i]);
}
}
}
위 코드에서 for
루프는 배열 numbers
의 각 요소에 접근하여 해당 요소를 출력합니다. numbers.Length
는 배열의 길이이며, 루프가 배열의 끝까지 실행되도록 합니다.
[for문의 특징]
- 반복 횟수의 지정: 초기화식, 조건식, 반복식을 이용하여 명확하게 반복 횟수를 지정할 수 있습니다.
- 반복 변수의 관리: 루프의 반복 변수를 관리할 수 있어 반복 작업을 제어할 수 있습니다.
- 구조화된 코드: 초기화식, 조건식, 반복식이 한 블록 안에 있어 코드가 구조화되어 있어 가독성이 높습니다.
using System;
class Program
{
static void Main()
{
// 예시 1: 1부터 10까지의 숫자 출력
Console.WriteLine("예시 1: 1부터 10까지의 숫자 출력");
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
}
// 예시 2: 10부터 1까지의 숫자 출력
Console.WriteLine("\n예시 2: 10부터 1까지의 숫자 출력");
for (int i = 10; i >= 1; i--)
{
Console.WriteLine(i);
}
// 예시 3: 2의 배수 출력
Console.WriteLine("\n예시 3: 2의 배수 출력");
for (int i = 2; i <= 20; i += 2)
{
Console.WriteLine(i);
}
// 예시 4: 문자열 반복 출력
Console.WriteLine("\n예시 4: Hello를 5번 반복 출력");
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Hello");
}
}
}
- 첫 번째 예시에서는 1부터 10까지의 숫자를 출력합니다.
- 두 번째 예시에서는 10부터 1까지의 숫자를 출력합니다.
- 세 번째 예시에서는 2의 배수를 출력합니다.
- 네 번째 예시에서는 “Hello”를 5번 반복하여 출력합니다.
[foreach문의 개념]
배열이나 컬렉션과 같은 반복 가능한 요소에 대해 각 요소를 순회하면서 반복 작업을 수행하는 구문입니다. 반복 변수를 사용자가 직접 관리하지 않아도 되기 때문에 코드가 간결하고 가독성이 높습니다.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 예시 1: 배열 순회
int[] numbers = { 1, 2, 3, 4, 5 };
Console.WriteLine("예시 1: 배열 순회");
foreach (int num in numbers)
{
Console.WriteLine(num);
}
// 예시 2: 리스트 순회
List<string> fruits = new List<string>() { "Apple", "Banana", "Orange" };
Console.WriteLine("\n예시 2: 리스트 순회");
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
// 예시 3: 문자열 순회
string message = "Hello, world!";
Console.WriteLine("\n예시 3: 문자열 순회");
foreach (char ch in message)
{
Console.WriteLine(ch);
}
}
}
- 첫 번째 예시에서는 배열을 순회하여 배열의 각 요소를 출력합니다.
- 두 번째 예시에서는 리스트를 순회하여 리스트의 각 요소를 출력합니다.
- 세 번째 예시에서는 문자열을 순회하여 문자열의 각 문자를 출력합니다.
[foreach문의 특징]
- 요소 단위 반복: 배열, 리스트, 문자열 등과 같은 반복 가능한 요소에 대해 요소 단위로 반복합니다.
- 인덱스 사용 없음: 반복 작업을 위해 반복 변수의 인덱스를 명시적으로 사용하지 않습니다. 대신 컬렉션의 각 요소를 직접 순회합니다.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 예시 1: 배열 순회
int[] numbers = { 1, 2, 3, 4, 5 };
Console.WriteLine("예시 1: 배열 순회");
foreach (int num in numbers)
{
Console.WriteLine(num);
}
// 예시 2: 리스트 순회
List<string> fruits = new List<string>() { "Apple", "Banana", "Orange" };
Console.WriteLine("\n예시 2: 리스트 순회");
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
// 예시 3: 문자열 순회
string message = "Hello, world!";
Console.WriteLine("\n예시 3: 문자열 순회");
foreach (char ch in message)
{
Console.WriteLine(ch);
}
}
}
- 첫 번째 예시에서는 배열을 순회하여 배열의 각 요소를 출력합니다.
- 두 번째 예시에서는 리스트를 순회하여 리스트의 각 요소를 출력합니다.
- 세 번째 예시에서는 문자열을 순회하여 문자열의 각 문자를 출력합니다.
요소 단위로 반복 작업을 수행하고, 반복 변수의 인덱스를 직접 사용하지 않습니다.
[while문의 개념]
특정 조건이 참인 동안 코드 블록을 반복해서 실행하는 제어 구조입니다. 반복 작업을 할 동안 반복 횟수를 정확히 알 수 없는 경우에 주로 사용됩니다.
using System;
class Program
{
static void Main()
{
// 예시 1: 1부터 5까지의 숫자 출력
Console.WriteLine("예시 1: 1부터 5까지의 숫자 출력");
int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
i++;
}
// 예시 2: 사용자 입력 받기
Console.WriteLine("\n예시 2: 사용자 입력 받기");
string input = "";
while (input != "exit")
{
Console.Write("명령을 입력하세요 (exit 입력 시 종료): ");
input = Console.ReadLine();
Console.WriteLine("입력된 명령: " + input);
}
}
}
- 첫 번째 예시에서는 1부터 5까지의 숫자를 출력합니다.
while
루프는 변수i
가 5보다 작거나 같을 때까지 반복하며, 각 반복마다i
를 증가시켜 숫자를 출력합니다. - 두 번째 예시에서는 사용자로부터 입력을 받아서 입력이 “exit”이 될 때까지 반복합니다. 사용자가 “exit”을 입력하면 루프가 종료됩니다.
조건식이 참인 동안에만 실행되므로 조건식을 신중하게 설정해야 합니다. 그렇지 않으면 무한 루프에 빠질 수 있습니다. 또한 루프 내에서는 반드시 반복 변수의 값을 변경해줘야 합니다. 그렇지 않으면 루프가 영원히 실행되는 무한 루프가 될 수 있습니다.
[while문의 특징]
- 조건에 따른 반복 실행: 특정 조건이 참인 동안에만 코드 블록을 반복해서 실행합니다.
- 반복 횟수의 불확실성: 초기에 반복 횟수를 정확히 알 수 없는 경우에 주로 사용됩니다.
- 반복 변수의 수동 관리: 반복 변수를 수동으로 관리해야 합니다. 반복 변수를 적절히 업데이트하지 않으면 무한 루프에 빠질 수 있습니다.
using System;
class Program
{
static void Main()
{
// 특징 1: 조건에 따른 반복 실행
Console.WriteLine("특징 1: 조건에 따른 반복 실행");
int count = 0;
while (count < 5)
{
Console.WriteLine("현재 카운트: " + count);
count++;
}
// 특징 2: 반복 횟수의 불확실성
Console.WriteLine("\n특징 2: 반복 횟수의 불확실성");
Random random = new Random();
int target = random.Next(1, 11); // 1에서 10 사이의 임의의 숫자 생성
int guess = 0;
while (guess != target)
{
Console.Write("1에서 10 사이의 숫자를 맞춰보세요: ");
guess = int.Parse(Console.ReadLine());
if (guess < target)
{
Console.WriteLine("너무 작습니다.");
}
else if (guess > target)
{
Console.WriteLine("너무 큽니다.");
}
else
{
Console.WriteLine("정답입니다!");
}
}
// 특징 3: 반복 변수의 수동 관리
Console.WriteLine("\n특징 3: 반복 변수의 수동 관리");
int x = 10;
while (x > 0)
{
Console.WriteLine("현재 x의 값: " + x);
x -= 2; // x를 2씩 감소시킴
}
}
}
- 첫 번째 예시에서는
count
가 5보다 작은 동안에만 카운트 값을 출력하고 증가시킵니다. - 두 번째 예시에서는 임의로 생성된
target
숫자를 맞출 때까지 사용자에게 숫자를 입력받고 힌트를 제공합니다. - 세 번째 예시에서는
x
가 양수인 동안에만x
의 값을 출력하고 2씩 감소시킵니다.
특정 조건이 참인 동안에 반복 실행되는 구조이고, 반복 횟수가 불확실할 때 유용하게 사용됩니다.
[for문과 foreach문 while문의 차이점 비교 및 용도 구분]
for 루프:
- 특징: 반복 횟수를 명시적으로 지정할 수 있으며, 반복 변수를 사용하여 반복을 제어합니다.
- 사용 용도: 반복 횟수가 명확하게 정해져 있는 경우에 주로 사용됩니다.
foreach 루프:
- 특징: 배열이나 컬렉션과 같은 반복 가능한 요소를 순회할 때 사용됩니다. 반복 변수를 직접 지정하여 요소에 접근합니다.
- 사용 용도: 배열이나 컬렉션과 같은 반복 가능한 요소를 순회하면서 각 요소에 대해 일련의 작업을 수행할 때 사용됩니다.
while 루프:
- 특징: 특정 조건이 참인 동안에만 코드 블록을 반복해서 실행합니다. 초기 반복 횟수가 명확하지 않거나 조건에 따라 반복 횟수가 동적으로 변경되어야 할 때 주로 사용됩니다.
- 사용 용도: 조건에 따라 반복 작업을 계속해야 할 때 사용됩니다.
using System;
class Program
{
static void Main()
{
// for 루프 예시: 1부터 5까지의 숫자 출력
Console.WriteLine("for 루프 예시:");
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
}
// foreach 루프 예시: 배열 순회하여 요소 출력
Console.WriteLine("\nforeach 루프 예시:");
int[] numbers = { 1, 2, 3, 4, 5 };
foreach (int num in numbers)
{
Console.WriteLine(num);
}
// while 루프 예시: 사용자가 'exit'을 입력할 때까지 입력 받기
Console.WriteLine("\nwhile 루프 예시:");
string input = "";
while (input != "exit")
{
Console.Write("명령을 입력하세요 (exit 입력 시 종료): ");
input = Console.ReadLine();
Console.WriteLine("입력된 명령: " + input);
}
}
}
[각 반복문 사용 시 유의사항]
for 루프 사용 시 유의사항:
- 반복 변수의 범위를 벗어나지 않도록 주의해야 합니다.
foreach 루프 사용 시 유의사항:
- 컬렉션이나 배열이 null인지 확인해야 합니다.
- 순회 중에 컬렉션을 수정하면 예기치 않은 결과가 발생할 수 있으므로 수정하지 않는 것이 좋습니다.
while 루프 사용 시 유의사항:
- 조건식이 항상 참 또는 거짓으로 평가되지 않도록 주의해야 합니다. 무한 루프에 빠지지 않도록 조건을 올바르게 설정해야 합니다.
- 루프 내에서 조건을 업데이트하여 종료 조건을 충족시키도록 해야 합니다. 그렇지 않으면 무한 루프에 빠질 수 있습니다.
- 루프를 종료하는 조건을 명확히 설정해야 합니다.
[마무리 글]
반복문만 잘 사용해도 코딩의 반이상은 한것이라는 말이 있듯이 반복문은 그만큼 중요한 문법이자 기초중의 기초입니다. 각각의 특징을 잘 생각하시고 예시코드를 숙지하신 뒤에 용도에 따라서 구분하여 사용하시면 기본기를 다지는 중요한 시간이 되리라 생각합니다. 또한 코딩 시에 반복문을 잘 이용하셔서 코드를 최대한 줄이려는 습관을 가지셔야 협업 시에도 좋으며, 확장성도 자연스럽게 올라가고, 유지보수 하시기에도 쉬울 것 입니다.