Visual Basic · 기본
Visual Basic과 .NET 입문
Visual Basic 시작하기 - .NET 콘솔 프로젝트
dotnet new console -lang VB, Module·Sub Main, Console.WriteLine, 프로젝트 파일, VB 가 쓰이는 곳(업무 자동화·레거시 유지보수)
개발자KR · 원고 갱신
이 장에서 배우는 것
작은 사무실에서 노트북과 프로젝터를 빌려주는 일을 생각해 본다. 지금은 종이에 비품 이름과 대여 여부를 적지만, 앞으로는 프로그램으로 대여와 반납을 관리하려 한다. 이 장에서는 그 출발점으로, 사무실 비품 안내를 화면에 출력하는 프로그램을 만든다. 아직 사용자의 입력을 받거나 대여 기록을 저장하지는 않는다. 프로그램을 만들고 실행하는 기본 과정을 먼저 익힌다.
Visual Basic은 사람이 읽고 작성할 수 있는 문법으로 컴퓨터에 할 일을 전달하는 프로그래밍 언어다. .NET은 Visual Basic으로 작성한 프로그램을 만들고 실행하는 데 필요한 도구와 실행 기반을 제공한다. 이 책에서는 macOS나 Linux의 터미널에서 .NET 10을 사용한다. 터미널은 명령을 글자로 입력하고 그 결과를 확인하는 도구다.
- Visual Basic이 업무 자동화와 기존 시스템 유지보수에 쓰이는 이유를 설명한다.
dotnet new console -lang VB로 Visual Basic 콘솔 프로젝트를 만든다.Module Program과Sub Main이 프로그램에서 맡는 역할을 구분한다.Console.WriteLine으로 비품 안내를 한 줄씩 출력한다.- 소스 파일과 프로젝트 파일의 차이를 이해하고
dotnet run으로 프로그램을 실행한다.
문제 상황
직원이 열 명인 사무실에 공용 노트북 두 대와 프로젝터 한 대가 있다. 새로 입사한 직원은 어떤 비품을 빌릴 수 있는지, 누구에게 요청해야 하는지 알기 어렵다. 담당자는 같은 안내를 여러 번 설명한다. 안내문을 프로그램으로 만들어 두면 터미널에서 실행해 비품 목록과 대여 절차를 확인할 수 있다.
처음 만들 프로그램의 요구 사항은 작다. 화면 첫 줄에 프로그램 이름을 보여 주고, 그 아래에 비품 세 개를 나열한다. 마지막에는 대여와 반납을 누구에게 알리는지 적는다. 현재 재고나 대여 가능 여부를 계산하지 않으며, 실제 이용 기록도 바꾸지 않는다. 따라서 실행할 때마다 같은 문장이 같은 순서로 나타나고, 안내를 모두 출력하면 프로그램이 끝난다.
이 정도 규모의 작업에도 프로그램의 뼈대가 필요하다. 컴퓨터는 파일에 적힌 문장을 모두 안내문으로 취급하지 않는다. 어떤 부분이 프로그램의 시작점인지, 어떤 문장이 화면 출력을 지시하는지 구분할 수 있는 형식으로 작성해야 한다. 이번 예제는 그 형식을 익히기 위한 첫 작업이다.
여기서 만드는 것은 콘솔 앱이다. 콘솔 앱은 터미널과 같은 글자 중심의 화면을 통해 입력과 출력을 주고받는 프로그램이다. 버튼이나 창을 만들지 않아도 결과를 바로 확인할 수 있어, 언어의 기본 구조를 배우거나 작은 업무 도구를 만드는 데 적합하다.
Visual Basic과 .NET의 역할
Visual Basic으로 작성한 파일에는 컴퓨터가 수행할 명령이 들어간다. 이렇게 사람이 작성한 프로그램 내용을 소스 코드라고 한다. Visual Basic 소스 파일은 보통 .vb라는 확장자를 쓴다. 확장자는 파일 이름 끝에 붙어 파일의 종류를 나타내는 부분이다. 이번 장에서는 Program.vb에 모든 소스 코드를 작성한다.
소스 코드를 저장하는 것만으로 프로그램이 실행되지는 않는다. 컴파일러라는 도구가 코드의 문법과 사용 방법을 확인하고 실행에 필요한 형태로 바꾸어야 한다. 이 과정을 컴파일이라고 한다. 프로젝트에 필요한 파일을 준비하고 컴파일 결과를 만드는 전체 작업은 빌드라고 부른다. 문법이 잘못되면 빌드 중에 오류가 나타나며, 그 상태에서는 새 프로그램을 실행할 수 없다.
.NET 소프트웨어 개발 키트(SDK)는 이러한 개발에 필요한 도구 묶음이다. 여기에는 명령을 처리하는 dotnet 도구와 프로그램을 빌드하는 기능 등이 포함된다. 실행 환경인 런타임은 빌드된 프로그램이 동작하도록 돕는다. 이 책의 작업에는 실행 기능만 있는 설치본이 아니라 .NET 10 SDK가 필요하다.
Visual Basic은 언어이고, .NET은 그 언어로 만든 프로그램이 사용할 기능과 실행 기반을 제공한다. 화면에 글자를 쓰는 Console도 .NET이 제공하는 기능이다. 따라서 첫 프로그램은 Visual Basic의 문법으로 .NET의 출력 기능을 호출하는 형태가 된다. 호출은 준비된 기능에 일을 하도록 요청한다는 뜻이다.
| 요소 | 역할 | 이번 장의 예 |
|---|---|---|
| Visual Basic | 프로그램의 명령을 표현하는 언어 | Module, Sub |
| .NET SDK | 프로젝트 생성과 빌드에 필요한 도구 | dotnet new, dotnet run |
| .NET 런타임 | 빌드된 프로그램의 실행을 지원 | 콘솔 앱 실행 |
| 소스 파일 | 작성한 프로그램 내용을 보관 | Program.vb |
업무 자동화와 기존 프로그램 유지보수
업무 자동화는 사람이 반복하던 작업 일부를 프로그램으로 수행하는 것이다. 예를 들어 비품 안내를 일정한 형식으로 출력하거나, 정해진 규칙으로 업무 자료를 처리하는 작업이 해당한다. Visual Basic은 .NET이 제공하는 기능을 이용해 이런 업무 도구를 작성하는 데 사용할 수 있다. 이 책에서는 비품 대여 관리라는 작은 업무를 중심으로 프로그램을 넓혀 간다.
Visual Basic은 이미 운영 중인 사내 프로그램을 유지보수할 때도 만날 수 있다. 오래 사용해 온 시스템을 레거시 시스템이라고 부른다. 유지보수에는 오류 수정뿐 아니라 바뀐 업무 규칙을 반영하고, 실행 환경을 점검하며, 사용자가 필요한 기능을 보완하는 일도 포함된다. 기존 코드가 Visual Basic으로 작성되어 있다면 그 문법을 이해하는 것이 작업의 출발점이다.
이름이 비슷하다고 모든 Visual Basic 계열 프로그램이 같은 방식으로 실행되는 것은 아니다. Excel 같은 Office 프로그램의 자동화에 쓰이는 VBA는 이 책에서 사용하는 Visual Basic .NET과 구분해야 한다. 이전의 Visual Basic 6으로 만든 프로그램도 여기서 만드는 .NET 10 콘솔 프로젝트와 실행 기반이 다르다. 이번 장의 dotnet 명령은 Visual Basic .NET 프로젝트를 위한 것이다.
macOS와 Linux에서 .NET 콘솔 앱을 만들 수 있다는 사실이, 기존의 모든 Windows 업무 프로그램을 그대로 실행할 수 있다는 뜻은 아니다. 프로그램이 사용하는 화면 기술이나 운영체제 기능에 따라 실행 가능한 환경이 달라진다. 이번 예제는 터미널에 글자를 출력하는 .NET 콘솔 기능만 사용하므로 두 환경에서 같은 구조로 작성할 수 있다.
콘솔 프로젝트 만들기
SDK 확인과 작업 폴더 준비
먼저 터미널에서 사용할 SDK를 확인한다. 다음 명령은 현재 위치에서 선택되는 SDK의 버전을 출력한다. 이 책의 실습에서는 버전이 10.0.으로 시작해야 한다. 뒤에 붙는 숫자는 설치한 SDK에 따라 달라지므로 특정 값을 외울 필요는 없다.
dotnet --version
dotnet 명령을 찾을 수 없다는 메시지가 나오면 .NET 10 SDK 설치와 터미널의 명령 검색 경로를 확인해야 한다. 명령 검색 경로는 터미널이 실행할 도구를 찾는 위치 목록이다. 설치 후에는 터미널을 다시 열어 확인할 수 있다. 사용할 SDK와 설치 방법은 .NET 10 다운로드 안내에서 확인할 수 있다.
다음으로 프로젝트를 넣을 새 폴더를 만들고 그 안으로 이동한다. 아래 명령은 한 줄씩 실행한다. mkdir는 폴더를 만들고, cd는 터미널의 현재 작업 위치를 바꾼다. 이미 같은 이름의 폴더를 사용 중이라면 다른 빈 폴더에서 시작한다.
mkdir OfficeEquipment
cd OfficeEquipment
dotnet new console -lang VB
마지막 명령의 new는 새 프로젝트를 만들라는 요청이다. console은 콘솔 앱의 기본 구성을 선택한다. -lang VB는 생성할 소스 코드의 언어를 Visual Basic으로 지정한다. 언어를 생략하면 이 실습과 다른 언어의 프로젝트가 만들어질 수 있으므로 함께 적는다.
프로젝트는 소스 파일과 빌드 설정을 한 작업 단위로 묶은 것이다. 생성 명령은 직접 모든 설정을 작성하지 않아도 시작할 수 있도록 기본 파일을 준비한다. 생성된 Program.vb를 글자 편집기로 열면 출발용 프로그램이 들어 있다. 이 장에서는 그 내용을 완성 코드로 전부 교체한다.
프로젝트 파일 읽기
방금 만든 폴더에는 OfficeEquipment.vbproj라는 프로젝트 파일도 생긴다. .vbproj는 Visual Basic 프로젝트 파일의 확장자다. 기본 파일 이름은 프로젝트를 만든 폴더 이름을 따른다. 아래는 이 프로젝트의 핵심 설정을 보여 주는 내용이다.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>OfficeEquipment</RootNamespace>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
</Project>
프로젝트 파일은 XML이라는 표기 형식을 사용한다. 꺾쇠로 둘러싼 이름과 그 사이의 값으로 설정을 표현한다. 지금은 XML 문법 전체를 익힐 필요가 없다. 프로그램의 실행 명령을 적는 곳과 프로그램을 어떻게 빌드할지 정하는 곳이 서로 다르다는 점을 먼저 이해한다.
OutputType의 Exe는 실행할 수 있는 프로그램을 만든다는 설정이다. TargetFramework의 net10.0은 대상으로 삼는 .NET 버전을 나타낸다. RootNamespace는 코드의 이름을 묶는 기본 범위다. 여기서는 기본값을 유지하며, 이름을 묶는 세부 문법은 사용하지 않는다.
프로젝트 파일은 화면에 출력할 안내문을 넣는 파일이 아니다. 예를 들어 대여 안내 문구를 바꾸고 싶다면 Program.vb를 수정한다. 대상으로 삼는 .NET 버전을 확인하고 싶다면 .vbproj 파일을 읽는다. 처음에는 두 파일의 역할을 혼동하기 쉬우므로 구분해 두는 것이 좋다.
이 형태의 프로젝트에서는 같은 프로젝트 폴더에 있는 일반적인 .vb 소스 파일이 기본 규칙에 따라 빌드에 포함된다. 이번 예제는 Program.vb 하나만 사용하므로 소스 파일 목록을 프로젝트 파일에 따로 적을 필요가 없다.
dotnet run은 현재 폴더의 프로젝트를 찾아 필요한 빌드를 수행하고 프로그램을 실행한다. 실행 과정에서 bin과 obj 같은 폴더가 생길 수 있다. 이들은 빌드 결과와 중간 작업 파일을 보관하는 폴더다. 이번 실습에서는 직접 편집하지 않는다.
실행 명령은 OfficeEquipment 폴더 안에서 사용한다. 터미널의 현재 위치가 소스 파일이 있는 프로젝트 폴더인지 확인하는 습관이 필요하다. 파일을 편집하는 창에서 어떤 폴더를 열었는지와 터미널이 어느 폴더에 있는지는 서로 다를 수 있다.
프로그램의 시작점과 한 줄 출력
Module과 Sub Main
Module은 관련 코드를 담는 모듈을 선언하는 말이다. 이번 프로그램의 모듈 이름은 Program이다. Module Program으로 시작한 범위는 End Module로 닫는다. 이 안에 프로그램이 수행할 작업을 넣는다.
Sub는 여러 명령을 하나의 작업으로 묶는 프로시저를 선언한다. 프로시저는 이름을 가진 작업 묶음이다. 이번에는 Main이라는 이름의 프로시저 하나만 둔다. 이 프로젝트 구조에서 Sub Main()은 실행이 시작되는 진입점이다. 진입점은 프로그램을 실행했을 때 처음 수행할 코드를 찾는 자리다.
Main 뒤의 괄호는 이 작업에 전달할 값을 적는 자리와 관련이 있다. 이번 형태의 Main()은 전달받는 값을 선언하지 않는다. 시작 구조를 그대로 사용하면 된다. 프로시저에 값을 전달하거나 여러 작업으로 나누는 방법은 뒤에서 따로 익힌다.
Sub Main()으로 시작한 범위는 End Sub로 닫는다. 따라서 바깥쪽에는 모듈의 시작과 끝이 있고, 안쪽에는 시작 프로시저의 시작과 끝이 있다. 들여쓰기로 안쪽 범위를 오른쪽으로 옮기면 이 관계를 눈으로 확인하기 쉽다.
Module Program
Sub Main()
End Sub
End Module
위 코드는 프로그램의 뼈대만 보여 준다. 출력 명령이 없으므로 실행해도 안내문은 나타나지 않는다. 실제 작업을 하려면 Sub Main()과 End Sub 사이에 실행할 문장을 넣어야 한다. 이 책에서는 한 줄에 하나의 출력 명령을 적는다.
Console.WriteLine으로 문장 출력하기
Console.WriteLine은 콘솔에 내용을 쓰고 다음 줄로 이동하는 기능이다. Console은 콘솔 입출력을 제공하는 이름이고, 점 뒤의 WriteLine은 그중 한 줄 출력을 담당하는 기능의 이름이다. 괄호 안에는 출력할 내용을 넣는다.
Console.WriteLine("대여 요청은 비품 담당자에게 알린다.")
큰따옴표로 둘러싼 내용은 문자열이다. 문자열은 글자들의 묶음이며, 위 코드에서는 화면에 보여 줄 문장을 뜻한다. 큰따옴표는 내용의 시작과 끝을 표시하는 코드 문법이므로 화면에는 출력되지 않는다. 문장 끝의 마침표는 큰따옴표 안에 있으므로 출력 내용에 포함된다.
코드에 사용하는 큰따옴표는 키보드로 입력하는 곧은 형태의 "다. 문서 편집기가 자동으로 바꾸는 둥근 따옴표는 같은 문법 기호로 사용할 수 없다. 안내문은 한국어로 작성해도 되지만, 명령 이름과 괄호 등은 예제의 형태를 그대로 유지한다.
여러 개의 Console.WriteLine을 적으면 위에서 아래 순서로 실행된다. 첫 번째 호출은 첫 줄을 쓰고, 두 번째 호출은 다음 줄을 쓴다. 이번 프로그램에는 실행 순서를 바꾸는 문장이 없으므로 코드에 적힌 출력 순서가 화면에 나타나는 순서가 된다.
마지막 출력이 끝나면 Main의 끝에 도달하고 프로그램이 종료된다. 종료 후에는 터미널이 다시 명령 입력을 받을 수 있는 상태로 돌아온다. 사용자의 확인 입력을 기다리는 명령을 넣지 않았으므로 추가 키를 누를 필요가 없다.
Option Strict On을 처음부터 적기
완성 코드의 첫 줄에는 Option Strict On을 둔다. 이 설정은 데이터 형식과 관련해 느슨하게 처리될 수 있는 일부 코드 사용을 제한하고, 문제를 컴파일 과정에서 발견하도록 돕는다. 데이터 형식은 값이 숫자인지 글자인지처럼 값의 종류를 구분하는 기준이다.
이번 프로그램은 고정된 문장만 출력하므로 설정의 차이가 눈에 드러나지 않는다. 그래도 처음부터 같은 기준으로 작성해 두면 다음 장에서 값을 다루기 시작할 때 작업 방식이 이어진다. 구체적으로 어떤 변환과 사용이 제한되는지는 변수와 데이터 형식을 배울 때 확인한다.
파일에 적은 Option Strict On은 그 소스 파일에 적용된다. 프로젝트 전체에 적용하는 설정 방법도 있지만, 이번 완성 프로그램은 소스 파일 하나이므로 첫 줄의 설정으로 충분하다. 이 줄은 모듈 바깥에 둔다. 화면 출력을 지시하는 명령이 아니라 컴파일할 때 적용할 옵션이기 때문이다.
완성 코드
생성된 Program.vb의 내용을 아래 코드로 모두 교체하고 저장한다. 기존에 있던 모듈이나 Main을 남겨 둔 채 덧붙이지 않는다. 다음 프로그램은 하나의 파일로 완성되며, .NET 10 Visual Basic 콘솔 프로젝트에서 별도의 추가 기능 없이 실행할 수 있다.
Option Strict On
Module Program
Sub Main()
Console.WriteLine("사무실 비품 대여 안내")
Console.WriteLine("--------------------")
Console.WriteLine("등록 비품")
Console.WriteLine("NB-01 | 노트북 | 회의 자료 작성")
Console.WriteLine("NB-02 | 노트북 | 외근 업무")
Console.WriteLine("PJ-01 | 프로젝터 | 회의실 발표")
Console.WriteLine("--------------------")
Console.WriteLine("대여 요청: 비품 담당자에게 알린다.")
Console.WriteLine("반납 안내: 사용을 마치면 담당자에게 알린다.")
Console.WriteLine("안내를 마친다.")
End Sub
End Module
비품 번호는 안내문 안에 직접 적었다. NB-01과 PJ-01은 이 사무실에서 비품을 구분하기로 한 표시다. 프로그램이 번호를 생성하거나 의미를 분석하지는 않는다. 세로줄 기호도 단순히 문구를 나누는 글자이며, 특별한 계산을 수행하지 않는다.
이 프로그램에는 시간, 무작위 값, 사용자의 입력처럼 출력 내용을 바꾸는 요소가 없다. 파일을 수정하지 않는 한 실행 결과는 같다. 안내가 끝난 뒤 대여 신청을 받지 않는 것도 현재 요구 사항에 따른 동작이다.
줄별 해설
아래 줄 번호는 완성 코드의 빈 줄까지 포함해 센 것이다. 줄 번호는 설명용이며 소스 파일에 입력하지 않는다. 코드를 읽을 때는 먼저 바깥 구조를 확인하고, 그 안에 있는 출력 문장을 순서대로 따라간다.
| 줄 | 코드 또는 내용 | 역할 |
|---|---|---|
| 1 | Option Strict On | 이 파일에 엄격한 형식 검사 규칙을 적용한다. |
| 2 | 빈 줄 | 설정과 프로그램 구조를 읽기 쉽게 나눈다. |
| 3 | Module Program | Program 모듈을 시작한다. |
| 4 | Sub Main() | 프로그램의 시작 작업을 선언한다. |
| 5 | 프로그램 제목 출력 | 안내가 어떤 업무에 관한 것인지 보여 준다. |
| 6 | 첫 구분선 출력 | 제목과 목록을 시각적으로 구분한다. |
| 7 | 등록 비품 문구 출력 | 뒤따르는 세 줄이 비품 목록임을 알린다. |
| 8 | NB-01 안내 출력 | 첫 번째 노트북과 용도를 보여 준다. |
| 9 | NB-02 안내 출력 | 두 번째 노트북과 용도를 보여 준다. |
| 10 | PJ-01 안내 출력 | 프로젝터와 용도를 보여 준다. |
| 11 | 둘째 구분선 출력 | 비품 목록과 이용 안내를 구분한다. |
| 12 | 대여 요청 문구 출력 | 대여를 요청할 대상을 안내한다. |
| 13 | 반납 안내 문구 출력 | 반납 사실을 알릴 대상을 안내한다. |
| 14 | 안내 종료 문구 출력 | 안내문의 마지막 문장을 보여 준다. |
| 15 | End Sub | Main의 범위를 닫는다. |
| 16 | End Module | Program 모듈의 범위를 닫는다. |
5줄부터 14줄까지는 각각 화면에 한 줄을 출력한다. 따라서 프로그램이 쓰는 줄은 모두 열 줄이다. 코드의 2줄에 있는 빈 줄은 화면의 빈 줄로 바뀌지 않는다. 소스 코드의 배치와 프로그램의 출력은 서로 다른 것이다. 화면에 어떤 내용을 보여 줄지는 출력 명령이 결정한다.
6줄과 11줄의 구분선도 출력 문장이다. 하이픈을 여러 개 나열한 문자열을 출력했기 때문에 화면에 선처럼 보인다. 터미널의 폭을 측정해 선을 그리는 기능을 사용한 것은 아니다. 여기서는 정해진 문구를 그대로 보여 주는 데 집중한다.
들여쓰기는 범위를 읽는 데 도움을 준다. Sub Main()은 모듈 안에 있으므로 한 단계 들여쓰고, 출력 문장은 프로시저 안에 있으므로 한 단계 더 들여쓴다. 시작과 끝을 짝지어 보면 End Sub와 End Module이 각각 어디에 대응하는지 확인할 수 있다.
Visual Basic은 명령 이름의 대문자와 소문자를 구분하지 않는다. 다만 이 책에서는 Module, Sub Main, Console.WriteLine처럼 일관된 표기를 사용한다. 문자열 안의 글자는 출력 내용이므로 철자와 대소문자를 바꾸면 화면에 나타나는 내용도 바뀐다.
실행 결과
파일을 저장한 뒤 프로젝트 폴더에서 다음 명령을 실행한다. dotnet run은 필요한 빌드 후 프로그램을 실행한다. 완성 코드에는 경고나 오류를 일으키는 코드가 없으며, 정상적인 .NET 10 SDK 환경에서는 안내를 출력하고 종료한다.
dotnet run
프로그램의 예상 출력은 다음과 같다. 터미널이 명령 입력을 위해 표시하는 사용자 이름이나 폴더 이름은 프로그램 출력에 포함하지 않았다.
사무실 비품 대여 안내
--------------------
등록 비품
NB-01 | 노트북 | 회의 자료 작성
NB-02 | 노트북 | 외근 업무
PJ-01 | 프로젝터 | 회의실 발표
--------------------
대여 요청: 비품 담당자에게 알린다.
반납 안내: 사용을 마치면 담당자에게 알린다.
안내를 마친다.
출력 내용이 다르다면 우선 Program.vb를 저장했는지 확인한다. 그다음 현재 터미널 위치가 해당 프로젝트 폴더인지 확인한다. 마지막으로 큰따옴표 안의 내용을 예상 출력과 비교한다. 프로그램 제목뿐 아니라 공백, 세로줄, 마침표도 출력 문자열의 일부다.
컴파일 오류가 나타났다면 출력 결과를 비교하기 전에 코드의 구조를 고친다. 오류 메시지에 표시되는 파일과 줄 위치는 문제를 찾는 단서다. 특히 따옴표나 괄호가 빠진 경우에는 표시된 줄과 그 앞줄을 함께 확인하면 도움이 된다. 수정한 파일을 저장하고 같은 명령을 다시 실행한다.
프로그램이 끝나고 터미널에서 다음 명령을 입력할 수 있다면 정상적으로 종료된 것이다. 이 예제는 실행 중인 화면을 계속 유지하는 프로그램이 아니다. 다시 안내를 보고 싶다면 dotnet run을 한 번 더 실행한다.
실무에서 자주 틀리는 것
출력할 문장에 큰따옴표를 빠뜨린다
사람이 읽으면 안내 문구로 보이더라도, 컴파일러는 따옴표 없는 글자를 문자열로 취급하지 않는다. 출력할 문장을 큰따옴표로 감싸야 한다. 아래 조각은 완성 코드의 Main 안에서 비교하는 예다.
틀린 코드다.
Console.WriteLine(등록 비품)
고친 코드다.
Console.WriteLine("등록 비품")
따옴표는 문장을 화면에 장식하려고 붙이는 것이 아니다. 이 부분이 출력할 글자라는 사실을 코드에 표시한다. 여는 따옴표와 닫는 따옴표가 모두 있는지도 확인한다.
프로시저와 모듈의 끝을 뒤바꾼다
안쪽 범위를 먼저 닫고 바깥쪽 범위를 나중에 닫아야 한다. Main이 모듈 안에 있으므로 End Sub가 End Module보다 먼저 나온다. 아래 예에서 첫 줄의 설정은 같고, 범위를 닫는 순서가 다르다.
틀린 코드다.
Option Strict On
Module Program
Sub Main()
Console.WriteLine("안내를 시작한다.")
End Module
End Sub
고친 코드다.
Option Strict On
Module Program
Sub Main()
Console.WriteLine("안내를 시작한다.")
End Sub
End Module
닫는 문장을 추가할 때는 가장 가까이 열린 범위를 먼저 찾는다. 들여쓰기를 맞춰 두면 짝이 어긋난 부분이 눈에 잘 들어온다. 오류를 고치려고 끝 문장을 무작정 더 붙이기보다 시작과 끝을 하나씩 대응시킨다.
출력 명령을 Main 바깥에 둔다
모듈 안이라고 해서 모든 위치에 실행 문장을 놓을 수 있는 것은 아니다. 이번 프로그램의 출력 명령은 Main의 실행 범위 안에 있어야 한다. 모듈 바로 아래에 적으면 이 구조에서 올바른 실행 문장이 되지 않는다.
틀린 코드다.
Option Strict On
Module Program
Console.WriteLine("등록 비품")
Sub Main()
End Sub
End Module
고친 코드다.
Option Strict On
Module Program
Sub Main()
Console.WriteLine("등록 비품")
End Sub
End Module
Option Strict On의 위치와 출력 명령의 위치도 구분한다. 옵션은 파일의 맨 위에 두고, 실행할 출력 명령은 Main 안에 둔다. 둘은 프로그램에 관여하는 방식이 다르다.
한눈에 보기
첫 프로그램을 만들 때는 생성 명령, 파일의 역할, 실행 구조를 함께 기억한다. 출력 문구를 바꾸는 작은 수정이라도 파일을 저장한 뒤 프로젝트 폴더에서 다시 실행해 결과를 확인한다.
| 항목 | 사용 형태 | 기억할 점 |
|---|---|---|
| 프로젝트 생성 | dotnet new console -lang VB | 빈 작업 폴더에서 Visual Basic 콘솔 구성을 만든다. |
| 소스 파일 | Program.vb | 실행할 코드와 출력 문구를 작성한다. |
| 프로젝트 파일 | OfficeEquipment.vbproj | 출력 종류와 대상 .NET 버전 등을 설정한다. |
| 파일 옵션 | Option Strict On | 모듈 위에 적어 해당 파일에 적용한다. |
| 코드의 바깥 범위 | Module Program | End Module로 닫는다. |
| 실행 시작점 | Sub Main() | 출력 명령을 안에 넣고 End Sub로 닫는다. |
| 한 줄 출력 | Console.WriteLine("내용") | 내용을 출력하고 다음 줄로 이동한다. |
| 실행 | dotnet run | 프로젝트 폴더에서 빌드하고 실행한다. |
현재 안내문은 코드에 고정되어 있다. 비품 이름이나 수량을 별도로 보관하려면 값을 다루는 방법이 필요하다. 다음 장에서는 변수와 데이터 형식을 배우면서 Option Strict On이 실제 코드 작성에 어떤 영향을 주는지 살펴본다.
연습 문제
- 완성 코드의 제목을
공용 비품 이용 안내로 바꾼다. 수정할 파일과 문장을 적고, 변경 후 첫 번째 출력 줄을 적는다. - 프로젝터 안내 바로 다음에
SC-01 | 스캐너 | 종이 문서 정리를 출력하도록 한 줄을 추가한다. 추가할 코드와 위치를 적고, 프로그램이 출력하는 전체 줄 수를 구한다. Sub Main(),Console.WriteLine("안내를 시작한다."),End Sub,Module Program,End Module을 올바른 순서로 배치한다. 파일 맨 위에Option Strict On도 넣어 실행 가능한 전체 코드를 작성한다.- 빈
SupplyGuide폴더로 이미 이동했다고 가정한다. Visual Basic 콘솔 프로젝트를 만드는 명령, 생성되는 프로젝트 파일 이름, 프로그램을 실행하는 명령을 각각 적는다. 프로젝트가 .NET 10을 대상으로 하는지 확인할 설정도 적는다.
정답과 해설
1. 제목 바꾸기
수정할 파일은 Program.vb다. Main 안의 첫 번째 출력 문장을 다음과 같이 바꾼다. 프로젝트 설정을 바꾸는 작업이 아니므로 .vbproj 파일은 이 수정의 대상이 아니다.
Console.WriteLine("공용 비품 이용 안내")
변경 후 첫 번째 출력 줄은 다음과 같다. 문자열의 경계를 표시한 큰따옴표는 출력되지 않는다.
공용 비품 이용 안내
2. 스캐너 안내 추가하기
프로젝터를 출력하는 문장 바로 아래, 두 번째 구분선을 출력하는 문장 바로 위에 새 문장을 넣는다. 해당 부분은 다음과 같다.
Console.WriteLine("PJ-01 | 프로젝터 | 회의실 발표")
Console.WriteLine("SC-01 | 스캐너 | 종이 문서 정리")
Console.WriteLine("--------------------")
기존 출력은 열 줄이고, 새 출력 명령 하나가 한 줄을 더하므로 전체 출력은 열한 줄이다. 소스 코드에 빈 줄을 넣는 것과 출력 명령을 추가하는 것은 다르다. 여기서는 실제 출력 명령을 하나 추가했다.
3. 프로그램 구조 배치하기
모듈을 먼저 열고 그 안에 Main을 둔다. 출력 명령은 Main 안에 배치한다. 닫을 때는 안쪽 프로시저부터 닫는다. 완성된 코드는 다음과 같다.
Option Strict On
Module Program
Sub Main()
Console.WriteLine("안내를 시작한다.")
End Sub
End Module
이 프로그램은 안내를 시작한다.를 한 줄 출력하고 끝난다. 출력 문장 하나만 있어도 모듈과 시작 프로시저라는 기본 구조는 유지된다.
4. 생성 명령과 프로젝트 설정 확인하기
현재 폴더에서 프로젝트를 만드는 명령은 다음과 같다.
dotnet new console -lang VB
기본 이름을 사용하면 프로젝트 파일은 SupplyGuide.vbproj다. 프로그램을 실행하는 명령은 다음과 같다.
dotnet run
대상 버전은 프로젝트 파일의 다음 설정으로 확인한다. SDK 버전을 확인하는 명령과 프로젝트의 대상 버전 설정은 서로 구분한다. 하나는 개발 도구의 버전이고, 다른 하나는 프로그램이 대상으로 삼는 .NET 버전이다.
<TargetFramework>net10.0</TargetFramework>
READER FEEDBACK
질문·의견
내용에 관한 질문이나 더 나은 설명을 위한 의견을 남겨 주세요. 오탈자는 위의 제보 양식이 더 빨리 반영됩니다. 이 댓글은 원래 게시글과 같은 자리에 쌓입니다.
댓글 0
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.