개발하는 리프터 꽃게맨입니다.

[C#] C# 스터디 시작합니다. 본문

언어/C#

[C#] C# 스터디 시작합니다.

파워꽃게맨 2024. 4. 27. 23:25

앞으로 유니티 및 툴 개발하기 위해서

C#이라는 언어에 대한 스터디를 진행합니다. 

 

제가 스터디를 하면서 기록하는거라

제 글을 보고 무엇을 배우는건 권장하지 않습니다.

 

교재는 '이것이 C#이다! 3판' 을 사용합니다.

 

일단 늘 하는 Hello World 부터 출력해보도록 합시다.

 

 

 

using System; 은

C의 include 와 유사해보입니다.

 

System은 namespace이고

해당 namespace 안에 유용한 가용 클래스들이 있는 것으로 보입니다.

 

없어도 System.Console.~~ 이런 형식으로 사용할 수 있다고 합니다.

 

조금 생소했던것은 using static System.Console; 부분입니다.

using 키워드만 사용하면 네임스페이스 전체를 사용한다는 의미지만

using static 은 어떤 클래스의 정적 멤버를 데이터 형식의 이름을 명시하지 않고 참조하겠다고 선언하는 기능을 한다고 합니다.

 

즉, 네임스페이스의 참조에는 using

네임스페이스 속 특정 형식들 (struct, class 등..) 을 참조하고 싶을 경우에는 using static을 사용하는 것으로 여겨집니다.

 

 

global using 

전역 using 이라고 불리는 이것은

소스 파일 한 곳에서만 네임스페이스를 참조하면 프로젝트 내 모든 파일에서 별도의 using 문 없이 해당 네임스페이스를 참조할 수 있도록 한다고 합니다.

 

C++ 에서 pch를 사용하여 전역적으로 사용할 헤더 파일을 include 한 것과 유사한 역할을 하는 것 같습니다.

 

글로벌 using은 소스 파일 분할에 있어서 유용한 기능인 것 같습니다.

 

 

 

네임스페이스는 성격이나 하는 일이 비슷한 녀석들을 하나로 묶는 일을 합니다.

예를들어

System.IO namespace 에는 파일 입출력을 다루는 메서드 들이 들어있고

System.Printing 네임스페이스에는 출력에 관련한 일을 하는 클래스 등이 소속되어 있습니다.

 

.NET 클래스 라이브러리에 1만 개가 훨씬 넘는 클래스가 있음에도 불구하고 프로그래머가 전혀 혼돈을 느끼지 않고 클래스를 사용할 수 있는 비결이 바로 namespace 덕입니다.

 

 

 

클래스는 C# 프로그램을 구성하는 기본 단위로서 그 의미는 C++의 클래스와 유사합니다.

C# 프로그램은 최소한 하나 이상의 클래스로 이루어지며 수백, 수천 개의 클래스들로 구성되기도 합니다.

 

 

Main 메소드는 특별한 메소드고 C의 main 함수와 동일한 역할을 수행합니다.

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

 

C# 프로그램은 CLR 에 의해 메모리에 올려지는데,

CLR 은 C# 뿐 아니라 CLR 규격을 따르는 모든 언어로 작성된 프로그램을 실행하는 환경을 뜻합니다.

CLR은 단순히 각 언어로 작성된 프로그램의 실행 뿐 아니라 서로 다른 언어로 작성된 언어 사이의 호환성을 제공해주기도 합니다.

 

CLR은 프로그램을 실행시킨 후 Main 메소드를 진입점으로 설정합니다.

 

(참고 Main 함수는 반드시 정적변수여야만 합니다!)

 

[CLR에 대하여]

 

C#으로 만든 프로그램은 CLR 위에서 실행됩니다.

이는 자바의 JVM과 비슷한 역할을 합니다.

 

앞 그림처럼 CLR은 .NET 라이브러리와 함께 OS위에 설치됩니다.

네이티브 코드로 작성된 프로그램들은 운영체제가 직접 실행할 수 있지만,

C# 컴파일러가 만들어낸 실행 파일은 하드웨어가 이해할 수 없는 코드로 구성되어 있기 때문에 실행할 수 없습니다.

 

C# 컴파일러는 C# 소스 코드를 컴파일해서 IL 이라는 중간 언어로 작성된 실행 파일을 만들어냅니다.

사용자가 이 파일을 실행시키면 CLR이 IL 를 읽어들여 다시 하드웨어가 이해할 수 있는 네이티브 코드로 컴파일한 후 실행시킵니다.

 

이것을 JIT(Just In Time) 컴파일이라고 부릅니다.

실행에 필요한 코드를 실행할 때마다 실시간으로 컴파일해서 실행한다는 뜻입니다.

 

그냥 실행 코드를 만들어놓고 쓰면 되지, 왜 두 번씩이나 컴파일하는 복잡한 과정을 거칠까요?

앞에서도 잠시 설명했지만 C#이 동작하는 환경이자 엔진인 CLR은 C#뿐만 아니라 다른 언어도 지원하도록 설계됐습니다.

서로 다른 언어들이 만나기 위한 지점이 바로 IL이라는 중간 언어이고, 이 언어로 쓰인 코드를 CLR이 다시 자신이 설치된 프롤랫폼에 최적화해 컴파일한 후 실행하는 것이죠.

 

장점은 플랫폼에 최적화된 코드를 만들어낸다는 것인데,

단점은 실행 시 이루어지는 컴파일 비용의 부담입니다.

 

또한 CLR은 프로그램 오류, 예외 처리, 언어간 상속 지원, COM과의 상호 운용성 지원, 지동 메모리 관리(GC)

등 여러 기능을 제공합니다.