본문 바로가기

C#/이것이 C#이다

[ 이것이 C#이다 ] Chapter 02 . 처음 만드는 C# 프로그램

[ 학습 흐름 ]

[ 학습 흐름]

  1. Hello World !
  2. 첫번째 프로그램 뜯어보기
  3. using System;
  4. using static System.Console;
  5. namespace Hello {}
  6. class MainApp {}
  7. //프로그램 실행이 시작되는 곳
  8. static void Main(string[]args){}
  9. if(args.Length==0){}
  10. CLR에 대하여

[ Hello, World! ]

[ 간단한 프로그램 만들어보기 ]

Visual Studio 실행하기

- 시작메뉴에서 Visual Studio 2022를 찾아 실행


새 프로젝트 만들기

- 새 프로젝트 만들기 - 콘솔앱 - 생성할 위치 지정

- "솔루션 및 프로젝트를 같은 디렉터리에 배치 / 최상위 문 사용 안함" 옵션 활성화후 생성


전역 using  사용 암시적 사용 안하게 처리

- 프로젝트 - Hello 속성 - 전역using - "암시적 전체사용" 옵션 비활성화


파일 이름 변경

- 솔루션 탐색기에서 "Program.cs"선택후 F2로 이름변경


소스 코드 작성

using System;
using static System.Console;

namespace Hello
{
    internal class MainApp
    {
        //프로그램 실행이 시작되는 곳
        static void Main(string[] args)
        {
            if(args.Length == 0)
            {
                Console.WriteLine("사용법 : Hello.exe <이름>");
                return;
            }
            WriteLine("Hello,{0}!", args[0]);
        }
    }
}

컴파일

- ctrl + Shift + B로 컴파일

- Hello.exe가 해당 프로젝트 디렉터리 안 bin/Debug에 생성되어 있을것임


실행

- Window + R 키를 눌러 명령 프롬프트 열기

cd 경로명

- 위 명령어를 통해 해당 실행 파일 디렉토리로 이동

Hello 이름
Hello.exe 이름

- 위 명령어중 아무거나 선택하여 입력하면 다음과 같이 출력됨


[ 첫 번째 프로그램 뜯어보기 ]

[ using System; ]

using

- using은 C#의 키워드 ( C#의 규격에 미리 정의되어 있는 특별한 단어 )로 ~를 사용한다를 의미함 .


System

- C#코드에 필요한 클래스를 담고 있는 nameSpace .

- using System은 System nameSpace안에 있는 클래스를 사용하겠다고 컴파일러에 알리는 것 .


;

- 컴파일러에 문장의 끝을 알리는 기호 .


[ using static System.Console; ]

using static System.Console

- Console.WriteLine을 WriteLine으로 줄여주는 역할을 했음 .

- using Static은 어떠한 데이터 형식 (ex.클래스)의 정적 멤버를 데이터 형식의 이름을 명시 없이 참조함을 선언하는 기능.

- System.Console은 이러한 멤버 Write()/Read()메서드 등등이 있음.


[ namespace Hello {} ]

namespace

- namespace는 성격,하는 일이 비슷한 클래스/구조체/인터페이스/대리자/열거 형식등을 하나로 묶는 역할을 함 .

- System.IO에는 파일 입출력 / System.Printing에는 출력을 다루는 클래스 등이 소속됨 .

- namespace 선언뒤 { }가 아닌 ; 를 붙이면 해당 파일의 모든 코드는 해당 namespace의 소속이 된다 .

(파일 범위 namespace)


[ class MainApp {} ]

Class

- 클래스는 프로그램을 구성하는 기본단위로 데이터 + 데이터 처리 기능으로 이루어짐 .

- 위 예제는 MainApp 클래스 내부 코드 블록에 Main()메서드가 담겨있다 .


[ //프로그램 실행이 시작되는 곳 ]

//

- //로 시작되는 코드는 주석이다 .

- 컴파일러는 주석을 무시하고 지나간다 . 즉,메모의 기능으로만 사용된다 .


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

static void Main()string[]args

- 프로그램 시작시 실행되며 해당 메서드가 끝나면 프로그램도 끝난다 (프로그램의 진입점) .

- 메서드 코드는 한정자(static) + 반환형식(void) + 메서드 이름(Main) + 매개변수(string[]args)으로 이루어짐 .


한정자

- 메서드,변수등을 수식한다 .

- 코드 실행시 메모리에 할당되는 다른 요소와 다르게 static 한정자는 프로그램 처음 구동시 메모리에 할당된다 .


반환형식

- 해당 메서드가 어떤 것을 반환 할 지 알려준다.

- void는 해당 메서드가 어떠한 결과도 반환하지 않음을 컴파일러에게 알려준다 .


메서드 이름

- 해당 메서드의 이름 .


매개 변수

- 메서드에 입력되는 변수

- Main메서드의 매개변수는 특별한데 , 프로그램 실행시 입력하는 매개변수가 입력됨 .


[ if(args.Length ==0 ]

if 코드

- 조건을 평가해서 프로그램의 흐름을 결정하는 코드


[ CLR (Commom Language Runtime) ]

CLR

- C#이 만든 프로그램이 실행되는 환경 .

- CLR은 .Net라이브러리와 함께 운영체제 위에 설치됨 . 

- CLS 규격을 따르는 모든 언어로 작성된 프로그램을 지원한다 .

- 실행뿐 아닌 서로 다른 언어간 호환성도 제공


JIT 컴파일

-  운영 체제는 네이티브 코드로 작성된 프로그램은 실행 가능하지만 , C# 컴파일러가 만들어낸 실행파일은 불가

- C# 컴파일러는 소스코드를 컴파일해서 IL(Intermediate Language)라는 중간언어로 작성된 실행파일을 생성함 .

- 실행하면 CLR은 IL을 읽어 네이티브 코드로 컴파일 후 실행한다 .이 과정을 JIT 컴파일이라고 한다 . (두번의 컴파일)

- 적시 컴파일 . 즉 ,실행에 필요한 코드를 실행할때마다 실시간으로 컴파일해서 실행한다는 말 .


JIT 컴파일의 이유

-  CLR은 C#외 다른 언어도 지원하며 , 이 언어들이 만나는 지점이 IL이다 .

- IL로 쓰인 코드를 CLR이 다시 설치된 플랫폼에 최적화해 컴파일 후 실행하는 것 .

- 장점은 플랫폼 최적화된 코드

- 단점은 실행시 이루어지는 컴파일 비용의 부담 


CLR의 다른 기능

- C#등의 언어 동작 환경 기능외에도 , 프로그램의 오류 (예외)발생시 처리 기능

- 언어간 상속 지원

- COM과의 상호 운용성 지원

- 자동 메모리 관리 기능 (가비지 컬렉션)