PROGRAMMING WORKSHOP

VB.Net | Collection/ArrayList

프로그래밍을 하려면 변수는 필수이고
변수가 복잡해지면 배열이라는 것이 필요하게 되고
필요할때마다 확장하여야 하는 동적배열도 귀찮아서 Collection 이라는 것이
만들어지게 된다
여기까지는 VBA의 이야기다
그런데 VB.Net에서는 이 Collection이 다양하게 확장된다
VBA에서의 Collection은 단순하지만 VB.Net에서는 다양하게
종류가 있고 지능이 좀더 빵빵해진다..
그 중의 하나가 ArrayList라고 하는 것이다

VBA에서의 Arrays와 ArrayList가 뭐가 다른가..
우선 Arrays는 System이라는 NameSpace에 있는 기존의 VB 6.0시절의 그냥
Arrays(배열)이다 VBA의 배열이나 마찬가지이다..물론 VB.Net에서도
사용할 수 있는 것이다
ArrayList는 System.Collections 이라는 NameSpace하에 있다

Arrays는 다차배열이고 규격이 정해지지만
ArrayList는 일차배열이고 규격이 동적으로 확대되고 축소된다
ArrayList는 규격을 초기화해줄 필요가 없는 것이다
VBA의 Collection같이 정보가 생기는대로 추가 시켜나가면 되는것이다
Array는 한가지 형식의 타입만 허용하지만
ArrayList는 다른 타입의 정보도 섞여서 저장한다
예를 들어서 윈도우프로젝트를 하나열고 버튼을 하나 그려 넣고
버튼에 아래코드를 실행시키면

Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim oList As New ArrayList oList.Add("this is Array List Sample") oList.Add(23423) oList.Add(oList(1) / 13) Dim sQ As String = "" For Each oX In oList sQ += oX & vbNewLine Next MsgBox(sQ) End Sub

위의 내용을 VBA에서 Collection개체로 한다면

Sub xxx() Dim oList As New Collection oList.Add "this is Array List Sample" oList.Add 23423 oList.Add oList(2) / 13 Dim sQ As String Dim oX As Variant For Each oX In oList sQ = sQ & CStr(oX) & vbNewLine Next MsgBox sQ End Sub

와 같이 하면 결과는 같다 VBA 의 Collection개체의 처리와 유사하다는 것으로 알면 된다



그러니 VBA에서 Collection개체를 사용하였다면 그냥 ArrayList를
VBA에서와 같이 사용하면 된다
배열과 달리 숫자이던 문자이던 형식과 상관없이 처리한다

주의 할 것은 VBA에서는 모든 집합체는 1에서 부터 시작하지만
VB.Net에서는 배열이던 집합체던 모두 0에서 부터 시작한다는 것을
습관화하셔야 하고

ArryList가 VBA의 Collection과 다른 점은 다양한 메소드와 속성을
갖고 있다는 것이다
아래와 같이 정렬, Sort메소드를 적용할 수 있다

Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim oList As New ArrayList oList.Add("Seoul") oList.Add("Soowon") oList.Add("InChon") oList.Add("Anyang") oList.Sort() Dim sQ As String = "" For Each oX In oList sQ += oX & vbNewLine Next MsgBox(sQ) End Sub

아래와 같이 정렬된 내용을 볼수 있다



ArrayList의 능력을 좀더 관찰하려면 윈도우폼의 콘트롤등과 연계를
하면서 보아야 좀더 알 수 있을 것이다
윈도우프로젝트를 하나 만들고 아래의 그림과 같이
목록상자와 버튼을 몇개 달고 ArrayList를 발생시키고
ArrayList개체가 할 수 있는 간단한 내용과 목록상자가 UserForm의 것과
어떻게 다른지도 관찰하는 것이 좋을 것이다
Visual Studio는 다양한 프로젝트를 만들수 있는 환경이니
Window 프로젝트, 즉 Window Form으로 ArrayList를 구현해보자



아래와 같이 Form1크래스모듈의 선언부에

Public Class Form1 Dim oList As ArrayList ... ... ... End Class

와 같이 선언하고 이 개체를 여러 버튼에서 같이 사용하게 한다
처음 ArrayList개체를 생성하는 버튼에서

Private Sub ButtonArrayListCreate_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ButtonArrayListCreate.Click oList = New ArrayList For iX As Integer = 1 To 10 oList.Add(Chr(64 + Int(Rnd() * 26)) & "_" & Int(Rnd() * 1000) + 1000) Next RefreshListBox() End Sub Sub RefreshListBox() ListBox1.DataSource = Nothing ListBox1.DataSource = oList End Sub

oList외부변수에 ArrayList개체를 생성(New)시키고
10개의 데이타를 만들어서 oList에 채워준다
그리고 윈도우폼에 만들어 놓은 목록상자콘트롤에 oList에 있는
내용을 목록으로 뿌려준다
VB.Net의 개체와 윈도우의 콘트롤들의 좋은 상호관계는
위와 같이 콘트롤의 DataSource속성에 그냥 ArrayList개체를
적용만 하면 목록에 oList의 내용이 연결이 되는 것이다
마치 데이타베이스의 테이블을 억세스의 폼에 연결하듯이
편리하다

VBA에서 UserForm에 테이블의 범위를 목록상자의 적용범위로
연결하듯이 목록을 뿌려주는 것이다
물론 VBA에서도 다른 방법으로도 목록 상자를 채워주듯이
윈도우폼에서도 역시 여러방법중 하나의 방법이다
그러나 이런 배열개체를 사용할 경우 DataSource속성에 연결하면
간단하고 편리하다

두번째 정렬버튼을 크릭하면

Private Sub ButtonArrayListSort_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ButtonArrayListSort.Click Try oList.Sort() RefreshListBox() Catch ex As Exception End Try End Sub

그냥 외부 ArrayList개체변수 oList의
Sort메소드를 적용하면 정렬이 된다

이것을 다시 RefreshListBox프로시져를 호출하여 목록상자를 갱신하면
새로운 정렬된 목록이 목록상자에 나타나겠지

Try~Catch문을 사용하면 목록이 상자에 있던 없던..신경쓸것없이
에러가 나든 말든 편하게 알아서 처리하니 편리하다
물론 더 정성을 다 한다면 Catch문내에서 에러처리를 해주는 것도 필요하지만
위의 같은 경우는 그냥 냅둬도 될 것이다

그런데 오름차로 되는데 내림차로 하려면 어떻게 해야 하나??
ArrayList는 Reverse라는 메소드도 갖고 있다
위와 같이 오름차로 정렬된 것을

oList.Reverse()

하면 될 것이다
첨부 윈도우폼의 코드와 실행을 시켜보시면
ArrayList의 파워를 느끼실 것이다

***[LOG-IN]***

그럼 다음 화일에서 좀더 ArrayList를 응용해보자