비주얼 베이직 닷넷

비주얼 베이직 닷넷(Visual Basic .NET, VB.NET)은 비주얼 베이직(VB)의 진화된 형태인 객체 지향 컴퓨터 프로그래밍 언어이며, 닷넷 프레임워크에서 구현된다. 마이크로소프트는 현재 상용 소프트웨어인 마이크로소프트 비주얼 스튜디오, 프리웨어인 마이크로소프트 비주얼 스튜디오 익스프레스, 두 가지의 주된 비주얼 베이직 통합 개발 환경을 제공한다.

지원 운영체제 및 하드웨어 요구사항 
 지원 운영 체제
 윈도 XP 서비스 팩 2 이상(2010 출시는, 서비스 팩 3)
 윈도 서버 2003 서비스 팩 1 이상
 윈도 서버 2003 R2 이상
 윈도 비스타
 윈도 서버 2008
 윈도 7
 하드웨어 요구사항
 최소: 1.6 GHz CPU, 384 MB RAM, 1024×768 화면, 5400 RPM 하드 디스크
 권장: 2.2 GHz 이상의 CPU, 1024 MB 이상의 RAM, 1280×1024 화면, 7200 RPM 이상의 하드 디스크

버전 

비주얼 베이직 닷넷은 지금까지 여섯개의 판이 개발되었다.(2014년 1월 기준)

비주얼 베이직 닷넷 2003(VB 7.1) 
비주얼 베이직 닷넷 2003은 닷넷 프레임워크 '버전 1.1'과 함께 출시되었다. 새로운 특징은 닷넷 컴팩트 프레임워크에 대한 지원과 더 나은 비주얼 베이직 업그레이드 마법사가 포함되었다는 것이다. 또한 성능과 닷넷 IDE(특히 배경 컴파일러)와 런타임의 신뢰성을 개선하였다. 또한 비주얼 베이직 닷넷 2003은 '비주얼 스튜디오 닷넷 아카데믹 버전'(VS03AE)에서 사용할 수 있었다. VS03AE는 비용 없이 각 나라에서 일정한 수의 학자들에게 배포되었다.

비주얼 베이직 2005(VB 8.0) 
비주얼 베이직 2005는 Visual Basic .NET의 업데이트 판이다. 비주얼 베이직 2005부터 마이크로소프트는 제목에 '.NET'을 붙이지 않기로 결정하였다.

추가된 기능:

 편집, 계속하기
 디자인-시간(Design-Time) 표현식 평가.
 'My' 가상 이름공간(개요, 세부 사항). 다음 사항을 제공한다:
 .NET 프레임워크의 특정 영역에 접근하기 쉬워짐.
 동적으로 생성된 클래스(My.Forms가 대표적)
 VB-VB.NET 변환기가 개선됨
 자유 리소스가 처분 패턴을 필요로 하는 개체 사용의 단순화하는 'Using' 키워드
 디버그할 때 비주얼 스투디오 .NET IDE와 시스템 라이브러리 코드가 쓴 보일러 플레이트 코드를 건너뛰게 해주는 'Just My Code'
 데이터베이스 서버/클라이언트 개발을 쉽게 만들어 주는 데이터 소스 묶기

위의 기능들(특히 'My')은 고속 응용 프로그램 개발 플랫폼으로서 비주얼 베이직 닷넷의 집중을 강화하고 더 나아가 C#와 차별화하려는 의도이다.

비주얼 베이직 2005는 '더욱 강력한' 다른 .NET 언어들과 차이를 줄이기 위해서 다음과 같은 기능들을 추가로 소개했다:
 .NET 2.0 언어 기능은 다음과 같다:
 제네릭스
 하나의 파일에 클래스의 일부를 정의하고 나중에 더 많은 정의를 추가하는 방법인 부분적 클래스. 특히 자동 생성 코드와 사용자 코드를 통합하는 데 유용하다
 널인 자료형
 부호 없는 정수(unsigned) 자료형을 지원

특허된 'IsNot' 연산자 
비주얼 베이직 2005의 또 다른 특징은 'If Not X is Y'를 'If X IsNot Y'와 동일하게 만드는 IsNot 연산자이다. 이 연산자는 마이크로소프트가 특허 응용 프로그램으로 발표했을 때 혹평을 받았다.

비주얼 베이직 2008(VB 9.0) 
비주얼 베이직 9.0은 2007년 11월 19일에 마이크로소프트 닷넷 프레임워크 3.5와 함께 출시되었다.

이 버전에서 마이크로소프트는 많은 기능을 추가하였다:
 참인 조건 연산자, 'If(논리값, 참 값, 거짓 값)'를 'IIf' 함수로 교체하였다.
 익명 자료형
 LINQ 지원
 람다 표현식
 XML 문자
 자료형 추론
 확장법

비주얼 베이직 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에 비해, Integer 자료형은 16비트에서 32비트로, Long 자료형은 32 비트에서 64 비트로 길이가 두 배로 되었다. 이것은 VB.NET의 모든 버전이 다 그러하다. VB.NET의 모든 버전에서 16비트 정수는 이제 Short로 인식되지 않는다. 마찬가지로, 윈도 폼 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
 해당 버튼이 디자인 보기에서 클릭되면, 비주얼 베이직 6과 비주얼 베이직 닷넷이 자동으로 Sub 와 End Sub 구문을 생성한다. 비주얼 베이직 닷넷은 또한 필수적인 Class 와 End Class 구문을 생성한다. 개발자는 "Hello, World" 메시지 상자를 표시하기 위해 문장을 추가한다.
 함수 프로시저(괄호 필요)과 서브 프로시저(Call 키워드를 사용하여 호출되지 않으면 괄호는 허용되지 않는다)에 대해 서로 다른 규약들이 VB6에는 있는 반면에, 모든 프로시저 호출은 VB.NET에서 괄호로 만들어져야 한다.
 또한 Command1과 Button1이라는 이름은 필수 사항이 아니다. 그러나 VB6과 VB.NET에서 이들은 각각 명령 버튼에 대한 기본 이름이다.
 VB.NET에서는, Handles 키워드는 Button1 객체의 Click 이벤트에 대한 서브 Button1_Click 핸들러를 만드는 데 사용된다. VB6에서핸들러 서브는 객체의 이름("Command1"), 밑줄("_"), 이벤트 이름("Click", 따라서 "Command1_Click")으로 구성된 특정 이름을 반드시 사용해야 한다.
 VB6에서 해당 함수와 비슷하게 사용할 수 있는 Microsoft.VisualBasic 이름공간의 MsgBox라는 함수가 있다. 여기에 대해서 어느 함수가 가장 나은 방법이냐는 논란이 있다.(메시지 상자 표시에 국한된 것이 아니라 Microsoft.VisualBasic 이름공간의 다른 기능에 관한 것도 포함된다) 일부 프로그래머는 "닷넷 방식"을 선호하며, 프레임워크 클래스가 더 많은 기능을 갖고 있고 덜 구체적인 언어이기 때문이라고 말한다. 다른 사람들은 구체적인 언어 기능을 사용하는 것이 코드를 읽기 쉽게 만들어 준다고 주장한다.(예를 들어, System.Int32 대신 int(C#)나 Integer(VB.NET)를 사용).
 VB 2008에서, ByVal sender as Object, ByVal e as EventArgs을 포함하는 것이 선택 사항이 되었다.

다음의 예제는 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런 웹사이트에서 제공한다:
 인쇄 미리보기를 만드는 것과 같이, VB6에서는 일반적인 작업을 VB.NET을 사용하여 완료하는 데 사용.
 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!를 작성하는 것이다. 각 행은 다음과 같은 특정한 목적을 제공한다:

 1행: 모듈 정의이고, 클래스와 유사한 분류의 코드이지만, 모듈은 클래스를 포함할 수 있다. 모듈은 프로그램의 다른 부분에서 참조할 수 있는 코드의 컨테이너 역할을 한다. 이것은 자신을 포함하여, 같은 이름을 가지는 모듈과 코드 파일에 대한 일반적인 관행이다. 그러나 이것은 단일코드의 파일이 하나 이상의 모듈 및 클래스 정의를 포함할 수 있으므로 필수적이지 않다.

 2행: 프로그램이 실행을 시작하는 진입점이다. Sub는 "서브루틴"의 약어이다.

 3행: 이 행은 출력을 작성하는 실제 작업을 수행한다. 콘솔은 명령줄 인터페이스를 나타내고, 운영체제의 표준 스트림에 프로그램 접근 권한을 부여하는 시스템 개체이다. 이 프로그램은 문자열을 콘솔에 표시하도록 전달해주는 콘솔 메서드 WriteLine을 호출한다. 또 다른 일반적인 방법은 MsgBox(메시지 상자)를 사용하는 것이다.

아래 코드 조각은 플로이드의 삼각형의 해답이다.
Imports System.Console

Module Program

    Sub Main()
        Dim rows As Integer

        ' 유효성 검사를 입력한다.
        Do Until Integer.TryParse(ReadLine("얼마나 많은 행을 표시할 것인지에 대한 값을 입력하시오: "), rows) AndAlso rows >= 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

    ''' <요약>
    ''' 프롬프트 문자열이 사용하는 Console.ReadLine 및 버전을 보호한다.
    ''' </요약>
    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

같이 보기 
 마이크로소프트 비주얼 스튜디오
 마이크로소프트 비주얼 스튜디오 익스프레스
 비주얼 베이직 닷넷과 C#의 비교
 비주얼 베이직 포 애플리케이션
 프로그래밍 언어의 비교

참고 문헌

각주

외부 링크 

 비주얼 베이직 개발자 센터
 비주얼 베이직 강좌
 마이크로소프트 비주얼 베이직 익스프레스
 비주얼 베이직 팀 블로그

베이직 예제 코드가 있는 문서
베이직 프로그래밍 언어 계열
닷넷 프로그래밍 언어
베이직 닷넷
마이크로소프트 베이직
2001년 도입
객체 지향 프로그래밍 언어
마이크로소프트의 프로그래밍 언어