[문과 코린이의 IT 기록장] C# - C# 기초 이해하기 (using System이란?, using static System.Console;, namespace _2021_03_02 { }, class MainApp { }, static void Main(string [] args) { }, CLR이란?)
[문과 코린이의 IT 기록장] C# - C# 기초 이해하기
(using System이란?, using static System.Console;, namespace _2021_03_02 { }, class MainApp { }, static void Main(string [] args) { }, CLR이란?)
ex )
using System;
using static System.Console;
namespace _2021_03_02
{
class MainApp
{
// 프로그램 실행이 시작되는 곳
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("사용법 2021_03_02.exe0 <이름");
return
}
WriteLine("Hello, {0}!", args[0]);
}
}
}
1. using System이란?
ex )
using System; |
1) using~
- C#의 키워드. (~를 사용하겠다)
2) System
- C# 코드가 기본적으로 필요로 하는 클래스를 담고있는, 즉 namespace안에있는 클래스를 사용하겠다고 컴파일러에게 알리는 역할을 함.
cf) 이 문장을 생략했다면, System.Console.WriteLine(...)으로 변경되야 컴파일 됨. (코드의 양을 줄일 수 있다.)
3) ; (세미콜론)
- 컴파일러에게 문장의 끝을 알리는 기호
cf) 세미콜론은 극히 짧은 문장을 한 줄 안에 몰아넣을 때 유용하다. (a=1 ; b=2 ; c=3;)
2. using static System.Console;
- 위에서, 'using System'이, 'System.Console.WriteLine(...)'를 'Console.WriteLine(...)'으로 줄여준다고 이야기했다.
- 이와 같이, 'using static System.Console;'은, 'Console.WriteLine(...)'을 'WriteLine(...)'으로 줄여준다.
* using 키워드만 사용하면, namespace 전체를 사용한다는 의미이다. 그러나, using static은 어떤 데이터 형식(ex. 클래스)의 정적 맴버를 데이터 형식의 이름을 명시하지 않고 참조하겠다고 선언하는 기능을 한다.
** System.Console이 이러한 정적 맴버들을 가지고 있다.
ex )
using System; |
- Console 클래스의 대표적인 정적 맴버는, 콘솔에 데이터를 출력하는 'Write(), WriteLine()' 메소드, 콘솔로부터 데이터를 입력받는 'Read(), ReadLine()'메소드가 있다.
* 메소드란? : 일련의 기능을 수행하는 명령어
3. namespace _2021_03_02 { }
... namespace 네임스페이스_이름{ // 클래스 // 구조체 // 인터페이스 등... } ... |
- 네임스페이스는, 비슷한 클래스 / 구조체 / 인터페이스 / 대리자 / 열거 형식 등을 하나의 이름 아래 묶는 역할을 한다.
- .NET 클래스 라이브러리에 매우 다양한 클래스가 있어도 혼란스럽지 않게 이들을 사용할 수 있는 이유는, 네임스페이스가 이와 같이 용도별/분야별로 정리되어 있기 때문이다.
ex)
: System.IO namespace : 파일 입출력을 다루는 각종 클래스, 구조체, 대리자, 열거 형식 등 존재.
: System.Printing namespace : 인쇄와 관련한 일을 하는 클래스 소속
ex )
... |
4. class MainApp { }
- 클래스 : C# 프로그램을 구성하는 기본 단위로서, 데이터와 데이터를 처리하는 기능(메소드)로 이루어진다. C# 프로그램은 적어도 하나 이상의 클래스로 이루어지며, 수백개의 클래스들로 구성되기도 한다.
ex )
... } |
5. static void Main(string [] args) { }
- static void Main(stirng [] args) { } 메소드는, 프로그램을 시작하면 실행되고, 만약 이 메소드가 종료되면 프로그램도 종료된다.
- 모든 프로그램은 반드시, Main이라는 이름을 가진 메소드를 하나 가지고 있어야 한다.
ex )
... |
1) static
- 한정자 (메소드나 변수 등을 수식한다.)
* C# 프로그램의 각 요소는 코드가 실행되는 시점에 비로소 메모리가 할당되는 반면, static 키워드로 수식되는 코드는 프로그램이 처음 구동될 때부터 진작 메모리에 할당된다는 특징이 있다.
- 프로그램이 실행되면 CLR(Computer Language Runtime)은 프로그램을 메모리에 올린 후, 프로그램의 진입점을 찾는데, 만약 Main() 메소드가 static으로 수식되어 있지 않으면, CLR은 진입점을 찾지 못하고 에러 메세지를 남기게 된다.
2) void
- 메소드의 반환 형식
* void : 어떤 형태로도 반환해주지 않을 것이다.
3) Main ()
- 메소드의 이름
4) string [] args
- 메소드에 입력되는 매개변수
- 프로그램을 실행할 때 입력하는 매개변수
* cf) 2021_03_02.exe로 C# 명령을 실행하면, C#이 바로 이 args에 입력된 것
5) 코드 블록 { }
- 메소드가 실행될 때, 실행할 세부 코드를 담는다.
6) if(args.Length ==0) { }
- 2021_03_02.exe는 실행할 때 매개변수를 요구한다. 만약 '2021_03_02.exe'로만 실행하면 사용법에 대한 설명을 출력하고 종료한다.
- 프로그램을 잘못 사용할 때, 사용자에게 if코드를 통해 안내문을 출력한다.
ex) if(args.Length ==0)을 통해, 매개변수 목록의 길이가 0일 때 안내문을 출력하고 프로그램을 종료시키도록 한다. return은 메소드를 종료하는 용도로만 사용되었다.
* 실제 return은, 메소드의 호출자에게 메소드 실행 결과를 돌려주는 역할을 한다.
6. CLR이란?
- C#으로 만든 프로그램은 CLR(Computer Language Runtime) 위에서 실행된다.
- CLR은 .NET 라이브러리와 함께 OS 위에 설치된다.
- 네이티브 코드로 작성된 프로그램들은 운영체제가 직접 실행할 수 있지만, C# 컴파일러가 만들어낸 실행 파일은 하드웨어가 이해할 수 없는 코드로 구성되어 있어, 실행할 수 없다.
- C# 컴파일러는 C# 소스 코드를 컴파일해, IL이라는 중간 언어로 작성된 실행 파일을 만들어 낸다. 사용자가 이 파일을 실행시키면, CLR이 중간 코드를 읽어들여 하드웨어가 이해할 수 있는 언어(네이티브 코드)로 컴파일한 후 실행시킨다.
이를 적시(JIT) 컴파일 이라고 한다.
* 컴파일을 두 번 하는 이유 ? : CLR은 다른 언어도 지원하도록 설계되었다. 서로 다른 언어들이 만나기 위한 지점이 IL이라는 중간언어이고, 이 언어로 쓰인 코드를 CLR이 다시 자신이 설치된 플랫폼에 최적화시켜 컴파일한 후 실행시키는 것이다. 즉, 이로 인한 장점은, 플랫폼에 최적화된 코드를 만들어낼 수 있다는 것이며, 단점은 컴파일 비용의 부담이다.
- CLR은 단순히, C#이나 기타 언어들을 동작시키는 환경 기능 외에도, 프로그램의 오류(예외)가 발생했을 때 이를 처리하도록 도와주는 기능, 언어 간의 상속 지원, COM과의 상호 운영성 지원, 자동 메모리 관리 등의 기능(가비지 컬렉션)을 제공한다.
* 가비지 컬렉션(Garbage Collection)이란? : 프로그램에서 더 이상 사용하지 않는 메모리를 쓰레기로 간주하고, 수거하는 기능을 말한다.
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |