[이것이 C#이다] 2. 첫 C# 프로그램

ssu_hyun·2022년 4월 4일
0

C#

목록 보기
6/22

Key point

  • "Hello World" 출력 프로그램 생성 및 실행
  • C# 코드 구조 파악
  • C#과 CLR의 관계 파악

2.1 Hello, World!

  • 컴파일(Compile)
    : 소스코드를 분석해서 그 결과를 기계 코드로 생성하는 과정
    • 어휘 분석
    • 구문 분석
    • 의미 분석
  • 컴파일러(Compiler)
    : 컴파일을 수행하는 프로그램
  • C# 컴파일러
    : C# 소스 코드를 분석해 그 결과를 .NET용 IL코드로 생성하는 프로그램
    • CLR(가상 머신)이 IL코드를 읽어들여 기계코드로 바꿔줌

실습

  1. Visual Studio 실행
  2. [새 프로젝트 만들기] - [콘솔 앱] 선택 - 이름 설정 후 만들기
  3. 코드 편집기에 코드 입력
using System;
using static System.Console;

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

            WriteLine("Hello, {0}!", args[0]);  // Hello, World를 프롬프트에 출력
            
        }
    }
}
  1. 컴파일 수행 : ctrl+shift+B or [빌드]-[솔루션 빌드]
    • 빌드가 제대로 되었다면 : 프로젝트 디렉터리 안의 bin\Debug\Hello.exe 생성
    • 빌드가 제대로 되지 않았다면 : 컴파일 에러 발생
    • 프로젝트 디렉터리로 이동해 확인
  2. 명령 프롬프트 창 열기 : Windows + R - cmd 입력
  3. 실행 파일( Hello.exe ) 경로로 이동 : cd + 프로젝트 경로
  4. 여러 실행 코드 입력 후 결과 확인

2.2 첫 프로그램 코드 분석

using System;
  • using : C# 키워드(C# 언어의 규격에 미리 정의되어 있는 특별한 단어)
  • ; : 컴파일러에 문장의 끝을 알림
  • System.Console.WriteLine() -축소-> Console.WriteLine()

using static System.Console;
  • using : 네임스페이스 전체 사용
  • using static : 어떤 데이터 형식의 정적 멤버를 데이터 형식의 이름을 명시하지 않고 참조하겠다고 선언하는 기능
    • 정적 멤버 : Write(), WriteLine(), Read(), Readline()
  • Console.WriteLine() - 축소 -> WriteLine()

namespace Hello
  • namespace
    • 성격이나 하는 일이 비슷한 클래스, 구조체, 인터페이스, 대리자, 열거 형식 등을 하나의 이름 안에 묶는 일.
    • 프로그래머들이 혼돈 없이 클래스를 각 용도별/분야별로 정리하여 사용할 수 있다.
    • namespace+이름 뒤 괄호 사이에는 이 네임스페이스에 소속되는 클래스가 들어간다.

namespace Hello
{
    class MainApp
    {
         WriteLine("Hello, {0}!", args[0]);  
            
    }
}
  • class MainApp{}
    • 클래스(class)/메소드(method)
      • C# 프로그램을 구성하는 기본 단위로서 데이터와 데이터를 처리하는 기능

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

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

/* 프로그램
   실행이
   시작되는 곳 */
  • 주석 : // or /**/ (여러 줄)

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

            WriteLine("Hello, {0}!", args[0]);  // Hello, World를 프롬프트에 출력
            
        }
    }
  • static void Main(string[] args){}
    • 프로그램의 진입점(Entry point) 메소드
    • 모든 프로그램은 반드시 Main이라는 이름을 가진 메소드를 하나 가지고 있어야 함
    • static
      • 한정자(메소드/변수의 수식어)
      • static 키워드로 수식되는 코드는 프로그램이 처음 구동될 때부터 진작에 메모리에 할당된다.
      • 프로그램이 실행되면 CLR은 프로그램을 메모리에 올린 후 프로그램의 진입점을 찾는데 이 때 static으로 한정된 Main()메소드가 없는 경우 컴파일 에러 메시지를 출력한다.

        CLR(Commmon Language Runtime)

        • C#으로 만든 프로그램이 실행되는 환경
        • CLS(Common Language Specification) 규격을 따르는 모든 언어로 작성된 프로그램 지원
        • 각 언어로 작성된 프로그램의 실행 & 서로 다른 언어로 작성된 언어 사이의 호환성 제공
    • void : 메소드의 반환 형식 (어떤 결과도 돌려주지 않을 것이라는 의미)
    • Main : 메소드의 이름
    • 괄호 안 : 프로그램을 실행할 때 메소드에 입력되는 매개변수
  • 코드 블록 : {에서 메소드의 실행이 시작되고, }에서 메소드의 실행이 끝남
    • if(args.Length == 0){} : 매개변수의 길이가 0일 경우, 즉 매개변수가 전달되지 않을 경우 {}안 코드 실행
    • return; : 원래 메소드의 호출자에게 메소드 실행 결과를 돌려주는 역할을 하지만, 여기서는 Main() 메소드를 종료하는 용도로만 사용

2.3 CLR

  • C#으로 만든 프로그램은 CLR(Common Language Runtime)위에서 실행
  • CLR은 C#뿐만 아니라 다른 언어도 지원하도록 설계되어 서로 다른 언어들이 IL이라는 중간 단계를 거친 후 CLR에 의해 각자 자신이 설치된 플랫폼에 최적화시켜 컴파일한 후 실행하는 과정을 거치도록 되어있다.
    • C#
      • C# 컴파일러에 의한 C# 소스 코드 컴파일
      • 중간언어 IL(Intermediate Language)로 작성된 실행 파일 생성
      • 적시 컴파일(JIT, Just In Time) : 위 실행 파일 실행하면 CLR이 이를 읽어들여 다시 네이티브 코드로 컴파일한 후 실행시킴
  • 장점 : 플랫폼에 최적화된 코드를 만들어냄
  • 단점 : 실행 시 이루어지는 컴파일 비용의 부담
  • 기능
    • C#이나 기타 언어들을 동작시키는 환경 기능
    • 프로그램의 오류(예외)가 발생했을 때 이를 처리하도록 도와주는 기능
    • 언어간의 상속 지원
    • COM과의 상호 운영성 지원
    • 가비지 컬렉션(Garbage Collection) : 자동 메모리 관리, 프로그램에서 더 이상 사용하지 않는 메모리를 쓰레기(Garbage)로 간주하고 수거(Collection)하는 기능

0개의 댓글