PROGRAMMING WORKSHOP

VSTO_13 | 재미있는 LINQ_1

정보화, 자동화프로그래밍의 문제는 항상
모든 종류의 정보를
어떻게 하면 원하는 정보를 찾아 볼수 있을까..finding, searching..
어떻게 하면 원하는 정보들을 모두 뽑아낼까??..filtering.
어떻게 하면 원하는 정보를 요약을 해서 볼수 있울까..grouping..consolidating..pivoting..sub-total
어떻게 하면 원하는 정보만 정렬을 해서 볼수 있을까....sorting..
어떻게 하면 원하는 정보를 내가 보고 싶은 방식으로 재구성할까..formating..
어떻게 하면 외부정보를 갖여다 볼 것인가..Retrieving external datas..etc
이런것들이 또다른 기능에 추가하여 모두 이루어지는 것이 엑셀이기때문에 엑셀은 없어서는
안될 도구 가 된 것이다
이런 것을 수행하기 위하여 순환문을 돌리면서 조건문을 사용하거나..
다양한 수식을 적용하거나 필요한 상황에 따라서 다양한 방법을
동원하게 된다
그러나 외부데이타를 갖여 오는 일을 하는 것에 있어서는 [SQL문]이라는 것을
사용하면 아주 편리하게 원하는 정보를 갖여 오게 된다
그냥 갖여 오는 것도 아니고 분석까지 해가면서 갖여 온다
이 SQL문은 참으로 편리하고 그냥 사람이 원하는 것을 말로 표현하듯이
처리한다
그렇다면 ..사람이라면 이런 생각을 당연히 할 수 있을 것이다
외부데이타뿐만이 아니라 모든 정보(All Kind of datas)를 SQL문으로
처리하듯이 처리할수 없을까????

사람이 말하듯이 썰을 풀면 원하는 정보를 갖여오고..또한 분석을 하면서
갖여오게 하거나, 만들어 내거나 한다면 좋지 않을까???

그래서 태어난것이 신통방통한 .Net FrameWork의 LINQ라는 녀석이면서
Visual Basic의 예약어로서 많은 키워드가 추가되게 되었다

그 LINQ를 이야기 해 가보도록 하자..
다행이 uno-weekly에서 외부데이타갖여오기에서 열심히 연재중인
SQL문과 흡사한 키워드들을 사용하는 LINQ라서 더욱 좋은 기회가 될 것이다
SQL문을 우선 숙달시키고 싶으신 분들은 uno-weekly의 연재물을 반드시
필독하시기 바란다
그럼 이 LINQ 는 거져 먹게 되는 것이니까..
물론 약간의 말투(키워드들)의 순서가 다르고 새로운 형식의 키워드(예약어)들이
있지만 흡사한 것이라서..
이 기회에 SQL 문과 더불어 LINQ를 공략해 보시기 바란다
또한,
SQL 문은 순전이 DataBase 를 다루지만 LINQ는
DataBase뿐만이 아니라 배열, 문자열, 모든 정보가 떼거리로 있는 것은
모두 처리한다는 정말 신통방통이다

Visual Studio에서 (VSTO 에서) 엑셀소루션을 만든다면
엑셀에서 그동한 정보를 다루던 방식에 LINQ 파워를 추가한다면
더더욱 빠른 속도와 효율을 즐기면서 엑셀을 인터페이스로 잘 활용하면
끝내주는 소루션들이 될 것이다

Visual Basic과 .Net FrameWork 에는 너무도 많은 매력적인 것이 많지만
가장 흥미롭다고 생각하는 것은
LINQ라는 녀석이다
uno-weekly에서 엑셀과 데이타베이스에 열성을 보이는 이유는 바로
이 LINQ라는 것을 의식해서 이다
LINQ는 Language-Integrated Query 의 약자다
말 그대로 [프로그래밍언어에 통합된 쿼리]라는 소리다
정보를 다루기 위한 언어중에 SQL언어가 있다..
말하듯이 데이타베이스에서 정보를 Query 해 오는 문자열로 구성된
구문.. 파워풀한 도구이고 이런 형식을 좀더 발전시켜서 데이타베이스뿐만 아니라
모든 정보덩어리에서 원하는 것만을 쉽게 뽑아서 보고 싶은 결과물이다
그냥 쌤플을 하나 해보는 것이 좋을 것이다
아래에 문자열 정보가 있다..
문자열 정보란 하나의 문자(Char)가 집합된 이것도 하나의
정보의 집합체라고 볼수 있을 것이고..
집합적으로 모여있는 정보를 때려잡는 것이 LINQ인것이다
문자와 숫자가 섞여있는 것중에서 숫자만 뽑아보는 작업이다

Sub LINQTest()
Dim sDummyString As String = "AQC12DE99F-J74-12-89A3"

Dim myQry =From X In sDummyString  _
                 Where (Char.IsDigit(X))  _
                 Select X
                 
For Each Q As Char In myQry
    MsgBox(Q)
Next
End Sub

위에서 LINQ 쿼리한 결과물이 myQry 라는 변수에 담기게 되는데
이 결과물 변수도 결국은 또 다른 오브젝트가 된다
죽기살기로 오브젝트로 처리하는 습관을 갖여야 Visual Basic, .Net FrameWork와
친해진다..



myQry에 쩜을 찍으면 Intellisense기능에 의하여 오브젝트의
자원이 줄줄이 나오는 것을 볼수 있고..이것은 모든 것을 오브젝트화시켜서
편리하게 다음 작업을 할수 있는 것들이다

위의 것을 Visual Basic 에서 실행 시켜보시기 바란다
문자열정보 sDummyString는 숫자와 문자가 섞인 정보의 덩어리다
즉 하나,하나의 문자입장에서는 정보들인 것이다
이것을 하나,하나 검토해서 숫자만 뽑아낸 것이 myQry라는 오브젝트에
집합되고..이 오브젝트를 순환하면서
myQry에 커서를 갖다 놓으면 아래그림과 같이 어떤형식의 오브젝트인지
볼수 있다



위의 빨강색 글씨가 바로 LINQ인 것이다
SQL언어를 보신분은..어라!@! SQL 문이나 똑같네...별로 어렵지 않다..
혹은..에이 이럴줄 알았으면 SQL 문에 좀 관심을 갖었을껄...#@!

SQL문과 거의 같은 요령이니까..
관심이 있으신 분들은 우선 엑셀과 데이타베이스를 연결하는 SQL 언어를
숙달 시키면 기초가 다 잡힌 셈이 되는 것이다
위의 LINQ는 그야말로 정보관리의 만병통치약이다!!

위의 LINQ를 해석해보면
sDummyString이라는 문자열오브젝트에서 하나,하나의 문자가(Char오브젝트)
숫자이면 Char.IsDigit(X) 즉 Char오브젝트이 IsDigit메소드는 숫자인지
아닌지를 알려 내준다..
그러니 숫자인것만 Select 하라!!!라는
약속된 몇개 안되는 영어단어의 주절거림 자체가 프로그래밍인 것이다

그렇게 뽑아낸 것을 myQry라는 변수에 담아라!!라는 것이다
myQry는 Dim 하면서 오브젝트타입을 결정하지 않는다
LINQ의 결과에 따라서 오브젝트타입이 결정되는 것이다
위의 그림에서 보듯이 어떤 타입이 될지 나타나니 편리한 것이다
이렇게 뽑아낸 것을 국을 끓여 먹든지 찌게를 끓여 먹든지
알아서 하면 된다
위에서는 순환하면서 MsgBox에 보여주도록 한 것이고..
워크시트에 뿌려줄수도 있는 것이고

이제 타입을 바꾸어서 하나 또 해보면

또 아래와 같이 배열도 역시 정보의 집합체이다
정보가 집합적으로 되어 있는 것은 몽주리...LINQ의 밥이다
아래와 같이 배열을 선언하고 배열을 LINQ로 처리하여 원하는 정보집합을
myResult 변수에 얻는다

Dim iQ() As Integer = New Integer() {100, 200, 300, 400, 500, 600, 700, 800}
Dim myResult = From G In iQ _
                    Where (G >= 300) _
                    Order By G Descending _
                    Select G
For Each z As Integer In myResult
     MsgBox(z)
Next
 
 

결과는 300이상이 되는 요소를 찾아서
이것을 또 내림차로 정렬된 정보집합을
myResult에 보낸다

이렇게 받은 것을 사용하면 되는 것이다
각자 갖고 있는 VB.Net 도구에서 실행을 해보시면 될 것이다

Integer 타입의 변수도 VB.Net에서는 크래스에서 생성하는 오브젝트이다
위에서
Dim iQ() As Integer=New Integer(){....
라고 선언을 하지 않는가???
아무튼 모든 것이 크래스에서 생성되는 오브젝트들이라는 점!!상기하시고..

From, Where , Order By, Select 모두 데이타베이스를 다룰때 사용하는
SQL문의 키워드와 똑같지 않은가???
그러니 SQL문을 익힌 사람은 그냥 거저 먹는 기가막힌 도구인셈이다..
SQL문을 좋아하는 우노도 LINQ가 나오자마자 써먹었으니까..

또 다음에는 어떤 집합체를 잡아볼까??

에이..페이지 바꿔서 실제 데이타를 갖고 해보도록 하자!!!

***[LOG-IN]***