[C# 7.1] 1. 간단한 닷넷 프레임워크

RisingJade의 개발기록·2022년 5월 16일
0

C# 7.1 정리

목록 보기
1/4

닷넷 프레임워크

닷넷 프레임워크(.NET Framework)는 2002년에 마이크로소프트에서 발표한 응용 프로그램 개발 환경으로서 프로세스 가상 머신에 속한다. 일반적인 네이티브 언어로 만들어진 프로그램들이 운영체제에서 곧바로 실행되는 것과는 달리, 닷넷 프레임워크를 기반으로 만들어진 응용 프로그램은 반드시 닷넷 프레임워크가 미리 설치된 환경에서만 실행된다.

  • 참고로 윈10 크리에이터 버전에서는 닷넷 4.7이 기본탑재다

CLR(Common Language Runtime)

CLR은 CLI 사양을 따르는 가장 대표적은 VM으로서 MS에서 개발해 윈도우 운영체제용으로만 배포되고 있다. CLR에는 두 가지 큰 기능이 있는데, 하나는 중간 언어를 JIT 컴파일러를 이용해 기계어로 변환하는 것이고, 다른 하나는 GC(Garbage Collector)를 제공해 동적 메모리 할당 및 회수를 지원하는 것이다.
CLR은 프로세스(EXE)가 실행되면 메모리에 함께 적재돼 실행된다. 닷넷 프로그램은 외형상 EXE/DLL로 기존의 프로그램과 동일한 구조이다. 하지만 내부적으로는 CLR 구성요소가 로드돼 실행되고, 그 CLR이 EXE/DLL에 함께 저장돼 있는 닷넷 코드를 실행한다.

  • C# 컴파일러는 소스코드를 IL(Intermediate Language)로 EXE/DLL 파일 내부에 생성한다. 또한 프로그램이 시작하자마자 CLR을 로드하는 코드를 자동으로 EXE 파일 내부에 추가한다. 따라서 사용자가 C#으로 개발된 애플리케이션을 실행하면 내부적으로 CLR이 먼저 로드된다. 그 후, CLR은 EXE 안에 있는 IL코드를 로드해서 본격적인 실행단계에 들어선다.

공통 중간 언어

자바의 VM에서는 중간 언어를 특별히 바이트코드(ByteCode)라 한다. 닷넷의 CLR에서는 이를 CIL(Common intermediate Language)라고 하는데 보통 IL코드 혹은 MSIL코드라 한다.
이런 중간 언어를 통해서 CPU에 독립적이고 모든 닷넷 호환 언어는 소스코드를 IL코드로 컴파일하고, CLR이 실행될 때 코드를 CPU의 기계어로 최종 번역한다.

공용 타입 시스템

닷넷 호환 언어가 지켜야 할 타입의 표준 규격을 정의한 것. CTS(Common Type System)이다.
CTS는 많은 것을 정의하고 지원하지만, 새로운 닷넷 호환 언어를 만들땐 CTS이상으로 구현할 수 없다.
또한 굳이 CTS의 모든 규격을 다 만들 필요도 없다.

공용 언어 사양

닷넷 호환 언어가 지켜야 할 최소한의 언어 사양. CLS(Common Language Specification)이다.
이건 무조건 완벽하게 구현을 해야한다
CLS는 두 가지 측면에서 의미가 있는데, 하나는 모든 닷넷 호환 언어가 CLS에서 정의한 사양만큼은 구현해야 한다는 것이고, 다른 하나는 호환 언어끼리 호출해야 하는 경우에는 그 기능에 한해서 CLS를 만족시키도록 작성해야 한다는 것이다.

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

C#으로 프로그램을 만드는 경우 대세 EXE나 DLL파일을 만들게 된다. 닷넷에서는 이런 실행 파일을 어셈블리(Assembly)라고 한다.

프로그래밍 언어인 어셈블리와 전혀 다른 것이다. 닷넷 프로그래밍 상으로 어셈블리라하면 보통 실행 파일(EXE,DLL)를 뜻한다.

어셈블리는 1개 이상의 모듈로 구성되는데 모듈 하나당 한 개의 파일이 대응되고 만약 1개 이상의 파일이 하나의 어셈블리를 이루고 있다면 그 파일 목록을 관리하는 매니페스트(Manifest) 데이터 또한 가지고 있다.
매니페스트를 포함하고 있지 않은 모듈은 보통 확장자가 netmodule이고, 매니페스트를 포함하는 경우에는 확장자가 DLL(또는 EXE)이다. 에셈블리는 그 자체가 "참조 단위"이자 "배포 단위"이기 때문에 다른 사람이 만든 어셈블리에 구현된 코드를 갖다 쓰고 싶으면 매니페스트가 포함된 모듈 및 그와 관련된 모든 모듈을 함께 가지고 있어야 한다.

  • 하지만... 이론상 어셈블리가 다수의 모듈을 지원하긴 하지만 일반적으로 우리가 개발하거나 사용하게 될 거의 모든 어셈블리가 1개의 파일로 구성되있을 것이다. 여러 개의 모듈을 관리하는 것이 생각보다 번거롭기에 다중 모듈을 사용하는 경우는 거의 없다.

공용 언어 기반구조

CLI(Common Language Infrastructure)는 MS에서 ECMA(European Computer Manufacturers Association) 표준으로 제출한 공개 규약이다. CLI는 CTS명세를 포함하며, 중간 언어에 대한 코드 정의, 메타데이터와 그것을 포함하는 이진 파일의 구조까지 표준 사양으로 기술하고 있다.
공개된 CLI를 통해 누구나 가져가서 임의로 구현할 수 있으며 IBM이 만든 JVM 위에서 컴파일된 자바 클래스 파일이 오라클의 JVM 위에서 동작하는 것처럼 CLI 사양을 준수한 구현체에서 동작하는 닷넷 파일은 또 다른 구현체에서 실행하는 것이 가능하다.
CLI 규격은 MS에서 구현한 실체가 CLR이고 MS에선 CLI를 외부에서도 쉽게 구현할 수 있도록 최소한의 코드로 CLI를 구현한 SSCLI(Shared Source CLI)도 만들어서 공개했다. 그 밖에 모노(Mono) 프레임워크 및 닷넷 코어(.NET Core)라는 또 다른 CLI 구현체가 오픈소스로 꾸준히 개발되고 있으며 이 프레임워크들은 리눅스나 맥 운영체제까지 지원한다.

주의!
CLI, CLR, 닷넷은 보통 구분 없이 사용된다. C# 같은 언어는 닷넷 호환 언어라는 말보다는 CLI 호환언어가 좀 더 맞다. CLI 구현체 중에 CLR이 가장 대표적이고, CLR은 닷넷 프레임워크에 포함되어 있으니 암묵적으로 혼용된다고 한다.

닷넷 프레임워크

CLR 기능만으로는 만족할 수 없는 개발자를 위해 MS가 CLR말고 이것 저것 붙여서 하나의 패키지로 묶어 배포하는 것이 닷넷 프레임워크이다. 흔히 닷넷이라 줄여말한다.
추가로 붙인 이것 저것에는 다음과 같은 것들이 있다

  • BCL(Base Class Libarary): MS가 특정 기능을 수행하는 타입을 미리 만들어 놓아서 개발자는 이를 이용해 좀 더 쉽게 응용 프로그램을 개발할 수 있다.
  • 부가적인 실행 파일: MS는 닷넷 프레임워크에 기본적으로 C#, VB.NET 컴파일러를 제공하고 있으며 그 밖에도 각종 유틸리티 성격의 실행 파일을 포함시켜 두었다.
  • GAC(Global Assembly Cache): GAC는 컴퓨터에서 실행되는 닷넷 응용 프로그램이 어셈블리 파일을 공통적으로 찾을 수 있는 전역 저장소이다. 보통 C:\\Windows\assembly 폴더에 위치하고 각종 DLL파일들이 있다.

C#과 닷넷 프레임워크

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

왜 닷넷 프레임워크 호환 언어 중 C#인가?

  • MS가 애시당초 닷넷 프레임워크를 위해 만든 언어이다.
  • MS에서 닷넷을 업데이트하여 새 기능이 나올때마다 C#을 같이 발전시킨다.
  • 고로 닷넷 프레임워크를 공부하기 가장 좋은 언어는 C#이다.

닷넷 코어와 닷넷 표준

.NET Core는 CLI의 또 다른 구현체이자 다중 플랫폼(맥, 리눅스 윈도우 등)에서 실행할 수 있도록 만들어져 있기 때문에 큰 강점을 가진다. MS는 닷넷 코어의 CLI 구현과 관련해 기반 소스코드를 닷넷 프레임워크와 공유해 모노와는 다른 안정성과 성능으로 차별화했다. 또한 소스코드를 완전히 공개했고 깃허브에서 볼 수 있다.

  • 단, 다중 플랫폼 지원의 단점인 특정 플랫폼에서만 가능한 기능(최적화 등)을 지원할 수 없다...
  • 따라서 기반 라이브러리가 닷넷 프레임워크랑 다르다...
  • 닷넷 프레임워크는 BCL을 쓰고 닷넷 코어는 Core Library를 쓴다

    이러면 코드 재사용이 어려워지므로 MS에서 .NET Standard Library를 만들었으며 어떤 라이브러리를 새로 만들든지 간에 닷넷 표준 라이브러리 위에서 만들어졌다면 아무런 변경없이 닷넷 코어와 닷넷 프레임워크를 왔다갔다하며 쓸 수 있다.

profile
언제나 감사하며 살자!

0개의 댓글