닷넷 관련 키워드 정리
.NET Framework
.NET Framework는 MS에서 2000년 6월에 발표한 응용 프로그램 개발 환경이다.
각종 응용 프로그램을 작성 및 실행 해주는 걸 도와줌으로써 개발자가 응용 프로그램의 비즈니스 코드에만 집중할 수 있게 도와준다.
소프트웨어를 어느 곳에서나 수정 없이 쓰려면 호환성의 문제를 해결해야 한다. .NET은 다양한 운영체제에서 작동하는 호환성을 목표로 만들어졌으며,
웹 상의 어느 곳에서나 실행 가능한 프로그램을 작성하는 것이 .NET의 궁극적인 목표이다. 그래서 중간 언어와 JIT 컴파일러를 통해 플랫폼 독립성을 확보하고 언어의 상호 운용이 가능하다는 장점이 있지만 그와 동시에 2번의 컴파일을 거치기 때문에 속도가 떨어진다는 단점이 공존한다.
.NET의 계층구조는 다음과 같다.

이 그림을 간단히 설명하자면 .NET은 CLR + 부가 구성요소로 되어있다. CLR은 밑에서 설명할 것이고, 주요 부가 구성요소는 다음과 같다.
- BCL(Base Class Library)
MS에서 특정 기능들을 바로 쓸 수 있게 구현해 놓은 클래스들이다. 아래는 BCL에 포함된 클래스의 목록과 기능들이다.- 기본 타입에 대한 정보 제공
- 배열, 연결리스트 , 큐 등의 컬렉션 클래스
- 스레드와 동기화 클래스
- 각종 컨트롤
- 파일 입출력
- 네트워크 프로그래밍
- 데이터베이스 액세스
- 실행파일
.NET은 기본적으로 C#, VB.NET의 컴파일러를 제공하고, 각종 유틸리티 성격의 실행 파일을 포함하고 있다. - GAC(Global Assembly Cache)
컴퓨터에서 실행되는 .NET 프로그램들이 쓸 수 있는 어셈블리 파일을 저장하고 있는 전역 저장소이다.
CLR
CLR(Common Language Runtime)은 CLI 사양을 따르는 가상 머신이다. CLT가 하는 일은 다음과 같다.
- IL 코드를 기계어로 컴파일
- 동적 메모리 관리
- 보안
- 예외처리 등의 일을 한다.
여기서 가장 주 된 업무인 1번과 2번이다.
1번 업무인 IL 코드를 기계어로 컴파일하는 것은 CLR 내의 JIT(Just In Time) 컴파일러가 담당한다. CLR과 CLS의 존재로 인해서 .NET 호환 언어에 한해서 언어의 종류에 구애받지 않고 .NET Framework를 기반으로 작동하는 프로그램을 만들 수 있다.
JIT 컴파일러?
managed code의 소스코드는 각 언어의 컴파일러에 의해서 IL코드와 실행에 필요한 정보들을 갖고 있는 메타데이터로 이루어진 managed module로 생성 된다.
이 모듈이 실행될 경우 JIT컴파일러에 의해 실행에 필요한 부분이 곧바로 Native code로 컴파일되어 실행된다. 당연히 매번 실행시마다 JIT컴파일러에 의해 컴파일되어 실행되는 것은 아니고 한번 컴파일 된 부분은 재 사용하는 등의 최적화 과정을 통해 CLR의 코드는 실행된다.
2번 업무인 동적 메모리 관리는 가비지 컬렉터가 담당한다. C 또는 C++로 프로그래밍을 하다보면 메모리 관리때문에 복잡한 경우가 많은데, C#에서는 가비지 컬렉터가 메모리 관리를 대신해주기 때문에 편하게 프로그래밍을 할 수 있다. 하지만 이 가비지 컬렉터 또한 CPU와 메모리를 사용하기 때문에 가비지 컬렉터가 최소한으로 자원을 사용하게 한다면 프로그램의 성능을 높일 수 있다. 가비지 컬렉터의 메커니즘을 파악하면 프로그래밍을 할때의 코딩지침을 세울 수 있다.
CLS가 주는 호환성에 대하여
그 어떤 .NET 호환 언어를 사용해서 코드를 작성하더라도, CLS 규격을 만족한다면 다양한 언어의 결과물 끼리 상호 호출이 가능하다. 컴파일러가 IL코드로 변환하여 CLR에서 실행하기 때문이다. CLR은 윈도우용 CLI 구현체이고, 리눅스의 경우에는 Mono를 쓴다. CLS 규격을 만족한다면 플랫폼 독립적인 IL코드로 변환하여 각 플랫폼의 CLI구현체를 거쳐 다양한 플랫폼에서 작동하는 프로그램을 만들 수 있다.
수정필要
CTS
CTS(Common Type System)은 .NET 호환 언어들이 지켜야 할 Type과 표준 규격을 정의한 것이다.
CTS는 닷넷 프레임워크에 쓴이는 데이터 타입들의 정의와 쓰임에 대한 표준이다. CTS는 언어 간 통합을 용이하게 하기 위해 사용 및 관리되는 데이터 타입 모음을 정의한다.
CTS는 .NET 응용 프로그램, 구성 요소 및 컨트롤이 다른 프로그래밍 언어로 구축되어 정보가 쉽게 공유되는 .NET Framework의 타입을 제공합니다.
C와 C++에서 자주 사용되는 사용자 정의타입의 클래스나 구조체( ex. date, time)를 CTS가 제공해준다. CTS는 코드에 직접 헤더파일이나 라이브러리를 포함 할 필요없이 자주 사용되는 다양한 타입들을 사용할 수 있다.
CTS에서 정의하는 모든 타입은 System.Object에서 파생되도록 설계되었다.
CTS에는 값 타입(Value Type)과 참조 타입(Reference Type)의 2가지 타입이 있다.
- 값 타입 : 값을 변수에 넣는 데이터 형식 -> 스택에 저장
- 참조 타입 : 변수에 대한 위치(메모리 위치)를 담는 데이터 형식 -> 힙과 스택에 저장. GC가 일어나는 원인!
- - -
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# 버전 | .NET 버전 | Visual Studio 버전 |
---|---|---|---|
2002년 1월 | C# 1.0 | .NET Framework 1.0 | Visual Studio .NET 2002 |
2003년 4월 | C# 1.2 | .NET Framework 1.1 | Visual Studio .NET 2002 |
2005년 11월 | C# 2.0 | .NET Framework 2.0 | Visual Studio 2005 |
2007년 11월 | C# 3.0 | .NET Framework 2.0~3.5 | Visual Studio 2008~2010 |
2010년 4월 | C# 4.0 | .NET Framework 4.0 | Visual Studio 2010 |
2012년 8월 | C# 5.0 | .NET Framework 4.5 | Visual Studio 2012~2013 |
2015년 7월 | C# 6.0 | .NET Framework 4.6 | Visual Studio 2015 |
// 문장이 어색한지 다시 한 번 점검, 책 다시 리뷰하면서 흐름상 중요한 부분 삽입.