ABOUT ME

-

  • 데이터처리를 쿼리로!? (1)
    Programming/C# 2019. 3. 5. 21:57

    안녕하세요. 간단하게 따라할 수 있는 예제를 만드는 HDH입니다!


     어느정도 프로그래밍에 익숙한 개발자라면, C#과 Java가 문법적인 부분을 제외하면 흡사한 부분이 매우 많다는 것을 알고 계실 겁니다. 이것의 단편적인 예시로 C#을 배운 사람이라면 Java를 배우기 어렵지 않고, Java를 배운 사람이라면 C#을 배우기에 수월합니다. 


     간혹 어떤 사람들은 Java와 C#을 두고 밴 다이어그램을 그려 볼 때 ( AB == A∪B ) 라고 말씀하시는 분들도 있습니다. 그러나, 데이터 처리에 있어서는 Java보다 훨씬 효율적으로 처리할 수 있는 기능이 C#에 있습니다. Java도 뒤늦게 따라하긴 했지만, 뱁새가 황새 따라가다 가랭이 찢어진 꼴이 되어 버렸죠. 대체 뭐길래 그럴까요? 


    들어본 적은 있지만 써 본적은 없는 것, LINQ

     C#을 학습해 보신 분이라면 LINQ라는 단어는 한번 이상 들어보셨을 거라고 예상합니다. 하지만 이게 무엇인지, 정확히 어떤 기능인지 자세히 알고 있는 분들은 많지 않습니다. 많은 사람들이 이 기술의 필요성을 크게 느끼지 못하기 때문이죠. 하지만 한번 써 본 사람이라면 이 기술만 활용한다고 합니다. 왜 그런지 지금부터 알아보겠습니다.


    LINQ...? 그게 뭡니까..?

     대량의 데이터를 처리하는 부분에 있어서 자료구조는 굉장히 중요한 기반 지식입니다. 하지만 자료구조를 잘 활용하기 위해서는 그만큼 머리를 쥐어짜야 하고 자칫하면 비 효율적인 알고리즘으로 인해 엄청난 리소스 낭비로 이어질 수 있기 때문에 설계부터 착실히 하는 것이 굉장히 중요합니다. 저도 학부생 시절 알고리즘을 설계에 귀찮음을 느껴 그냥 데이터베이스에 때려박아 두고 SQL 쿼리로 처리하고 싶은 생각이 무지하게 많이 들었습니다. 

     그런데 이게 현실로 가능하다면 믿으시겠습니까? 어플리케이션 단위에서의 데이터 처리를 자료구조나 알고리즘으로 처리하지 않고 데이터베이스 쿼리처럼 활용할 수 있다면 대량 또는 세세한 데이터 처리 시에 작업량이 굉장히 줄어들 수 있습니다. 심지어 연산 속도까지 빠르다면, 쓰지 않을 이유가 없습니다. 이것을 가능하게 하는 것이 LINQ (Language-Integrated Query) 입니다.


    데이터를 데이터베이스처럼 쿼리를 활용해 처리한다.

     데이터를 SQL 쿼리처럼 활용하려면 우선 처리할 대상 데이터가 있어야 합니다. 처리할 대상 데이터는 배열이나 컬렉션으로 생성되어 있을 때, 쿼리를 사용하여 나온 결과를 또 다른 컬렉션에 저장할 수 있습니다. 바로 예제를 통해 활용 방법을 알아 보겠습니다. 간단하게 배열에서 짝수를 추출해 내림차순으로 출력하는 예제입니다.  백문여불여일타. 백번 보고 듣는 것보다 한번 쳐 보는게 낫습니다.


    예제 코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int[] numbers = { 135792468 ,0 };
     
    var queryResult =
        from num in numbers
        where num % 2 == 0
        orderby num descending    //descending, descending
        select num;
     
    foreach (var value in queryResult)
        Console.Write(value.ToString() + " ");
    cs


    출력 결과

    8 6 4 2 0 



    코드는 간단합니다. L-Value에 결과를 담을 배열 또는 컬렉션을 지정하고 R-Value에 from 이후의 SQL 쿼리 구문을 작성하면 됩니다.

    즉, Select 쿼리와 동일하게 작동하되, L-Value는 Select [TARGET_COLUMN]에 해당하고, R-Value는 from [TARGET_TABLE] where [CONDITION]에 해당된다고 볼 수 있습니다. 이와 같은 방법으로 배열, 리스트 등의 데이터를 쿼리와 같은 형식으로 처리할 수 있습니다. OrderBy, GroupBy 등의 구문도 처리 가능합니다.


    조금 특이한 부분이 있다면 마지막에 등장한 select num 부분입니다. 눈치 빠른 분들은 이해 하셨겟지만, 이 부분은 배열에 포함되어 있는 각각의 요소를 순회할 때 순회하는 단일 대상의 이름을 num으로 지정한다는 의미입니다. 예제에서는 이 구문을 통해 배열의 각 요소를 num이라는 변수로 사용한다고 선언하고, where 구문과 orderby 구문에서 조건을 지정하는데에 활용했습니다.



    신기한데..? 그러면 문자열 데이터도? 다른건?

     정수 데이터만 가능한 것이 아닙니다. 문자열 데이터도 가능합니다. 데이터베이스에서 처리 가능한 모든 종류의 데이터 타입을 지원하여 int, float, dateTime 등 많은 데이터 타입에 적용시킬 수 있습니다. 바로 예제를 보도록 하겠습니다.


    예제 코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    string[] words = { "AAA""BBB""CCC""AAB""BBC""CCA" };
     
    var queryResult =
        from word in words
        where word == "AAA" || word.Contains("C")    //OR(||), AND(&&)
        select word;
     
    foreach (var value in queryResult)
        Console.Write(value.ToString() + " ");
    cs

    출력 결과

     AAA CCC BBC CCA


    위의 예제 코드와 비교하여 다른 것이 있다면 2개의 조건이 OR 구문으로 묶여 있다는 것입니다. 본래 SQL문과 동일하게 Where 구문에 2개 이상의 조건을 AND와 OR을 사용하여 결합할 수 있습니다.



    새로워... 늘 짜릿해... 편리한게 최고야...

     어때요, 굉장히 간단하지 않나요? 위의 예제들을 알고리즘으로 처리하기 위해서는 반복 구문과 제어 구문이 불가피하게 필요했을 것입니다. 하지만, LINQ 구문을 통해 굉장히 간단한 코드로 구현되었습니다. 문자열 처리 메서드만 활용하던 사람이 Regex를 학습하면 신세계가 열리던 것처럼, 대량 데이터 또는 조건이 까다로운 데이터를 추출하는 작업에 LINQ를 적용하게 된다면 신세계가 열리게 될 것입니다. 

     이 포스팅에서 다룬 것은 간단한 쿼리이지만, 앞으로 올라올 포스팅에서는 LINQ를 좀 더 세밀하고 전문성 있게 다룰 수 있는 내용들이 추가 될 것입니다. 오늘도 하루 한 줄 코딩. 새로운 지식을 익히신 그대에게 찬사의 박수를 보냅니다. 수고하셨습니다.

    'Programming > C#' 카테고리의 다른 글

    [WPF] WindowChrome !  (0) 2020.03.20
    [WPF] ListView에 UserControl 넣기  (0) 2020.03.20
    Json.NET을 사용해보자!  (0) 2019.04.07
    [WPF] 의존 프로퍼티!?  (0) 2019.03.08
    [WPF] ListView에 데이터를 바인딩 해보자!  (0) 2019.03.07

    댓글

Designed by Tistory.