문과 코린이의, [C#] 기록/C# 이론

[문과 코린이의 IT 기록장] C# - C# 기초 이해하기 (using System이란?, using static System.Console;, namespace _2021_03_02 { }, class MainApp { }, static void Main(string [] args) { }, CLR이란?)

벼리네 2021. 3. 16. 12:26
반응형

[문과 코린이의 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;
using static System.Console 
   ...
       Console.WriteLine("사용법 2021_03_02.exe0 <이름");
       return
   ...

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;
using static System.Console;
   ...
     WriteLine("Hello, {0}!", args[0]);
   ...

- Console 클래스의 대표적인 정적 맴버는, 콘솔에 데이터를 출력하는 'Write(), WriteLine()' 메소드, 콘솔로부터 데이터를 입력받는 'Read(), ReadLine()'메소드가 있다.

 * 메소드란? : 일련의 기능을 수행하는 명령어

 

 


 

 

 3. namespace _2021_03_02 { }

   ...
namespace 네임스페이스_이름{
   // 클래스
   // 구조체
   // 인터페이스 등...
}
   ...

- 네임스페이스는, 비슷한 클래스 / 구조체 / 인터페이스 / 대리자 / 열거 형식 등을 하나의 이름 아래 묶는 역할을 한다.

- .NET 클래스 라이브러리에 매우 다양한 클래스가 있어도 혼란스럽지 않게 이들을 사용할 수 있는 이유는, 네임스페이스가 이와 같이 용도별/분야별로 정리되어 있기 때문이다.

 ex)

: System.IO namespace : 파일 입출력을 다루는 각종 클래스, 구조체, 대리자, 열거 형식 등 존재.

: System.Printing namespace : 인쇄와 관련한 일을 하는 클래스 소속

 

ex )

   ...
namespace _2021_03_02
{
 class MainApp 
// 2021_03_02 namespace에 MainApp 클래스를 담는다.
// 다른 곳에서 MainApp 클래스를 사용하려면, 2021_03_02 namespace를 참조하거나, 2021_03_02.MainApp처럼 클래스가 소속되어 있는 네임스페이스와 클래스의 이름을 붙여주어야 한다.
 {
   ...
 }
}

 

 


 

 

 4. class MainApp { }

- 클래스 : C# 프로그램을 구성하는 기본 단위로서, 데이터와 데이터를 처리하는 기능(메소드)로 이루어진다. C# 프로그램은 적어도 하나 이상의 클래스로 이루어지며, 수백개의 클래스들로 구성되기도 한다.

 

ex )

   ...
 class MainApp
 { // 코드 블록

   // 프로그램 실행이 시작되는 곳
  static void Main(string[] args)  // main() 메소드
   {
     if (args.Length == 0)
     {
       Console.WriteLine("사용법 2021_03_02.exe0 <이름");
       return
     }
     WriteLine("Hello, {0}!", args[0]);
   }

 }
   ...

 


 

 

 5. static void Main(string [] args) { }

- static void Main(stirng [] args) { } 메소드는, 프로그램을 시작하면 실행되고, 만약 이 메소드가 종료되면 프로그램도 종료된다. 

- 모든 프로그램은 반드시, Main이라는 이름을 가진 메소드를 하나 가지고 있어야 한다.

 

 

Main() 메소드 코드

 

ex )

   ...
class MainApp
 {
   // 프로그램 실행이 시작되는 곳
  static void Main(string[] args)  // main() 메소드 (= main 함수, 서브루틴)
   {
     if (args.Length == 0)
     {
       Console.WriteLine("사용법 2021_03_02.exe0 <이름");
       return
     }
     WriteLine("Hello, {0}!", args[0]); // C#을 프롬프트에 출력
   }
 }
   ...

 

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)이란? : 프로그램에서 더 이상 사용하지 않는 메모리를 쓰레기로 간주하고, 수거하는 기능을 말한다.

 

 

 


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형