프로그래밍/C#

.NET Framework(닷넷 프레임워크)에 대해 알아보자

gameObject 2023. 9. 16. 16:47
728x90

시작하세요 C# 10 프로그래밍의 책을 보고 공부한 내용을 정리하였습니다.

 

1. 닷넷 프레임워크

일반적인 네이티브 언어로 만들어진 프로그램들이 운영체제에서 곧바로 실행되는 것과 달리

닷넷 프레임워크를 기반으로 만들어진 응용 프로그램은 반드시 닷넷 프레임워크가 미리 설치된 환경에서만 실행된다.

 

CLR(Common Language Runtime) : EXE가 실행되면 메모리에 함께 들어가서 실행된다.

 

닷넷 프로그램은 외형상 EXE/DLL로 기존 프로그램과 동일한 구조이다.

하지만 내부적으로는 CLR 구성요소가 로드돼 실행되고, 그 CLR이 EXE/DLL에 함께 저장돼 있는 닷넷 코드를 실행한다.

 

2. C#입장에서의 닷넷 프레임워크

C# 컴파일러는 소스코드를 기계어가 아닌 IL(intermediate language)라고 하는 중간 언어로 EXE/DLL 파일 내부에 생성한다.

프로그램이 시작되자마자 CLR을 로드하는 코드를 자동으로 EXE파일 내부에 추가한다.

따라서 사용자가 C#으로 개발된 어플을 실행하면 내부적으로는 먼저 CLR이 로드된다.

이어서 CLR은 EXE파일 내에 있는 중간언어(IL)을 로드해서 본격적인 실행 단계에 들어선다.

 

3. 닷넷 호환 언어

CLR에 의해 실행되는 중간 언어는 어느 하나의 프로그래밍 언어에 종속된 것은 아니다.

어떤 언어의 컴파일러든지 결과물을 중간 언어로 생성해 낸다면 CLR이 그것을 실행할 수 있다.

C#은 단지 그러한 언어중 하나에 불과하다.

공식 언어로는 C#, Visual Basic .NET, F#, C++/CLI가 있다.

 

4. 공통 중간 언어(CIL: Common Intermediate Language)

 

5. 공용 타입 시스템

닷넷 호환 언어가 지켜야 할 타입(Type)의 표준 규격을 정의한 것이 공용 타입 시스템(CTS : Common Type System)이다.

만약 새로운 언어를 만들어 닷넷 프레임워크 상에서 실행하고 싶다면 CTS규약을 만족하는 한도 내에서만 구현가능하다.

예 : CTS는 클래스 다중 상속을 지원하지 않음, 즉 직접 닷넷 호환언어를 만든다면 클래스 다중상속을 지원하도록 만들 수가 없음.

따라서 닷넷 호환 언어는 CTS의 한계를 넘어서 구현할 수 없다.

 

6. 공용 언어 사양(CLS : Common Language Specification)

닷넷 호환 언어가 지켜야 할 최소한의 언어 사양을 정의한 것이다.

CTS 전체를 구현할 필요는 없지만 적어도 CLS에 명시된 사양만큼은 완벽하게 구현해야 한다.

 

7. 메타데이터

일반적인 정의로 데이터를 위한 데이터를 메타데이터(Metadata)라고 한다.

즉, 프로그래밍 언어에서는 개발자가 구현한 코드가 데이터에 해당하고, 해당 코드의 성격을 설명해 주는 별도의 데이터를 메타데이터라고 한다.

CLR에서 동작하는 실행파일은 완전하게 자기 서술적인 메타데이터를 제공하며, 외부에서는 리플렉션 이라는 기술을 통해 사용할 수 있다.

 

8. 어셈블리, 모듈, 매니페스트

C#으로 프로그램을 만드는 경우 대개 EXE 또는 DLL파일을 만들게 된다.

닷넷에서는 이런 실행파일을 어셈블리(Assembly)라고 한다.

( 기계어와 1:1로 대응되는 프로그래밍 언어인 어셈블리 언어와 이름이 같아 혼동될 수 있다. 그러나 닷넷 프로그래밍에서 특별한 언급이 없다면 어셈블리는 실행파일(EXE, DLL)을 의미한다.)

 

어셈블리는 1개 이상의 모듈(Module)로 구성되는데 이때 모듈 하나당 한 개의 파일이 대응된다.

그런데 여러개의 파일이 하나의 어셈블리를 구성하고 있다면 그 목록을 관리하는 데이터가 있어야 하므로, 이를 위해 모듈 중 하나는 반드시 다른 모듈의 목록을 관리하는 매니페스트 데이터를 담고 있다.

매니페스트를 포함하지 않은 모듈은 확장자가 netmodule이고, 포함하는 경우에는 DLL or EXE이다.

어셈블리는 그 자체가 "참조 단위"이자 "배포 단위"라는 것에 의미가 있다.

그런데 보통 다중모듈을 사용하는 경우는 거의 없으므로 일반적으로 어셈블리는 1개의 (EXE,DLL 모듈) 파일로 구성된다.

 

9. 공용 언어 기반구조(CLI: Common Language Infrastructiure)

마이크로소프트에서 ECMA 표준으로 제출한 공개 규약이다.

CLI는 CTS 명세를 포함하여, 중간 언어에 대한 코드 정의, 메타데이터와 그것을 포함하는 이진 파일(binary file)의 구조까지 표준사양으로 기술하고 있다.

CLI규격을 마이크로소프트에서 구현한 실체가 바로 CLR이다.

 

10. 공용 언어 런타임(CLR : Common Language Runtime)

CLI 사양을 따르는 가장 대표적인 VM으로서 마이크로소프트가 개발해 윈도우 운영체제용으로만 배포되고 있다.

CLR에는 두 가지 큰 기능이 있는데, 하나는 중간 언어를 JIT 컴파일러를 이용해 기계어로 변환하는 것이고, 다른 하나는 가비지컬렉터(GC: Garbage Collector)를 제공해 동적 메모리 할당 및 회수를 지원하는 것이다.

 

CLR자체를 관리환경(Managed Environment)라고도 하고, CLR이 로드되는 프로세스를 기존의 네이티브 프로세스와 구별해 관리 프로세스(Managed Process)라고 한다.

CLI와 CLR, 닷넷은 보통 구분 없이 사용된다는 점에 유의하자.

예를 들어 C#과 같은 언어는 닷넷 호환 언어라는 말보다는 CLI호환 언어라고 불러야 맞다(단지 CLI 구현체 중 CLR이 가장 대표적이고, CLR은 닷넷 프레임 워크에 포함되어 있으므로 암묵적으로 혼용되는 면이 있다.)

 

11. 닷넷 프레임워크

CLR의 기능만으로는 응용 프로그램을 작성하는 개발자를 만족시킬 수 없다.

마이크로소프트는 CLR 말고도 여러 가지 구성요소를 함께 만들어 이를 하나의 패키지로 묶어 배포하는데, 이것이 바로 우리가 자주 들었던 "닷넷 프레임워크", "닷넷"이라고 한다.

닷넷 프레임워크 = CLR + 부가 구성요소( BCL, 부가 실행파일, GAC)

- BCL : Base Class Library

- GAC : Blobal Assembly Cache

 

닷넷 응용 프로그램을 만들려면 필연적으로 닷넷 프레임워크의 전반적인 지식을 함께 공부해야 한다.

그 지식에는 CLR/CLI/CTS/CIL이 포함되며 모든 것을 알아야 할 필요는 없지만 많이 알수록 닷넷 프로그램 제작 능력은 더욱 향상될 것이다.

 

12. C#과 닷넷 프레임워크의 관계

C#은 닷넷 프레임워크를 기반으로 IL 코드를 생성하는 컴파일러에 불과하므로 C#을 배운다는 것은, 곧 닷넷 프레임워크를 공부한다는 의미이다. C#은 여러 도구 중 하나일 뿐 결국엔 닷넷 프레임워크가 목표이다.

VB.NET, C++/CLI, F#와는 다르게 닷넷을 위한 언어인 C#을 공부하는 것이 닷넷 프레임워크를 배운다고 할 수 있다.

 

13. 닷넷 코어와 닷넷 표준

닷넷 코어(.NET Core)는 공용 언어 기분구조(CLI : Common Language Infrastructure)의 또 다른 구현체이긴 하지만 다중 플랫폼(맥, 리눅스 등)에서 실행할 수 있도록 만들어졌다는 점에서 강점을 가진다.

즉, 점점 더 다중 플랫폼에서의 실행 환경이 중요해짐에 따라 마이크로소프트가 직접 만든 것이 바로 닷넷 코어이다.

 

마이크로소프트는 닷넷 코어의 CLI 구현과 관련해 기반 소스코드를 닷넷 프레임워크와 공유해 모노와는 다른 안정성과 성능으로 차별화했다. 

.NET Framework와 .NET Core와는 하부구조는 공유하고 있는 반면 기반 라이브러리 단계부터는 독자적인 구현으로 이루어져 있다.

따라서 기반 라이브러리의 불일치를 해결하기 위해 .NET Standart Library를 만들었다.

 

14. 정리

C#언어를 공부하게 되면 응용 프로그램의 유형에 따라 다음과 같은 선택권을 갖게 된다.

1) 닷넷 프레임워크

- 윈도우 운영체제에서 실행할 프로그램을 만드는 경우

2) 닷넷 코어/5+

- (특정 운영체제의 기능에 종속되지 않는) 콘솔 응용 프로그램

- (특정 운영체제의 기능에 종속되지 않는) 웹 애플리케이션을 개발하는 경우

- (특정 운영체제의 기능에 종속되지 않는) 클라우드 환경에서의 서비스를 개발하는 경우

- (닷넷 코어 3.0 이후) 윈도우 운영체제에서 실행할 프로그램 지원 포함

- 웹 애플리케이션의 프런트엔드 단의 자바 스크립트의 선택사항으로 WebAssembly를 C#언어로 개발하거나 서버 측 렌더링을 지원하는 웹 페이지를 개발하는 경우

- 클라우드 및 컨테이너 환경의 응용프로그램을 만드는 경우

3) Xamarin 플랫폼

- 모바일(IOS, 안드로이드) 앱을 개발하는 경우

- 윈도우 스토어(UWP) 앱 개발을 모바일 앱과 함께 진행하는 경우

4) Unity 게임 엔진 플랫폼

- 모바일용 게임을 개발하는 경우

 

728x90