지금까지 VSCode에서 C#개발을 위해 필요한 설정사항들과 주요 기능들을 알아보았습니다. 여기서 계속 앞으로 나가기 전에 필요한 것이 정확히 설치되었는지, 잘 작동하는지 여부를 확인해 보시기 바랍니다. 준비가 되었다면 VSCode에서 C# Console Application Project를 생성해 보도록 하겠습니다.
1. TestApp Project 생성
VSCode를 실행하고 Ctrl+Shift+P key를 눌러 Command Palette를 표시합니다. 그런 다음 Option List에서 .NET: New Project... 부분을 선택해 줍니다.
그런 다음 Project 유형을 선택을 선택해야 하는데 당장은 Console기반 App을 생성할 것이므로 Console App Project template를 선택해 줍니다.
일단 Project template이 선택되고 나면 VSCode는 생성할 Project의 이름을 입력할 수 있는 화면을 표시할 텐데 위에서 이미 언급했듯이 Project는 Workspace안에 포함되므로 이에 필요한 Workspace folder를 원하는 위치에 먼저 생성해 둬야 합니다. Workspace Folder를 만들고 나면 다시 VSCode로 돌아가 Console App Project를 해당 Workspace Folder안에 생성합니다.
2. TestApp Project 살펴보기
이렇게 하여 첫 번째 C# Project를 생성해 보았습니다. VSCode가 Project를 생성하기 위해 만든 File과 Folder는 Explorer Panel을 통해 확인해 볼 수 있습니다. Explorer Panel이 보이지 않으면 왼쪽 Action Bar button을 사용해 표시할 수 있습니다.
Explorer에서는 우리가 생성한 MyWorkspace folder와 TestApp을 다음과 같이 확인할 수 있습니다.(꺽쇠 화살표를 Click 하면 하위 Folder의 내용을 순차적으로 확인할 수 있습니다.)
TestApp Project를 보면 내부에 bin과 obj라는 2개의 Folder를 볼 수 있는데 해당 Folder는 Application을 Compile 하고 실행할 때 사용되는 Folder입니다. TestApp.csproj file은 Project의 설정사항들을 저장하는 File인데 해당 File을 선택하면 Editor Panel을 통해서 해당 File의 내용을 확인하실 수 있습니다.
또한 이와는 별개로 VSCode는 sln확장자의 File도 생성하는데 해당 File은 Workspace Project의 참조를 포함하고 있는 File입니다. 그리고 가장 중요한 Program.cs File은 실제 우리가 필요한 Code를 작성하는 File로서 실질적으로 Program이 구현되는 File입니다.
3. Code 작성해 보기
Program.cs file은 Program이 처음 실행될 때 진입하는 주진입점이 되며 여기에 필요한 Code를 작성할 수 있습니다. 즉, 우리가 App을 Compile 하고 실행할 때 Program.cs file에 있는 Code의 첫 번째 행부터 실행이 시작된다고 할 수 있는 것입니다. Program.cs file을 선택하면 editor안으로 다음과 같은 file의 내용이 표시될 것입니다.
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
위 내용 중 첫번째 줄은 우리에게 file이 새로운 Console Template을 사용하고 있음을 알려주는 주석에 해당합니다. 여기서 말하는 Template은 꽤 중요한 부분인데 잠시 후에 자세히 알아보기로 하고 계속해서 두 번째 줄로 넘어가 보도록 하겠습니다.
두 번째 줄 Code는 Console class에 내장된 WriteLine() Method를 사용하여 Terminal window로 Message를 표시하는 부분입니다. 이 상태에서 Editor우측 상단에 있는 Run button을 Click 해 보면
Build Process가 시작되는데 이 과정은 Panel아래의 Terminal을 통해 확인해 볼 수 있으며 몇 가지 절차를 거친 후 비로소 "Hello, World!"라는 표시가 나타남을 알 수 있습니다.
Terminal은 VSCode뿐만 아니라 일반 Terminal과 동등하게 상호작용이 가능하므로 Windows나 Linux, macOS상에서의 일반적인 Terminal에서 입력했던 다른 명령 역시 사용할 수 있습니다.
다시 Editor로 돌아가 아래 구문을 추가합니다.
Console.Write("What your name?");
var userName = Console.ReadLine();
Console.WriteLine($"Walcome to C#! {userName}");
ReadLine Method를 호출하면 keyboard입력을 대기하게 되고 이때 입력한 문자열값을 userName이라는 변수에 저장하게 됩니다. 따라서 위 App을 다시 실행하면 다음과 같은 결과를 확인할 수 있습니다.(결괏값은 입력값에 따라 달라집니다.)
Hello, World! What your name? kim Walcome to C#! kim |
4. Top-Level 구문과 Main method
위 예제는 다른 Programming 언어에 익숙한 사람에게는 괄호를 사용한 구조화나 Compiler에 대한 주변 Code구조나 명령어가 없이도 Code를 작성하고 실행할 수 있다는 점에서 생소하게 느껴질 수도 있습니다. C#과 같은 언어는 일반적으로 Class명이나 Framework의존성을 Import 하기 위한 지시문 등이 추가적으로 필요한데 예를 들어 예제의 Program.cs file 역시 Console class에 속하는 Method를 호출하고 있으며 Console class는 다시 System namespace에 속하는 구조로 이루어져 있습니다. 하지만 예제를 보면 실제로 Code상에서 Namespace를 Import해주는 부분은 보이지 않습니다.
이것 외에 일반적으로 필요한 또 다른 사항으로는 Program실행을 위해 맨 처음 진입해야 하는 시작지점을 Code상에서 지정해야 한다는 것입니다. 많은 Programming언어에서는 특별하게 사용되는 Main 함수나 초기화를 담당하는 별도의 Method가 존재합니다. 그렇다면 어째서 예제의 C# Code는 이러한 부분을 구현하지 않았을까?
사실 이와 같은 사항은 C#에서도 동일하게 필요한 부분이지만 대신 Compiler가 Compile전 전처리 과정을 통해서 자동적으로 이러한 Code를 생성해 주고 있기 때문이며 그러한 이유로 필수적으로 필요한 부분을 일일이 구현할 필요가 없습니다.(C#세계에서 이러한 구조를 Top-Level 구문이라고 합니다.)
예제에서 우리는 단지 4줄 정도의 Code만 작성했을 뿐이지만 실제 Code를 Compile 해 보면 아마도 아래와 비슷한 결과물을 생성하게 될 것입니다.
using System;
namespace SampleApp
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
Console.Write("What your name?");
var userName = Console.ReadLine();
Console.WriteLine($"Walcome to C#! {userName}");
}
}
}
상기 Code에서는 지시자를 사용하여 Compiler에게 System이라는 Namespace가 Import 됨을 알려주고 있습니다. 또한 Internal Class는 SampleApp이라는 Namespace로 감싸져 있는 형태를 이루고 있으며 이러한 구조를 통해 전체적으로 C# Code는 Class와 변수 Method를 포함하고 있는 형태가 됩니다. 그리고 이러한 다양한 요소에는 각기 이름이 보여 됨을 알 수 있습니다. Namespace는 Application Code가 분류될 수 있는 영역을 의미하며 따라서 하나의 Workspace의 이름이 다른 Workspace의 동일한 이름과 충돌을 방지할 수 있습니다. 참고로 Namespace외부에서의 모든 선언은 Global Namespace의 영역에 해당합니다.
SampleApp Namespace안에서 Program Class가 선언되며 그 안에서 Main() Method가 존재하고 다시 더 들어가 Main() Method안에서 우리가 필요한 Code를 포함하게 됩니다.
하지만 결과적으로 우리는 Program.cs file안에서 우리가 필요한 상기의 Code를 작성하는 것만으로 이러한 Console template을 그대로 사용할 수 있습니다. 어떤 형태의 구조를 사용할지는 개인적인 선호도에 따라 달라지겠지만 이전 예제와 같은 구문을 수동적으로 선언해야 하는 상황이 발생할 수 있습니다. 따라서 뒤에서 어떤 동작이 일어나는지를 잘 이해해 둘 필요가 있습니다.
'.NET > C#' 카테고리의 다른 글
[C# 13과 .NET 9] C#변수와 상수 - 6 (0) | 2024.12.05 |
---|---|
[C# 13과 .NET 9] Visual Studio Code 둘러보기 - 4 (0) | 2024.11.27 |
[C# 13과 .NET 9] Visual Studio Code와 .NET9 설치하기 - 3 (1) | 2024.11.26 |
[C# 13과 .NET 9] C# 구조 - 2 (1) | 2024.11.19 |
[C# 13과 .NET 9] C# Programming 언어 - 1 (1) | 2024.11.15 |