닷넷 관련 키워드 정리
.NET Framework
.NET Framework는 MS에서 발표한 응용 프로그램 개발 환경이다. 각종 응용 프로그램을 작성 및 실행 해주는 걸 도와줌으로써
개발자가 응용 프로그램의 비즈니스 코드에만 집중할 수 있게 도와준다. .NET의 계층구조는 다음과 같다.
이 그림을 간단히 설명하자면 .NET은 CLR + 부가 구성요소로 되어있다. CLR은 밑에서 설명할 것이고, 주요 부가 구성요소는 다음과 같다.
- BCL(Base Class Library)
MS에서 특정 기능들을 바로 쓸 수 있게 구현해 놓은 클래스들이다. - 실행파일
.NET은 기본적으로 C#, VB.NET의 컴파일러를 제공하고, 각종 유틸리티 성격의 실행 파일을 포함하고 있다. - GAC(Global Assembly Cache)
컴퓨터에서 실행되는 .NET 프로그램들이 쓸 수 있는 어셈블리 파일을 저장하고 있는 전역 저장소이다.
CLR
CLR(Common Language Runtime)은 CLI 사양을 따르는 가상 머신이다. CLR은 주 기능은 다음과 같다.
- IL 코드를 JIT 컴파일러를 이용해 기계어로 바꿔준다.
- 가비지 콜렉터를 이용해 동적 메모리 할당 및 회수를 한다.
CLR이 중요한 이유 :
그 어떤 .NET 호환 언어를 사용해서 코드를 작성하더라도, CLS 규격을 만족한다면 다양한 언어의 결과물 끼리 상호 호출이 가능하다. 컴파일러가 IL코드로 변환하여 CLR에서 실행하기 때문이다. CLR은 윈도우용 CLI 구현체이고, 리눅스의 경우에는 Mono를 쓴다. CLS 규격을 만족한다면 플랫폼 독립적인 IL코드로 변환하여 각 플랫폼의 CLI구현체를 거쳐 다양한 플랫폼에서 작동하는 프로그램을 만들 수 있다.
CTS
CTS(Common Type System)은 .NET 호환 언어들이 지켜야 할 Type과 표준 규격을 정의한 것이다.
CLI, CTS, CLS, CLR의 정의와 관계를 다시 한 번 정리하면
CLI(Common Language Infrastructure) : 공용 언어 기반구조
CTS(Common Type System) : 공용 타입 시스템
CLS(Common Language Specification) : 공용 언어 사양
CLR(Common Language Runtime) : 공용 언어 런타임
다음과 같은 관계를 형성하고 있다.
어셈블리
어셈블리(Assembly)는 .NET에서의 실행파일(주로 EXE, DLL 파일)을 말한다.
어셈블리는 1개 이상의 모듈로 구성되는데, 모듈 하나당 한 개의 파일이 대응된다. 하지만 여러개의 파일이 어셈블리를 구성한다면 이 파일들의 목록을 관리하는 데이터가 필요하다. 그 때문에 이 모듈 중의 하나는 다른 모듈의 목록을 관리하는 매니페스트(Manifest) 데이터를 갖고있다.
메니페스트를 포함하고 있지 않은 모듈은 확장자가 netmodule이고, 메니페스트를 경우에는 확장자가 DLL(또는 EXE)이다.
EXE 와 DLL의 차이
DLL의 내부에 구현된 API는 외부에서 참조 할 수 있지만 EXE는 불가능하다. 그래서 재사용 가능한 코드는 컴파일해서 DLL 파일에 모아두고 서로 다른 EXE에서 공유해서 사용하는 방식이 일반적이다.
Managed
VB.NET 또는 C# 등의 소스코드가 컴파일러를 거친후 IL 코드로 변환되고, IL 코드가 CLR 통해 실행되는데 이 프로세스를 Managed Process라고 한다.
또한 CLR자체를 Managed Environment라고 하며,
.NET 호환 언어 역시 기존의 언어와 구분하는 의미에서 Managed Language라고 한다.
Managed Process를 그림으로 나타내면 다음과 같다.
Unmanaged
Managed와 달리 IL 코드 같은 중간 언어를 거치지 않고 컴파일 이후 바로 실행이 되는 머신 코드를 만들어 내는 것을 말한다. 속도에는 장점을 가지지만 보안, 메모리 관리 등을 직접 해줘야 하기 때문에 확장성에 한계가 있다.
Unmanaged Process를 그림으로 나타내면 다음과 같다.
각 버전 간의 상관 관계
C#은 .NET을 위해 만들어진 언어이다. 그래서 C#과 .NET은 같이 발전한다. 또한, 관련 도구인 Visual Studio도 같이 업데이트 된다.
C#, Visual Studio, .NET과의 버전 간의 상관 관계는 다음과 같다.
C# 1.0 : Visual Studio .NET 2002 - .NET Framework 1.0
C#은 1.0 발표, .NET은 최초버전
C# 2.0 : Visual Studio 2005 - .NET Framework 2.0
C#은 제네릭, 익명 함수 문법 추가. .NET은 제네릭 제공
C# 3.0 : Visual Studio 2008 ~ 2010 - .NET Framework 2.0 ~ 3.5
C#은 표현식, 확장 메서드, 익명 타입을 위한 문법을 추가, LINQ 구문을 언어적으로 지원. .NET은 LINQ, WCF, WPF, WF 제공
C# 4.0 : Visual Studio 2010 - .NET Framework 4.0
C#은 동적 언어와의 바인딩을 지원하는 dynimic 예약어 추가. .NET은 DLR 추가
C# 5.0 : Visual Studio 2012 ~ 2013 - .NET Framework 4.5
C#은 비동기를 위한 async/await 예약어 추가. .NET은 비동기 지원
C# 6.0 : Visual Studio 2015 - .NET Framework 4.6
//BCL에 대한 간략한 정리추가, 문장이 어색한지 다시 한 번 점검, 책 다시 리뷰하면서 흐름상 중요한 부분 삽입.