.NET 이란?
.NET은 다양한 유형의 애플리케이션을 빌드하기 위한 무료 크로스 플랫폼 오픈 소스 개발자 플랫폼입니다. 이는 여러 언어로 작성된 프로그램을 실행할 수 있으며, 그 중 가장 인기 있는 언어는 C#입니다. 이는 많은 대규모 앱 프로덕션에서 사용되는 고성능 런타임에 의존합니다.
- .NET은 Microsoft에서 지원하는 무료 오픈 소스 애플리케이션 플랫폼이다.
- .NET은 2002년, 마소에서 발표한 닷넷 프레임워크(.NET Framework)가 시초이며, 여러 버전을 거처 현재 명칭은 오픈 소스 버전인 .NET으로 불린다.
- .NET 기반 응용 프로그램은 .NET 런타임 환경을 필요로 한다.
.NET과 C#과의 관계?
C#은 .NET용 프로그래밍 언어입니다. 강력한 타이핑 및 유형 안전성을 갖추고 있으며 동시성 및 자동 메모리 관리 기능이 통합되어 있습니다.
- C#의 컴파일러는 C# 소스코드를 IL(Intermediate Languege)라고 하는 중간 언어로 실행 파일을 내부에 생성하게 되는데, 이 IL을 .NET Runtime이 실행한다.
- C#은 .NET 호환 언어 중 하나일 뿐이다.
.NET 호환 언어
어떤 언어든 컴파일러나 다른 방식 통해 IL로 만들어낼 수 있다면 .NET Runtime에서 실행이 가능하고 .NET 호환 언어라고 할 수 있다. 아래 언어들은 MS에서 공식적으로 제공되는 .NET 호환언어이다.
- C#
- F#
- VB .NET
- C++/CLI
.NET 호환 언어라는 것은 무엇을 의미하는가?
그것은 서로 동일한 중간언어에서 돌아간다는 것. 즉, C++에서 만든 클래스를 C#에서 사용 가능하다.
공통 중간 언어(Common Intermediate Languege, CIL)
위에서 설명한 IL의 풀네임이 바로 ‘공통 중간 언어, CIL’이다. (자바의 바이트코드 느낌)
프로그래밍 언어는 비교적 고수준 언어와 저수준 언어가 존재한다.
인간이 이해하기 쉬운 형태일수록 고수준, 기계가 이해하기 쉬운 형태일수록 저수준이다.
그런 의미에서 C#은 비교적 고수준, C#을 .NET 중간언어인 IL(CIL, MSIL, IL 등 다양하게 불림)은 비교적 저수준인 셈이다.
아무튼 IL로 컴파일된 후, 런타임이 실행될 때, IL 코드는 CPU의 기계어로 번역된다.
즉, 고수준에서 저수준으로 단계별 컴파일 된다.
C# → (컴파일러 작동) → IL, 중간언어 → (.NET Runtime 실행) → CPU가 인식 가능한 기계어
공용 타입 시스템(Common Type System, CTS)
앞에서 알 수 있듯이, IL로 컴파일이 가능한 언어일 경우 닷넷 호환 언어라고 할 수 있다.
그렇다고 아무 언어나 닷넷 호환 언어가 될 수 있는 것은 아니다.
‘이정도 안에서 구현하면 닷넷 호환언어’라고 정해둔 것이 바로 CTS 규약이다.
- 닷넷 호환 언어는 CTS의 한계를 넘어서 구현할 수는 없다. 예) IL은 클래스 다중 상속을 구현하지 않으므로 다중 상속을 구현할 수 없다.
- 닷넷 호환 언어는 CTS에서 정의한 모든 규격을 전부 구현할 필요는 없다. 예) 접근 제한자로 private, public 등 여러가지가 있지만, public만 구현해도 상관없다.
공용 언어 사양(Common Languege Specification, CLS)
‘이정도 안에서 구현하면 닷넷 호환언어’라고 정해둔 것이 CTS라면,
‘최소한 이것만큼은 구현해야 닷넷 호환언어’라고 정해둔 것이 CLS이다.
그렇다면 왜 CLS 규약이 존재하는가? 라는 물음에는 이렇게 답할 수 있다.
닷넷 호환 언어끼리 같은 IL로 컴파일이 가능한 특성을 통해 각각 라이브러리화 하여 서로 사용할 수 있고 상속받을 수 있다는 특징이 있으나, IL로 구현되어야 할 기능이 구현되지 않으면 같은 IL이지만 구현되지 않은 부분에 대한 호환성을 기대하기 어렵기 때문에 더이상 닷넷 ‘호환’ 언어라고 부를 수 없게 될 것이기 때문이다.
공용 언어 기반구조(Common Language Infrastructure, CLI)
Ecma International is an industry association dedicated to the standardization of information and communication systems.
Ecma International은 정보통신 시스템 표준화를 전문으로 하는 산업 협회입니다.
- ECMA 공홈 메인 슬로건 번역 -
지금까지 .NET과 C#을 설명하면서 '공용, Common'이 붙은 단어들에 대한 설명이 많았는데, 그러한 모든 인프라적 구성 요소를 ECMA(정보통신 표준화 전문 협회) 표준 공개 규약으로 만든 것이 CLI이다.
이는 .NET 인프라에 대한 공개된 스팩이기 때문에 누구나 CLI 사양을 구현할 수 있다.
공용 언어 런타임(Common Language Runtime, CLR)
.NET Framework 버전의 CLR과 .NET Core 버전의 CLR(CoreCLR)로 나뉜다.
.NET Framework 버전의 CLR은 당연히 Windows 전용이고 CoreCLI은 크로스 플랫폼을 지원한다.
MS문서에 '원래 Core CLR은 Silverlight의 런타임이고 여러 플랫폼, 특히 Windows 및 OS X에서 실행되도록 디자인되었습니다.'라고 적혀 있는데, Silverlight가 뭐지? 하고 찾아보니 Adobe Flash에 대항하기 위한 애플리케이션 프레임워크다. 즉, CLR은 Silverlight 기반으로 만들어졌으며, CoreCLI은 초기에 이를 계승했다고 볼 수 있으며 CLI, CoreCLI 둘 다 동일한 코드 베이스에서 시작되어 지금의 형태를 띄게 되었다고 한다.
CLR은 다음과 같은 역할을 한다.
- 중간 언어를 JIT 컴파일러를 이용해 기계어로 변환하는 것
- 가비지 수집기(Garbage Collector, GC)를 제공하여 동적 메모리 할당 및 회수를 지원하는 것
.NET
그럼 2024에 발표된 .NET8.0은 뭐라고 할 수 있을까?
이는 MS가 CLR + BLC(Base Class Library), 기타 파일(C# 컴파일러, 빌드 시스템 등) 등, 여러 구성요소를 패키지로 묶어서 배포한 최신 버전의 닷넷이다.
ASP.NET Core를 하든, 데스크톱 앱을 하든, 콘솔 앱을 하든지 간에 결국은 .NET BLC를 주로 사용하게 될 것이다.
이는 .NET 개발을 할 때, 개발 편의를 제공하기 위해 MS에서 미리 만들어 둔 핵심 라이브러리 집합이다.
.NET의 버전이 거듭될수록 발전하고 있으며, .NET 개발에서 BLC를 잘 알아둔다면 다른 플랫폼 개발을 하더라도 큰 도움이 될 것이다.