1. 준비하기
먼저 시작하기 전에 사용자의 컴퓨터에 Visual Studio의 최신버전이 설치되어 있다는 가정하게 시작합니다. 그러니 Microsoft 홈페이지에서 Visual Studio를 내려받아 설치해 주시기 바랍니다. 버전은 특별한 경우가 아니라면 Community 버전(기본적으로 무료이긴 하지만 조건이 있습니다. 라이센스를 잘 확인해 보시기 바랍니다.)을 설치하도록 합니다.
아울러 Visual Studio Code도 설치해 주세요. 사실 Visual Studio가 .NET을 개발하는데 가장 좋은 도구이기는 하지만 Visual Studio Code또한 널리 사용되는 편집기로서 종종 유용하게 사용되는 경우가 많습니다.
2. C# 프로그램 만들어 보기
Visual Studio Code를 설치했으면 적당한 폴더를 생성해 다음과 같은 내용으로 cs파일을 만들어 봅니다. 파일명은 임의로 정해도 상관없습니다. 참고로 예제에서는 test.cs로 하였습니다.
using System;
using static System.Console;
namespace Test
{
class MyTestApp
{
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("입력값이 없습니다.");
return;
}
WriteLine("입력값 : {0}", args[0]);
}
}
}
파일을 만들었으면 Visual Studio가 설치된 폴더에서 Developer Command Prompt for VS 2019를 찾아 실행합니다.
그러면 전용 명령창이 실행될텐데 거기에서 cd 명령으로 위의 파일을 생성한 폴더를 찾아가도록 합니다. 폴더를 찾아갔으면 'csc <파일명>'형식으로 파일을 컴파일합니다. 만약 Visaul Studio에서 코드를 입력한 경우라면 Ctrl + Shift + B 키를 눌러 프로젝트를 빌드하면 됩니다.
컴파일하고 나면 같은 폴더에 .exe 파일이 생성됩니다. Visual Studio에서 프로젝트를 생성한 경우라면 bin폴더에 실행파일이 생성됩니다. 그럼 바로 파일명을 입력해 프로그램을 실행해 보도록 하죠.
3. 소스코드 파악하기
2번에서 입력한 코드를 흔히 소스코드라고 합니다. 소스코드를 다시 보면 제일 위에 다음과 같은 1줄의 문장을 볼 수 있습니다.
using System;
using은 무엇인가를 사용하겠다는 C#언어에서 사용되는 키워드 구문입니다. 키워드라 함은 특별히 기능이 정의된 단어를 의미하는데 이미 사용목적이 정해져 있으므로 우리가 프로그램을 만들때 변수명을 using으로 하는 등의 행위를 피해야 합니다. 다만 키워드가 포함된 단어 예컨데 usings등은 사용이 가능하지만 자칫 소스코드를 해석할때 혼동의 여지가 있으므로 되도록 키워드를 이러한 식별자(이름)로 만들어서는 안됩니다.
뒤이어 System은 네임스페이스를 의미합니다. 네임스페이스란 일종의 클래스 모음인데 네임스페이스와 클래스에 관해서는 향후 자세히 알아볼 기회가 있을 것입니다.
결국 using System은 System네임스페이스에 속해있는 모든 클래스를 사용하겠다는 것을 의미합니다. System네임스페이스에는 Console이라는 클래스가 포함되어 있는데 이때문에 소스코드상에서 Console.WriteLine()와 같은 방법으로 메서드를 호출하는 것이 가능해 지는 것입니다. 만약 using System을 사용하지 않았다면 System.Console.WriteLine()과 같이 코드를 길게 늘여서 WriteLine()메서드를 호출해야 했을 것입니다. using System이 없는 채로 Console.WriteLine()를 사용하려 한다면 오류가 발생하게 되는데 Console이라는 클래스를 어디서 찾아봐야 할지 컴파일도 알 수 없기 때문입니다.
마지막으로 ;(세미콜론)은 C#에서 문장이 끝났음을 알려주는 역활을 합니다. C#에서 하나의 덩어리를 갖는 문장은 눈에 보이는 엔터키를 입력한 부분까지가 아니라 ;기준임을 아는 것이 중요합니다. 따라서 다음과 같은 문장도
string s = "abcde" +
"fghij" +
"klmno";
하나의 정상적인 문장으로서 취급됩니다. 반대로 한줄로 늘여쓴
int i = 10; int j = 20; int x = 30;
위의 코드도 정상입니다. ;문자로 해석될 수 있는 문장이 구분되므로 아무런 문제가 없습니다.
두번째 문장으로 다음과 같은 내용이 있는데
using static System.Console;
이 코드는 위에서 언급한 방법으로 해석하면 System.Console클래스를 사용하겠다는 것을 의미합니다. 그런데 static이라는 키워드가 추가로 붙어있습니다. 이 것은 'System.Console이라는 정적클래스를 사용하겠다.'라고 명시하는 것입니다. 원래 using뒤에는 네임스페이스(Namespace)만 올 수 있지만 static을 통해서 필요한 특정 정적클래스를 명시하는 것도 가능합니다.
이러한 방법 때문에 소스코드의 16행처럼 System.Console 정적클래스 하위에 있는 정적메서드인 WriteLine을 바로 사용할 수 있는 것입니다. 위에서 사용한 Console.WriteLine부분도 역시 Console.을 생략하고 WriteLine만 남겨둘 수 있습니다.
namespace Test
위 구문은 우리의 프로그램에서 Test라는 네임스페이스를 만들것임을 알려주고 있습니다. 네임스페이스는 클래스의 모음이라고 얘기했었는데 특정 용도나 목적에 의해 만들어진 클래스들을 분류하는 역활을 수행합니다. 예를 들어 System.IO 네임스페이스에는 입출력에 관한 클래스, 구조체, 인터페이스등이 포함되어 있고 System.Net 네임스페이스에는 네트워크에 관한 클래스, 구조체, 인터페이스등이 포함되어 있습니다.
.NET에서는 프로그램개발에 유용하게 사용할 수 있는 수많은 클래스 라이브러리를 제공하고 있고 우리의 프로그램도 Test라는 네임스페이스를 만들어 그 하위에 프로그램의 목적에 맞는 여러 클래스와 구조체, 인터페이스등을 만들게 됩니다. 이렇게 많은 클래스와 구조체, 인터페이스등을 혼동없이 사용할 수 있는 이유는 네임스페이스가 적당히 이들 클래스들을 나뉘어 주고 있기 때문입니다.
class MyTestApp
네임스페이스 밑에 있는 class는 MyTestApp이라는 클래스의 생성을 의미합니다. 클래스는 C#프로그램의 기본 골격이 되는 것으로 프로그램에서 다루어질 데이터와 그 데이터를 처리하는 각종 메서드들을 포함합니다. 클래스에 관해서는 계속해서 다루게 될 것이므로 일단 프로그램이 기본 구조가 된다는 것만 알고 넘어가도록 합니다.
static void Main(string[] args)
우리가 만든 클래스안에는 Main이라는 하나의 정적메서드를 생성하고 있습니다. Main메서드가 정적메서드라는 것은 static이 말해주고 있습니다. C# 프로그램은 보통 어떤 메서드가 있으면 그 메서드의 코드가 실행되는 시점에 메모리를 할당받아 실행하게 되는데 메서드가 static에 의해 정적메서드로 선언되면 프로그램이 실행되자마자 곧바로 메모리에 할당됩니다.
Main메서드는 프로그램이 시작되는 주 진입점에 해당하는데 이 메서드가 정적메서드가 아닌 일반메서드로 만들어 진다면(물론 오류가 나서 컴파일 자체가 안되겠지만) CLR(Common Language Runtime)이 프로그램이 시작되는 주 진업점을 찾을 수 없게 되므로 프로그램실행이 불가능하게 됩니다. Main메서드를 실행시켜 주는 주체가 아무것도 없기 때문에 메모리에 할당되는 것 자체가 불가능한 것이죠.
static뒤에 있는 void는 Main메서드의 실행이 끝나면 아무런 값도 반환하지 않음을 의미합니다. 특정 메서드가 종료될때 정수형태의 숫자를 반환한다면 int등의 키워드가 올 수 있겠지만 Main메서드의 경우에는 프로그램의 시작점에 해당하는 메서드로 값을 받아줄 주체가 없기 때문에 반환값을 가진다는 것 자체가 무의미합니다.
Main메서드는 또한 string형식의 배열을 매개변수로 받고 있습니다. 프로그램을 실행할때 프로그램명 뒤에 입력한 내용이 매개변수이며 그 값은 args에 저장됩니다. args는 string형식의 배열이기 때문에 프로그램 뒤에 공백을 두고 여러개의 값을 입력하면 해당 하는 값이 그대로 배열로 저장될 것입니다. 배열에 관해서는 다음번 포스팅에서 자세히 알아보도록 하고 지금은 여러개의 값을 저장한다는 개념정도만 알고 있으면 됩니다.
Main메서드는 중괄호({})를 통해 메서드의 본문이 이루어 지는데 { 로 시작해 } 를 만나면 메서드의 실행이 종료되는 구조입니다.
if (args.Length == 0)
{
WriteLine("입력값이 없습니다.");
return;
}
if문은 C#에서 사용할 수 있는 제어문중 하나로서 특정한 조건이 참인지 거짓인지를 판단합니다. 제어문에 관해서는 나중에 자세하게 알아볼 것입니다.
위에서 우리가 입력한 값이 args로 넘어온다고 했었는데 이 args가 특정 값을 가지고 있는지는 args의 Length속성을 통해 판단할 수 있습니다. 이 속성의 값이 0 이라면 args는 아무런값도 가지지 않음을 의미하고 if문에 의해 참으로 판단됩니다. 그러면 if 내부에 중괄호 블록부분으로 분기되면서 '입력값이 없습니다.'라는 메세지를 표시하고 return에 의해 프로그램은 중지될 것입니다.
4. CLR(Common Language Runtime)
프로그램을 실행시키는 주체로서 C#과 같이 .NET으로 만들어진 프로그램을 실행하는 역활을 수행합니다. .NET 프로그램은 컴파일되면 해당 하드웨어에 종속적인 기계어로 바로 컴파일되는 것이 아니라 IL(Intermediate Language 또는 Common Intermediate Language라고도 함)이라고 하는 중간언어로 컴파일됩니다.
IL은 하드웨어가 실행할 수 있는 기계어가 아니기에 운영체제가 곧바로 실행할 수 없고 사용자가 프로그램을 실행할 때마다 CLR이 대신 그때그때 IL로 된 파일을 읽어 다시 네이티브로 컴파일시켜 실행하게 됩니다. 이러한 방식을 JIT(Just In Time)이라고 하는데 이 방식의 이점은 어떠한 시스템이든 CLR(.NET)만 있으면 .NET 프로그램을 실행할 수 있다는 것이지만 성능면에서는 곧바로 네이티브로 컴파일되는 언어에 비해 다소 떨어진다는 단점이 있습니다.
또한 CLR은 단순히 프로그램을 실행하는 역활뿐만 아니라 가비지컬렉션(Garbage Collection)이라고 하는 메모리관리기능, 프로그램에서 오류가 발생했을때 이를 처리해 주는 예외처리기능등 프로그램 실행에 필요한 전체적인 기능을 갖추고 있습니다.
'.NET > C#' 카테고리의 다른 글
[C#] 메서드 (0) | 2021.09.27 |
---|---|
[C#] 제어문 (0) | 2021.09.24 |
[C#] 연산자 (0) | 2021.09.23 |
[C#] 데이터 (2) | 2021.09.23 |
[C#] MySQL(MariaDB) EntityFramework 사용하기 (0) | 2020.06.04 |