비주얼 베이직 닷넷

비주얼 베이직 닷넷(Visual Basic .NET, VB.NET)은 비주얼 베이직(VB)의 진화된 형태인 객체 지향 컴퓨터 프로그래밍 언어이며, 닷넷 프레임워크에서 구현된다. 마이크로소프트는 현재 상용 소프트웨어인 마이크로소프트 비주얼 스튜디오, 프리웨어인 마이크로소프트 비주얼 스튜디오 익스프레스, 두 가지의 주된 비주얼 베이직 통합 개발 환경을 제공한다.
버전.
비주얼 베이직 닷넷은 지금까지 여섯개의 판이 개발되었다.(2014년 1월 기준)
비주얼 베이직 닷넷 2003(VB 7.1).
비주얼 베이직 닷넷 2003은 닷넷 프레임워크 '버전 1.1'과 함께 출시되었다. 새로운 특징은 닷넷 컴팩트 프레임워크에 대한 지원과 더 나은 비주얼 베이직 업그레이드 마법사가 포함되었다는 것이다. 또한 성능과 닷넷 IDE(특히 배경 컴파일러)와 런타임의 신뢰성을 개선하였다. 또한 비주얼 베이직 닷넷 2003은 '비주얼 스튜디오 닷넷 아카데믹 버전'(VS03AE)에서 사용할 수 있었다. VS03AE는 비용 없이 각 나라에서 일정한 수의 학자들에게 배포되었다.
비주얼 베이직 2005(VB 8.0).
비주얼 베이직 2005는 Visual Basic .NET의 업데이트 판이다. 비주얼 베이직 2005부터 마이크로소프트는 제목에 '.NET'을 붙이지 않기로 결정하였다.
추가된 기능:
위의 기능들(특히 'My')은 고속 응용 프로그램 개발 플랫폼으로서 비주얼 베이직 닷넷의 집중을 강화하고 더 나아가 C#와 차별화하려는 의도이다.
비주얼 베이직 2005는 '더욱 강력한' 다른 .NET 언어들과 차이를 줄이기 위해서 다음과 같은 기능들을 추가로 소개했다:
특허된 'IsNot' 연산자.
비주얼 베이직 2005의 또 다른 특징은 codice_1를 codice_2와 동일하게 만드는 codice_3 연산자이다. 이 연산자는 마이크로소프트가 특허 응용 프로그램으로 발표했을 때 혹평을 받았다.
비주얼 베이직 2008(VB 9.0).
비주얼 베이직 9.0은 2007년 11월 19일에 마이크로소프트 닷넷 프레임워크 3.5와 함께 출시되었다.
이 버전에서 마이크로소프트는 많은 기능을 추가하였다:
비주얼 베이직 2010(VB 10.0).
2010년 4월, 마이크로소프트는 비주얼 베이직 2010을 출시하였다. 마이크로소프트는 이번 버전에 동적 언어 런타임(DLR)을 사용하기로 결정했지만 비주얼 베이직과 자매 언어 C# 사이의 동등성을 높이기 위해 공동 진화 전략으로 변경되었다. CLR과 COM 개체와 동적 상호 작용하는 비주얼 베이직의 타고난 능력은 IronPython과 IronRuby 같은 DLR에 빌드된 동적 언어와 작동하도록 향상되었다. 비주얼 베이직 컴파일러는 대부분의 경우에 줄 연결 문자 '_'의 필요를 없애고 일반적인 콘텍스트의 집합에서 행 연속으로 추정하도록 개선되었다. 또한 기존 인라인 함수 지원은 Sub와 함수 람다의 여러-줄 버전뿐만 아니라 인라인 Sub에 대한 지원을 구비하였다. 또 다른 새로운 점은 이전 버전과는 달리 디버그 모드에서 일시 중지된 응용 프로그램의 소스 코드를 더 이상 편집할 수 없다.
비주얼 베이직 2012(VB 11.0).
닷넷 프레임워크 4.5를 이용한다. 비동기 기능, 반복자, 호출 계층(Call Hierarchy), 호출자(Caller) 정보와 이름공간에 넣는 전역(Global) 키워드가 주요 기능이다.
비주얼 베이직 이전 버전(VB6과 그 이전)과의 관계.
비주얼 베이직 .NET을 비주얼 베이직의 또 다른 버전으로 구분해야 하느냐 아니면 완전히 다른 언어로 구분해야 하느냐는 논쟁의 대상이다. 이는 명확하지 않은데, 우회하거나 자동으로 변환시키는 방법이 있기 때문이며, 언어의 기본 문법이 많은 "파괴적" 변화를 겪지 못했고 단지 추가로 구조적 예외 처리와 단절 회로(short-circuited) 표현 같은 새로운 기능을 지원하기 때문이다. VB.NET로 이동하면서 두 가지 중요한 데이터 형식 변경이 일어났다. VB6에 비해, codice_4 자료형은 16비트에서 32비트로, codice_5 자료형은 32 비트에서 64 비트로 길이가 두 배로 되었다. 이것은 VB.NET의 모든 버전이 다 그러하다. VB.NET의 모든 버전에서 16비트 정수는 이제 codice_6로 인식되지 않는다. 마찬가지로, 윈도 폼 GUI 편집기는 스타일과 기능 면에서 비주얼 베이직 양식 편집기와 매우 비슷하다.
새로운 비주얼 베이직(7, 7.1, 8, 9, ...)에 사용되는 버전 번호는 마이크로소프트가 여전히 본질적으로 이전 비주얼 베이직과 같은 제품으로 보고 있다는 것을 의미한다고 볼 수 있다.
크게 바뀐 것은 의미론이다. 비주얼 베이직은 COM을 기반으로 한 결정론적 참조횟수 계산 엔진에서 실행되는 객체 기반 프로그래밍 언어의 의미론이었으며, 비주얼 베이직 닷넷은 공용 언어 런타임(JIT 컴파일 엔진과 세대 쓰레기 수집을 사용하는 가상 머신)과 훨씬 더 큰 라이브러리의 결합으로 구성되고 .NET 프레임워크에서 지원되는 객체 지향 언어이다. 비주얼 베이직 닷넷의 폭넓은 증가는 비주얼 스튜디오 2005의 '마이' 기능에서도 어느 정도 다루긴 했지만, VB 개발자가 언어에 접근할 때 감당해야 하는 문제이기도 하다.
이 변화는성능과 유지보수의 관점에서 해야할 일들에 대한 많은 기본적인 가정을 바꿔놓았다. 일부 기능과 라이브러리는 더 이상 존재하지 않는다. 나머지들은 사용할 수 있지만, 원래 .NET의 대안만큼 효율적이지 않다. 그들은 컴파일하더라도, 대부분의 변환된 VB6 애플리케이션은 새로운 언어를 최대한 활용하기 위해 어느 정도의 리팩토링이 필요하다. 문법, 디버깅 애플리케이션, 배치 및 용어의 변경을 다루는 문서를 제공한다
비교 예제.
다음의 간단한 예제는 VB 및 VB.NET 사이에서 구문의 유사성을 보여준다. 두 예제는 모두 OK 버튼과 함께 "Hello, World"라는 메시지 상자를 띄운다.
Private Sub Command1_Click()
 MsgBox "Hello, World"
End Sub
비주얼베이직 닷넷 예제에서 MsgBox 또는 MessageBox 클래스는 이렇게 쓰일 수 있다.
Public Class Form1
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 Msgbox("Hello, World")
 End Sub
End Class
Public Class Form1
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 MessageBox.Show("Hello, World")
 End Sub
End Class
다음의 예제는 VB6와 VB.NET 간의 차이점을 보여준다. 두 예제들은 모두 활성화된 창을 닫는다.
VB 예제:
Sub cmdClose_Click()
 Unload Me
End Sub
VB.NET 예제:
Sub btnClose_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnClose.Click
 Me.Close()
End Sub
이전에 언급한 새로운 규칙을 따라, 'cmd' 접두사는 'btn' 접두사로 교체되었다
비주얼 베이직 6은 일반적인 연산자 단축키를 제공하지 않는다. 다음은 서로 동일하다:
VB6 예제:
Sub Timer1_Timer()
 Me.Height = Me.Height - 1
End Sub
VB.NET 예제:
Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
 Me.Height -= 1
End Sub
비평.
초기 버전에서는 VB6(마이크로소프트가 더 이상 판매하지 않음)에서 사용 가능했던 언어 구조와 사용자 인터페이스 기능이 대폭 축소되었고 남아있던 VB6의 의미론이 바뀌었기 때문에 비주얼 베이직 사용자들은 이에 대해 오랫동안 불평해왔다. 예를 들어, VB.NET 매개 변수는(기본적으로) 참조가 아니라 값에 의해 전달된다. 비판자들은 VB.NET을 '비주얼 프레드'또는 'DOTNOT'처럼 경멸적으로 부른다. 2005년 3월 8일, 마이크로소프트가 VB6에 대한 주요 지원을 확장하는 것을 거절한 데 대한 대응으로 청원이 제기되었다.
VB.NET의 지지자들은 새로운 언어가 대부분의 측면에서 이전 버전보다 더 강력하며, 초기 버전보다 자연스럽고, 일관되며, 완전한 방식으로 현대적인 객체 지향 프로그래밍 패러다임을 통합하는 것이 가능하다고 말한다. 반대자는 VB6은 자신의 개체 모델에서 결함을 가지고 있기는 하지만, VB.NET로 변환하여 얻을 수 있는 모든 혜택에 비해, 재개발 측면의 비용이 너무 높다고 반박한다.
VB.NET을 포함한 공통 중간 언어(CIL)를 대상으로 한 언어는 기계 코드로 컴파일되는 언어에 비해 디컴파일하기 쉽다. .NET 리플렉터 같은 도구는 CIL에서 제공하는 메타데이터의 양이 많기 때문에 원래 코드에 가까운 결과물을 제공한다.
마이크로소프트는 비주얼 스튜디오 .NET에 자동화된 VB6-VB.NET 변환기를 공급하고 있고, 시간이 지나면서 개선되긴 했지만 모든 코드를 변환할 수 없으며 거의 모든 중대한 프로그램들을 컴파일하려면 약간의 수동적인 노력이 필요하다. 대부분은 최적으로 작동하게 하려면 리팩토링이 어느 정도 수준으로 필요하다. 자연적으로 알고리즘적 비주얼 베이직 프로그램은 마이그레이션하는데 몇 가지 어려움이 있다. 데이터베이스 지원, 그래픽, 관리되지 않는 운영 또는 구현 세부 정보에 같은 기능에 크게 의존하는 프로그램들이 더 골칫거리다.
또한 VB.NET 프로그램은 상당히 큰 닷넷 프레임워크의 설치를 요구하는 반면, VB6 프로그램에 필요한 런타임 라이브러리가 윈도우 98 SE와 그 이상에 제공된다. 이 프레임워크는 윈도우 7, 윈도우 비스타, 윈도 XP 미디어 센터 에디션, 윈도 XP 태블릿 PC 에디션, 윈도우 서버 2008과 윈도우 서버 2003에 포함되었다. 지원되는 다른 운영체제에는 윈도우 2000 또는 윈도 XP(홈 또는 프로페셔널 에디션)이 있으며 별도로 설치되어 있어야 한다.
개발자 불만족에 대한 마이크로소프트의 대응은 새로운 개발로 쉽게 이동하고 기존의 코드베이스를 VB6에서 VB.NET으로 변환하도록 하는데 초점을 맞추었다. 그들은 최신 코드 예제와 문서를 VB런 웹사이트에서 제공한다:
크로스 플랫폼 및 오픈-소스 개발.
VB.NET 개발을 위한 오픈-소스 도구의 탄생은 모노 개발 플랫폼이 윈도 폼 GUI 라이브러리와 같은 표준 프레임워크 라이브러리뿐만 아니라, VB.NET 라이브러리 및 VB.NET에서 작성된 VB.NET 8.0 호환 컴파일러의 구현을 제공함에도 불구하고 C#에 비해 느리다.
샤프디벨롭과 모노디벨롭은 오픈-소스 대안 IDE이다.
예제.
다음은 매우 간단한 VB.NET 프로그램이며, 콘솔 애플리케이션으로 만든 "Hello world" 예제의 고전적인 버전이다.
Module Module1
 Sub Main()
 Console.WriteLine("Hello, world!")
 End Sub
End Module
결과는 명령 줄에 "Hello, world!"를 작성하는 것이다. 각 행은 다음과 같은 특정한 목적을 제공한다:
아래 코드 조각은 플로이드의 삼각형의 해답이다.
Imports System.Console
Module Program
 Sub Main()
 Dim rows As Integer
 ' 유효성 검사를 입력한다.
 Do Until Integer.TryParse(ReadLine("얼마나 많은 행을 표시할 것인지에 대한 값을 입력하시오: "), rows) AndAlso rows &gt;= 1
 WriteLine("허용된 범위는 1과 {0}이다", Integer.MaxValue)
 Loop
 ' 플로이드의 삼각형의 출력
 Dim current = 1
 For row = 1 To rows
 For column = 1 To row
 Write("{0,-2} ", current)
 current += 1
 Next
 WriteLine()
 Next
 End Sub
 &lt;요약&gt;
 프롬프트 문자열이 사용하는 Console.ReadLine 및 버전을 보호한다.
 &lt;/요약&gt;
 Function ReadLine(Optional prompt As String = Nothing) As String
 If prompt IsNot Nothing Then
 Write(prompt)
 End If
 Return Console.ReadLine()
 End Function
End Module