비트를 쪼개는 개발자

allen321@naver.com

C#

C# - LINQ(Language Integrated Query)

MozarTnT 2024. 9. 24. 15:39
728x90
반응형

 

 

 

 

 

LINQ(Language Integrated Query)란?

 

  • LINQ는 개발자가 다양한 데이터(컬렉션, 데이터베이스, XML 등)에 대해 일관된 방식으로 쿼리*하고 조작할 수 있도록 지원하는 기능이다.
  • C#에서 LINQ 기능은 .NET 프레임워크의 일부로 제공되며 "using System.Linq;" 구문을 사용하여 System.Linq 네임스페이스에서 제공된다.
  • LINQ는 다양한 데이터 소스에 따라 "LINQ to Objects" (List, Array 등), "LINQ to SQL" (SQL 데이터베이스 쿼리), "LINQ to XML" (XML 데이터 쿼리), "LINQ to DataSet" 등과 같이 여러 확장 기능을 제공한다.
  • 즉 LINQ를 사용하는 이유는 다양한 데이터 소스를 일관적이고 가독성 좋게 접근하기 위해서 사용한다.

 

쿼리(Query)한다는 것은? : 데이터베이스나 데이터 소스에서 원하는 데이터를 조회하거나 조작하기 위해 요청하는 작업

 

 

LINQ의 사용 방식

 

  • LINQ는 데이터를 쿼리하기 위해서 대표적으로 두가지 기능을 제공한다.

 

1. LINQ 쿼리 구문 (Query Syntax)

 

주요 키워드

 

  • from: 쿼리할 데이터를 지정한다.
  • where: 필터링 조건을 지정한다.
  • select: 반환할 데이터를 지정한다.
  • orderby: 데이터를 정렬한다.
  • group by: 데이터를 그룹화한다.
  • join: 두 컬렉션을 조인한다.

 

기본적인 구조 예시

 

var adultStudents = from student in students
                            where student.Age >= 20
                            select student.Name;

 

 

"from student in students" : 데이터를 조회할 컬렉션(Students)을 지정하고, 각 항목을 가리킬 변수(student)를 정의하는 부분

 

"where student.Age >= 21" :  필터링 조건(where)을 정의한다, student의 나이가 20 이상인 경우만 선택된다는 의미

 

"select student.Name" : 반환할 데이터를 정의한다, student 객체의 Name 속성만을 반환하겠다는 의미

 

요약하자면

  1. students 리스트에서 각각의 학생을 순회하면서(from student in students),
  2. 그 학생의 나이가 20 이상인지 확인하고(where student.Age >= 21),
  3. 나이가 20 이상인 학생들의 이름만 반환(select student.Name)하는 작업을 수행하게 된다.

즉, 최종적으로 나이가 21세 이상인 학생들의 이름만을 포함한 리스트를 반환하기 위한 LINQ 쿼리 구문이다.

 

 

 

 

 

2. LINQ 메서드 구문 (Method Syntax)

 

 

 

주요 메서드

  • Where(): 필터링 조건을 지정한다.
  • Select(): 반환할 데이터를 지정한다.
  • OrderBy(): 데이터를 오름차순으로 정렬한다.
  • OrderByDescending(): 데이터를 내림차순으로 정렬한다.
  • GroupBy(): 데이터를 그룹화한다.
  • Join(): 두 컬렉션을 조인한다.

 

 

기본적인 구조 예시

 

var adultStudents = students
                    .Where(s => s.Age >= 20)
                    .OrderBy(s => s.Age)
                    .Select(s => s.Name);

 

 

"Where(s => s.Age >= 21)" : 조건에 따라 데이터를 필터링하는 메서드, 학생 객체 s의 Age 속성이 21 이상인 경우에만 해당 항목을 선택한다는 의미이다.

 

"OrderBy(s => s.Age)" : 데이터를 정렬하는 메서드, OrderBy는 컬렉션의 데이터를 오름차순(나이가 어린순)으로 정렬한다. 

"if) 내림차순으로 정렬하고 싶다면 OrderByDescending 키워드를 사용"

 

"Select(s => s.Name)" : 데이터를 변환하거나 추출하는 메서드, 여기서 s => s.Name은 각 학생 객체의 Name 속성만을 반환하겠다는 의미 

 

 

요약하자면

  1. Where: 학생 목록에서 나이가 21 이상인 학생을 필터링한다 (Where(s => s.Age >= 20) 
  2. OrderBy: 필터링된 결과를 나이에 따라 오름차순으로 정렬한다 (OrderBy(s => s.Age))
  3. Select: 정렬된 결과에서 학생의 이름만 선택하여 반환한다 (Select(s => s.Name))

 

 

최종 코드 

 

using System;
using System.Collections.Generic;
using System.Linq;

public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Example
{
    public static void Main()
    {
        // 학생 목록 생성
        List<Student> students = new List<Student>
        {
            new Student { Name = "Alice", Age = 22 },
            new Student { Name = "Bob", Age = 19 },
            new Student { Name = "Charlie", Age = 23 }
        };

        // LINQ 쿼리 구문 사용
        var adultStudentsQuery = from student in students
                                 where student.Age >= 20
                                 select student.Name;

        Console.WriteLine("성인 학생들 (쿼리 구문):");
        foreach (var name in adultStudentsQuery)
        {
            Console.WriteLine(name);
        }

        // LINQ 메서드 구문 사용
        var adultStudentsMethod = students
                                  .Where(s => s.Age >= 20)
                                  .Select(s => s.Name);

        Console.WriteLine("성인 학생들 (메서드 구문):");
        foreach (var name in adultStudentsMethod)
        {
            Console.WriteLine(name);
        }
    }
}

 

 

 

실행 결과

 

 

 

 

쿼리 구문과 메서드 구문의 차이점

 

 

특징 쿼리 구문 메서드 구문
표현 방식 SQL과 유사한 선언적 구문 메서드 체인과 람다식을 사용
가독성 복잡한 쿼리에서 가독성이 좋은 편 람다식을 알아야 이해하기 편함
유연성 제공된 키워드를 사용하여 작성 여러 확장 메서드 사용 가능
사용 가능 범위 일부 연산에서 제한되는 부분이 발생함 (ex : Join) LINQ의 모든 연산자 사용 가능
결과 타입 IEumerable<T> 반환 IEumerable<T> 반환

 

 

사용 기준

  • 쿼리와 메서드 어떠한 구문을 사용해도 리턴 받는 결과는 비슷하다. 
  • 개발자가 친숙한 구문을 사용하여 데이터에 접근해도 좋지만 메서드 구문이 상대적으로 복잡한 작업에서 유연한 경우가 많다.
  • SQL이 익숙한 개발자라면 쿼리 구문을, 함수형 프로그래밍에 익숙한 개발자라면 메서드 구문 사용이 편리하다.

 

 

 

C#에서 LINQ가 제공하는 기능은 정말 다양하다.

 

아래의 MS 공식 사이트에서 다양한 LINQ의 기능과 사용 예시 및 작성법이 정의되어 있으므로 참고해도 좋다.

 

https://learn.microsoft.com/ko-kr/dotnet/csharp/linq/get-started/features-that-support-linq

 

LINQ를 지원하는 언어 기능 - C#

LINQ 쿼리 및 기타 컨텍스트에서 사용할 C# 기능에 대해 알아봅니다.

learn.microsoft.com

 

 

 

최종 정리

 

  • LINQ (Language Integrated Query)는 C#에서 다양한 데이터(컬렉션, 데이터베이스, XML 등)를 쿼리하고 조작할 수 있는 기능이다.
  • LINQ는 쿼리 구문메서드 구문 두 가지 방식으로 사용할 수 있다.
  • Where, Select, OrderBy 등 다양하고 편리한  쿼리 연산자를 제공한다.
  • LINQ를 사용하면 데이터 처리 로직을 간단하고 직관적으로 구현할 수 있는 편리한 기능이다.

 

 

 

 

사진 출처 : https://www.tutorialsteacher.com/linq/what-is-linq

728x90
반응형