메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

VB.NET 2.0과 함께하는 빠른 응용 프로그램 개발

한빛미디어

|

2005-01-28

|

by HANBIT

13,015

저자: Jesse Liberty, 한동훈 역
원문: http://www.ondotnet.com/pub/a/dotnet/2004/08/02/libertywhidbey.html

지금까지 2년 동안 개발자들에게 C#과 VB.NET은 MSIL(Microsoft Intermediate Language) 위에 올려진 문법적 취향이기 때문에 어떤 것으로 프로그래밍을 하더라도 문제되지 않는다라는 마이크로소프트의 지지를 권했었는데, 휘드비(Whidbey)에 와서 이것이 바뀌게 될 전망이다.

마이크로소프트는 비주얼 베이직 2.0을 다른 언어들에 비해 보다 RAD(Rapid Application Development) 위주로 방향을 설정한 듯하다. 다라서, VB2의 설계자들은 응용 프로그램을 보다 빠르고, 보다 쉽게 개발할 수 있는 몇 가지 기능들을 추가했다. 핵심적인 특징은 My 객체의 추가다. My 객체는 응용 프로그램, 환경 및 리소스에 대해 보다 빠르게 액세스할 수 있는 6개의 최상위 객체를 갖고 있다.
  • My.Application
  • My.Computer
  • My.User
  • My.Webservices
  • My.DataSources
이들 객체는 실행중인 응용 프로그램과 응용 프로그램을 실행하는 환경에 대해 찾기 어렵거나 조작하기 어려운 것들에 대한 액세스를 위해 포괄적인 속성들을 제공한다. My 객체가 실제로 어떻게 쓰이는지 알아보기 위해, 그림1과 같은 작은 테스트 응용 프로그램을 작성했다.

그림1
그림1

응용 프로그램은 현재 네트워크에 연결되어 있는지 아닌지를 표시할 수 있으며, 연결이 끊기거나 다시 연결될 때 업데이트된다. 또한, 해당 머신의 관리자 인지 아닌지, 특수 키가 눌려 있는지, 현재 클립보드의 내용이 무엇인지를 나타낸다. Look Again 버튼은 키와 클립보드를 다시 조사한다.(이 예제에서는 키가 눌리지 않을 때를 처리하기 위한 이벤트 처리는 사용하지 않았다) 레지스트리 항목을 설정하고, 값을 알아내기 위한 버튼도 있으며, 컴퓨터와 현재 사용자에 관한 정보를 나타내는 리스트 박스까지 갖고 있다. 또한, Windows\Media 디렉터리의 .wav 파일의 목록들도 있으며, Play 버튼은 각 사운드를 재생할 수 있다.(.wav 파일을 더블 클릭해도 재생할 수 있다.)

이 응용 프로그램을 작성하는 것은 1시간이 걸렸다. 더 빨리 작성할 수도 있었지만, My 객체에 대해 더 많은 것들을 이해하기 위해서 1시간이 걸렸다. 일반적으로, 이것은 굉장히 빠른 응용 프로그램 개발이라 할 수 있다.

이 응용 프로그램에 대한 코드를 다운받을 수 있지만, 직접 만드는 것도 꽤 쉽게 할 수 있다.(여기서 사용된 코드는 Visual Studio .NET 2005 Beta1으로 작성되었다)

응용 프로그램을 직접 만들기 위해 먼저 새로운 VB 윈도우 응용 프로그램을 생성한다. 그림1과 같이 폼 위에 리스트 박스, 체크 박스 등을 올려놓는다. 그림2는 편의를 위해 각 컨트롤의 이름을 나열한 것이다.

그림2
그림2

폼을 로딩하기

폼을 로드할 때 현재 작업 디렉터리를 C:\Windows\Media로 설정할 것이며, .wav로 끝나는 파일들의 목록을 lbClips의 데이터 소스로 사용할 것이다. 이런 일을 하는데 필요한 것은 FrmMy_Load 이벤트 핸들러에 단 두 줄의 코드를 작성하는 것 뿐이다.

Private Sub FrmMy_Load(ByVal sender As Object, _
          ByVal e As System.EventArgs) _
          Handles Me.Load

첫번째 코드는 My.Computer.FileSystem.CurrentDirectory를 사용해서 현재 디렉터리를 지정하는 것이다.

My.Computer.FileSystem.CurrentDirectory = "C:\Windows\Media"

이 코드를 조금 더 자세히 살펴보자. My 객체는 Computer 객체를 갖고 있으며, 이 객체는 시계, 키보드, 파일 시스템, 오디오와 같은 컴퓨터의 구성 요소들을 조작할 수 있는 속성들을 갖고 있다. My.Computer는 My.Computer.FileSystem 객체를 반환하는 FileSystem 속성을 갖고 있으며 이 객체는 드라이브와 파일을 처리하기 위한 속성과 메서드들을 제공한다. CurrentDirectory와 같은 속성은 응용 프로그램의 현재 디렉터리를 알아내거나 설정할 수 있다.

FrmMy_Load 메서드의 두번째 코드는 현재 디렉터리에 있는 파일들의 목록을 리스트 박스의 소스에 설정하는 것이다.

lbClips.DataSource = _
    My.Computer.FileSystem.GetFiles( _
      My.Computer.FileSystem.CurrentDirectory, _
      False, _
      "*.wav")

여기서는 My.Computer.FileSystem.GetFiles 메서드를 호출하고 있으며, 오버로드된 버전의 이 메서드는 디렉터리, 하위 디렉터리를 포함한 것인지를 나타내는 불리언 타입, 파일 이름들을 가져오기 위해 사용하는 와일드카드를 포함한 문자열을 인자로 사용한다.

빠르다!! 리스트 박스는 Windows/Media 디렉터리의 .wav 파일의 목록으로 채워져 있다.

Load 이벤트 핸들러는 위 두 줄의 코드외에 다음의 다섯가지 메서드를 추가로 호출한다.
  • IsNetworked - 현재 네트워크에 연결되어 있는지 확인한다.
  • IsAdministrator - 현재 사용자가 관리자 그룹에 속해 있는지를 확인한다.
  • CheckKeys - 특수 키를 누르고 있는지를 체크 박스에 설정한다.
  • FillFromClipBoard - 클립보드에 있는 내용을 텍스트 박스에 채운다.
  • FillComputerInfo - 사용중인 컴퓨터와 사용자에 관한 정보를 텍스트 박스에 채운다.
각 메서드는 My 객체를 사용해서 즉석에서 만든 것이다.

Public Sub IsNetworked()
    Me.cbNetworked.Checked = My.Computer.Network.IsAvailable
End Sub

My.Computer의 속성으로 이용할 수 있는 Network 객체는 컴퓨터가 네트워크에 연결되어 있으면 true를 반환하는 IsAvailable 속성을 갖고 있다. 이 속성을 이용해서 체크 박스 cbNetworked의 Checked 속성을 설정하였다. 이 기사의 뒤에는 체크 박스를 NetworkAvailabilityChanged 이벤트에 응답하는 버전으로 바꿔볼 것이다.

IsAdministrator 메서드도 마찬가지로 사용법이 간단하다.

Private Sub IsAdministrator()
    Me.cbAdministrator.Checked = _
      My.User.IsInRole("Administrators")
End Sub

My.User 객체는 현재 사용자에 대한 많은 정보를 제공한다. IsInRole 메서드는 사용자가 어떤 권한들을 갖고 있는지 알 수 있는 빠르고, 간편한 방법을 제공한다.

CheckKeys 메서드는 My.Computer가 반환하는 Keyboard 객체의 다양한 불리언 매개변수를 사용해서 키와 관련된 체크 박스들을 설정하는 역할을 한다.

Private Sub CheckKeys()
Me.cbAltKey.Checked = My.Computer.Keyboard.AltKeyDown
Me.cbCapsLock.Checked = My.Computer.Keyboard.CapsLock
Me.cbCtrlKey.Checked = My.Computer.Keyboard.CtrlKeyDown
Me.cbNumLock.Checked = My.Computer.Keyboard.NumLock
Me.cbScrollLock.Checked = My.Computer.Keyboard.ScrollLock
Me.cbShiftKey.Checked = My.Computer.Keyboard.ShiftKeyDown
End Sub

FillFromClipBoard 메서드는 My.Computer 객체가 반환하는 Clipboard 객체의 GetText를 호출한다. Clipboard 객체는 이미지나 텍스트가 아닌 다른 형태의 객체들을 클립보드에 복사하기 위해 사용할 수도 있다.

Private Sub FillFromClipBoard()
    Me.txtClipBoard.Text = My.Computer.Clipboard.GetText()
End Sub

마지막으로 FillComputerInfo 메서드는 메모리, 운영 체제, 현재 사용자에 관한 정보를 얻기 위해 My.Computer.Info 객체를 사용하며, 이러한 정보를 리스트 박스 lbComputerInfo에 추가한다.

Private Sub FillComptuerInfo()
Me.lbComputerInfo.Items.Add( "Total memory: " + _
    My.Computer.Info.TotalPhysicalMemory.ToString())
Me.lbComputerInfo.Items.Add("Physical memory: " + _
    My.Computer.Info.AvailablePhysicalMemory.ToString())
Me.lbComputerInfo.Items.Add("Virtual memory: " + _
    My.Computer.Info.AvailableVirtualMemory.ToString())
Me.lbComputerInfo.Items.Add("Machine Name: " + _
    My.Computer.Info.MachineName.ToString())
Me.lbComputerInfo.Items.Add("User: " + _
    My.Computer.Info.UserName.ToString())
Me.lbComputerInfo.Items.Add("O.S.: " + _
    My.Computer.Info.OSFullName.ToString())
End Sub

LookAgain 버튼 이벤트 핸들러는 폼이 로드된 이후에 변경된 것들을 반영하기 위해 체크 박스와 텍스트를 변경하기 위해 CheckKeys와 FillFromClipBoard 메서드를 호출한다.

상호작용하게 하기

폼의 오른쪽 상단에 텍스트 박스 하나와 버튼 두 개를 볼 수 있을 것이다. 이 컨트롤들은 레지스트리 키에 문자열을 쓰고, 레지스트리에서 문자열을 읽어들이기 위해서 사용된다. Get 버튼 핸들러는 My.Computer가 반환하는 Registry 객체의 GetValue 메서드를 호출한다. GetValue 메서드는 3개의 매개변수 키, 값의 이름, 키가 비어 있는 경우에 반환할 기본 값으로 되어 있다.

Private Sub btnGetRegistry_Click(ByVal sender As System.Object, _
                                           ByVal e As System.EventArgs) _
                                           Handles btnGetRegistry.Click
Me.txtRegistry.Text = My.Computer.Registry.GetValue( _
    "HKEY_CURRENT_USER\MyObjectKey", _
    "MyObjectValue", _
    "No Registry value stored").ToString()
End Sub

마찬가지로 레지스트리를 설정하는 것은 Registry 객체의 SetValue 메서드를 사용한다. SetValue 메서드는 키, 값의 이름, 저장할 실제 텍스트를 매개변수도 갖는다.

My.Computer.Registry.SetValue("HKEY_CURRENT_USER\MyObjectKey", _
                              "MyObjectValue", _
                              Me.txtRegistry.Text)
Me.txtRegistry.Text = String.Empty

두번째 텍스트는 텍스트를 레지스트리에 저장한 후에 텍스트 박스의 내용을 제거한다.

lbClipes 리스트 박스에서 더블 클릭을 한 경우와 Click 이벤트, Play 버튼에 대해 공통으로 사용할 이벤트 핸들러를 만들었다.

Private Sub Play_Event(ByVal sender As System.Object, _
                      ByVal e As System.EventArgs) _
                      Handles btnPlay.Click, lbClips.DoubleClick

이 메서드의 역할은 현재 선택된 .wav 파일을 찾아서 연주하는 것이며, 연주는 My.Computer 객체가 반환하는 Audio 객체의 Play 메서드를 사용하면 된다.

My.Computer.Audio.Play(lbClips.SelectedItem)

MyEvents.vb사용하기

마지막으로, 이 예제에서 가장 어려운 부분을 살펴볼 차례다. 컴퓨터의 네트워크 케이블이 빠진 경우에 ConnectedToNetwork 체크 박스를 업데이트하게 해볼 것이다. 이것을 하기 위해서는 NetworkAvailabilityChanged 이벤트에 대한 핸들러를 구현해야 한다. 이를 구현하기 위해서는 솔루션 탐색기(Solution Explorer)에서 모든 파일 보기(Show All Files) 버튼을 클릭한다. 이 버튼을 클릭하면 그림 3에서 볼 수 있는 것처럼 숨겨진 파일, MyEvents.vb가 나타난다.

그림3
그림3

MyEvents.vb파일을 열고 이벤트를 보기 위해 드롭 다운 메뉴를 클릭한다. NetworkAvailabilityChanged 이벤트를 클릭하면 그림4와 같이 해당 이벤트 핸들러에 대한 기본 코드가 생성된다.

그림4
그림4

NetworkAvailabilityChanged 핸들러 안에서 네트워크 상태가 변경되었을 때 체크 박스를 업데이트하기 위해서는 FrmMy.IsNetworked()을 추가해 주기만 하면 된다.

요약

My 객체는 이 응용 프로그램을 작성하는 것을 매우 쉽게 만들어 주었다. My 객체가 제공하는 각각의 객체는 여기서 보여준 것보다 더 많은 속성과 메서드를 지원하고 있으며 인텔리센스나 MSDN 문서등을 통해서 이들을 살펴볼 수 있을 것이다.

VB 2에서는 My 객체를 사용하여 응용 프로그램의 빠른 개발을 획기적으로 주도할 것이며, 이는 왜 C#에서 이런 기능을 사용할 수 없는지에 대한 의문을 불러일으킬 것이다. 아직 성능에 대해서 시험해보지 않았지만, My 객체를 사용하는 것에 분명한 성능상의 단점이 없다면 프로그래밍을 보다 쉽게 하기 위해 C#으로 전환하지 못할 이유는 없어보인다. 결국, 프레임워크가 더 많은 것들을 제공할수록, 개발자는 응용 프로그램을 설계하고 구축하는데 보다 집중할 수 있다.

예제 코드는 다운로드 할 수 있습니다.
TAG :
댓글 입력
자료실

최근 본 책0