본문 바로가기

IT

C# foreach 와 for 문 LINQ 사용법

 

Foreach 문

 

Foreach 는 컬렉션 (배열, 리스트, 테이블 등)을 반복(iterate) 할 때 사용하는 반복문입니다.


사용법

 

foreach (var item in 컬렉션)
{
    // item을 이용한 처리
}


예제1: 문자열 리스트 반복

 

List<string> fruits = new List<string> { "사과", "바나나", "딸기" };

foreach (string fruit in fruits)
{
    Console.WriteLine(fruit);
}

 

결과 : 사과

          바나나

          딸기


예제2: DataTable의 행 반복

 

DataTable table = new DataTable();
table.Columns.Add("Name");

table.Rows.Add("김희선");
table.Rows.Add("김사랑");

foreach (DataRow row in table.Rows)
{
    Console.WriteLine(row["Name"]);
}

 

결과 : 김희선

          김사랑


 왜 foreach 를 쓰나요?

가독성 ↑ 코드를 더 깔끔하게 쓸 수 있음
실수 ↓ 인덱스를 직접 다루지 않아서 오류 줄임
컬렉션 전용 리스트, 배열, DataTable 등 반복에 적합한 구조에 사용 가능
 
※ foreach VS for

 

반복 방식 항목을 하나씩 순회 인덱스를 사용해 순회
수정 가능 컬렉션 값은 읽기 전용 자유롭게 수정 가능
가독성 더 좋음 조금 복잡할 수 있음
 
for문 예시
 
List fruits = new List { "사과", "바나나", "딸기" };
 
for (int i = 0; i < fruits.Count; i++)
{
    Console.WriteLine(fruits[i]);
}
 
 
※ 요약
키워드설명
foreach 컬렉션(배열, 리스트 등)을 순차적으로 반복
장점 간단하고 안정적, 인덱스 오류 없음
제한 컬렉션 내용을 직접 수정할 수는 없음 (읽기 전용 순회)

 

foreach 안에서 특정 조건일 때만 처리하거나, break, continue 사용법

 

※ 조건문과 함께 쓰기 (if)

 

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

foreach (int num in numbers)
{
    if (num % 2 == 0) // 짝수일 때만 출력
    {
        Console.WriteLine(num);
    }
}

 

결과 : 2

          4

 

※ continue 사용하기

    → 조건을 건너뛰고 다음 항목으로 이동할 때 사용

 

foreach (int num in numbers)
{
    if (num < 3)
        continue; // 3보다 작으면 그냥 넘김

    Console.WriteLine(num);
}

 

결과 : 3

          4

          5

 

※ break 사용하기

  → 조건을 만족하면 반복 자체를 끝냅니다.

 

foreach (int num in numbers)
{
    if (num == 4)
        break; // 4가 나오면 반복 중지

    Console.WriteLine(num);
}

 

결과 : 1

          2

          3

 

※ 실전 예 : DataTable 에서 특정 값만 찾기

 

foreach (DataRow row in table.Rows)
{
    if (row["Name"].ToString() == "김희선")
    {
        Console.WriteLine("김희선 찾음!");
        break;
    }
}

 

※ 요약

if 특정 조건만 처리
continue 현재 항목 건너뛰고 다음으로 이동
break 반복문 즉시 종료

 


 

※ foreach 안에서 데이터 수정 가능할까?

 

사실 foreach 자체 안에서는 컬렉션의 구조(추가/삭제)는 못 바꾸지만,
데이터 자체는 수정할 수 있답니다~
특히 DataTable, List, 배열 등에서는 항목의 값을 바꾸는 건 가능합니다.

 

예제: DataTable의 행 반복

 

foreach (DataRow row in table.Rows)
{
    if (row["Name"].ToString() == "김희선")
    {
        row["Name"] = "김희애";  //  값 수정 가능!
    }
}

 

🔹 DataRow는 참조 타입이라, 내부 값을 자유롭게 수정할 수 있습니다.

 

※ List<T> 의 항목 수정

 

List<int> numbers = new List<int> { 1, 2, 3 };

// 이건 값만 복사되므로 numbers 리스트 자체는 안 바뀜!
foreach (int num in numbers)
{
    int modified = num * 2;
    Console.WriteLine(modified);  // 출력만 바뀜
}

// 이렇게는 수정 가능!
for (int i = 0; i < numbers.Count; i++)
{
    if (numbers[i] < 3)
        numbers[i] *= 10;
}

 

※LINQ 로 조건 필터링하기

LINQ는 컬렉션을 SQL처럼 쉽게 필터링할 수 있게 해주는 기능입니다.

 

예제 : 특정 이름만 찾기

 

var hong = table.AsEnumerable()
                .Where(row => row["Name"].ToString().Contains("홍"))
                .ToList();

foreach (var row in hong)
{
    Console.WriteLine(row["Name"]);
}

 

예제 : List에서 짝수만 가져오기

 

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

var even = numbers.Where(n => n % 2 == 0);

foreach (var n in even)
{
    Console.WriteLine(n);  // 2, 4
}

 

※ LINQ 한눈에 보기

Where 조건 필터링
Select 항목을 변형
OrderBy, OrderByDescending 정렬
First, FirstOrDefault 첫 항목 가져오기
ToList() 결과를 리스트로 변환

 

 

※ 요약

foreach 안에서 수정 DataRow, 배열 등은 값 수정 가능하지만 구조 변경은 불가
List<T>는 for문으로 수정 추천  
LINQ 필터링, 조회, 정렬 등에 아주 유용함

 


 

=> 기호

  • 정식 명칭: 람다 연산자(lambda operator)
  • 읽는 방법: "이렇게 매핑된다 또는 매핑하라" 또는 "이렇게 동작한다 또는 동작하라" 라고 이해하면 됩니다.

※ 기본구조

 

(매개변수) => { 실행 코드 }

 

또는, 코드가 한 줄이면 중괄호 없이 이렇게도 씁니다:

 

(매개변수) => 결과

 

예제 1 : List에서 짝수만 가져오기

 

Func<int, int, int> add = (a, b) => a + b;

Console.WriteLine(add(3, 4));  // 결과

 

 

  • 여기서 (a, b)는 입력
  • =>는 람다 연산자
  • a + b는 결과

예제 2 : LINQ와 함께 사용

 

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

var even = numbers.Where(n => n % 2 == 0);

foreach (var n in even)
    Console.WriteLine(n);  // 결과: 2, 4

 

n => n % 2 == 0
==> "n을 받아서, n이 짝수인지 확인한다"는 의미

 

LINQ 와 사용하는 이유

코드 간결 메서드를 따로 정의하지 않고, 바로 간단하게 쓸 수 있음
LINQ와 찰떡궁합 Where, Select, OrderBy 등과 자주 사용됨
재사용 가능 Func, Action으로 함수처럼 저장 가능

 

※ 요약

=> 람다 연산자: "입력 → 결과" 표현
쓰임 LINQ, 간단한 함수 표현 등
장점 코드 간단, 깔끔, 실무에서도 자주 사용

 


 

Func<int, int, int> add  이건 어떤 형식(타입)을 말하는 걸까요?

 

※ 의미

 

두 개의 int 값을 받아서, 하나의 int 값을 반환하는 함수입니다.

 

Func<입력1타입, 입력2타입, 반환타입>

 

Func<int, int, int> add = (a, b) => a + b;

int result = add(3, 4); // 결과 7

 

예제 : 더 쉬운 예제들

 

Func<string> 매개변수 없음 → string 반환
Func<int, string> int 하나 받고 → string 반환
Func<int, int, bool> int 2개 받고 → bool 반환

 

Func<int, bool> isEven = n => n % 2 == 0;
Console.WriteLine(isEven(4));  결과 true

 

※ 참고 

 

  • Func는 "무언가를 반환"하는 함수
  • Action은 "반환값이 없는 함수" (즉, void)

Action<string> print = msg => Console.WriteLine(msg);
print("감사합니다.");

 

※ 요약정리

 

Func<int, int, int> int 2개 입력 → int 반환하는 함수 형식
add 해당 함수(람다 식)를 담는 변수 이름
장점 메서드 선언 없이, 함수를 변수처럼 만들고 전달 가능

 

개발에 많은 도움 되시길 바래요~^^

 

 

 

'IT' 카테고리의 다른 글

C# SWICH 문 예제  (0) 2025.04.02
C# 델리게이트 이벤트핸들러 사용 예제  (0) 2025.03.28
C# 델리게이트 이해 및 예제  (0) 2025.03.28
C# Clone() 함수 사용법과 예제  (0) 2025.03.25
C# Func 사용법 예제  (0) 2025.03.25