... | ... | @@ -5,7 +5,7 @@ |
|
|
.NET Framework(이하 닷넷)는 MS에서 2000년에 발표한 응용 프로그램 개발 환경이다. 닷넷은 각종 응용 프로그램을 작성 및 실행 해주는 걸 도와줌으로써 개발자가 응용 프로그램의 비즈니스 코드에만 집중할 수 있게 도와준다.
|
|
|
|
|
|
닷넷은 다양한 운영체제에서 작동하는 호환성을 목표로 만들어졌다. 그래서 중간 언어와 JIT 컴파일러를 통해 플랫폼 독립성을 확보하고 언어의 상호 운용이 가능하다는 장점이 있지만 그와 동시에 2번의 컴파일을 거치기 때문에 속도가 떨어진다는 단점이 공존한다. 닷넷을 기반으로 만들어진 응용 프로그램들은 닷넷이 미리 설치된 환경에서만 작동한다.
|
|
|
|
|
|
<br />
|
|
|
닷넷의 계층구조는 다음과 같다.
|
|
|
<br />
|
|
|

|
... | ... | @@ -28,37 +28,19 @@ MS에서 특정 기능들을 바로 쓸 수 있게 구현해 놓은 클래스들 |
|
|
|
|
|
<br />
|
|
|
## CLR(Common Language Runtime)
|
|
|
직역하자면 공용 언어 런타임이라는 뜻인데 닷넷 실행 엔진을 의미한다. 자바의 가상 머신(JVM)과 개념적으로 동일하다. CLR은 닷넷 프로그램 실행에 필수적인 런타임들의 집합이되 이름이 의미하듯에 모든 언어에 공용으로 사용된다. 어떤 언어로 만든 프로그램이든지 IL을 JIT로 컴파일한 후 CLR과 연결되므로 제작 언어에 상관없이 CLR의 서비스를 받을 수 있다.
|
|
|
직역하자면 공용 언어 런타임이라는 뜻인데 닷넷 실행 엔진을 의미한다. 자바의 가상 머신(JVM)과 개념적으로 동일하다. CLR은 닷넷 프로그램 실행에 필수적인 런타임들의 집합이되 이름이 의미하듯이 모든 언어에 공용으로 사용된다. 어떤 언어로 만든 프로그램이든지 IL을 JIT로 컴파일한 후 CLR과 연결되므로 제작 언어에 상관없이 CLR의 서비스를 받을 수 있다.
|
|
|
|
|
|
CLR은 닷넷의 핵심 커널이다. 응용 프로그램이 실행되면 CLR이 권한을 확인하고 프로세스를 생성하며 코드의 안전성을 검사한다. 보안 점검이 완료되면 첫 번째 스레드를 생성하여 응용 프로그램의 코드를 실행시킨다. 실행 중에 응용 프로그램의 요청을 받아 때로는 직접 처리하기도 하고 때로는 호스트 운영체제와 통신을 주선하기도 한다. CLR은 운영체제와 닷넷 응용 프로그램 사이에 위치하며 한마디로 닷넷 프로그램 실행을 위한 모든 서비스를 제공하는 실행 주체라고 할 수 있다.
|
|
|
|
|
|
|
|
|
CLR은 CLI 사양을 따르는 가상 머신이다. CLR가 하는 일은 다음과 같다.
|
|
|
1. **IL 코드를 기계어로 컴파일**
|
|
|
2. **동적 메모리 관리**
|
|
|
3. 보안
|
|
|
4. 예외처리
|
|
|
등의 일을 한다.
|
|
|
|
|
|
여기서 가장 주된 업무는 **1번**과 **2번**이다.
|
|
|
|
|
|
<br />
|
|
|
|
|
|
**IL 코드를 기계어로 컴파일**하는 것은 CLR 내의 JIT(Just In Time) 컴파일러가 담당한다. CLR과 CLS의 존재로 인해서 닷넷 호환 언어에 한해서 언어의 종류에 구애받지 않고 닷넷을 기반으로 작동하는 프로그램을 만들 수 있다.
|
|
|

|
|
|
<br />
|
|
|
닷넷 응용 프로그램은 운영체제와 직접 통신하지 않으며 반드시 CLR을 거쳐야 한다. CLR은 물론 플랫폼별로 따로 제공된다. CLR이 호스트 운영체제와의 통신을 책임지므로 응용 프로그램은 운영체제에 대해서 독립적이다. 응용 프로그램은 호스트 운영체제는 거의 신경 쓸 필요가 없고 오로지 CLR과의 약속만 잘 지키면 된다.
|
|
|
|
|
|
>**JIT 컴파일러?**
|
|
|
>managed code의 소스코드는 각 언어의 컴파일러에 의해서 IL코드와 실행에 필요한 정보들을 갖고 있는 메타데이터로 이루어진 managed module로 생성 된다.
|
|
|
|
|
|
>이 모듈이 실행될 경우 JIT컴파일러에 의해 실행에 필요한 부분이 곧바로 Native code로 컴파일되어 실행된다. 당연히 매번 실행시마다 JIT컴파일러에 의해 컴파일되어 실행되는 것은 아니고 한번 컴파일 된 부분은 재 사용하는 등의 최적화 과정을 통해 CLR의 코드는 실행된다.
|
|
|
|
|
|
<br />
|
|
|
|
|
|
>**CLS가 주는 호환성에 대하여**
|
|
|
>그 어떤 닷넷 호환 언어를 사용해서 코드를 작성하더라도, CLS 규격을 만족한다면 다양한 언어의 결과물 끼리 상호 호출이 가능하다. 컴파일러가 IL코드로 변환하여 CLR에서 실행하기 때문이다. CLR은 윈도우용 CLI 구현체이고, 리눅스의 경우에는 Mono를 쓴다. CLS 규격을 만족한다면 플랫폼 독립적인 IL코드로 변환하여 각 플랫폼의 CLI구현체를 거쳐 다양한 플랫폼에서 작동하는 프로그램을 만들 수 있다.
|
|
|
|
|
|
<br />
|
|
|
|
|
|
**동적 메모리 관리**는 가비지 컬렉터가 담당한다. C 또는 C++로 프로그래밍을 하다보면 메모리 관리때문에 복잡한 경우가 많은데, C#에서는 가비지 컬렉터가 메모리 관리를 대신해주기 때문에 편하게 프로그래밍을 할 수 있다.
|
|
|
**동적 메모리 관리**는 CLR 내의 가비지 컬렉터가 담당한다. C 또는 C++로 프로그래밍을 하다보면 메모리 관리때문에 복잡한 경우가 많은데, C#에서는 가비지 컬렉터가 메모리 관리를 대신해주기 때문에 편하게 프로그래밍을 할 수 있다.
|
|
|
하지만 이 가비지 컬렉터 또한 CPU와 메모리를 사용하기 때문에 가비지 컬렉터가 최소한으로 자원을 사용하게 한다면 프로그램의 성능을 높일 수 있다.
|
|
|
|
|
|
<br />
|
... | ... | @@ -74,8 +56,9 @@ CLR은 CLI 사양을 따르는 가상 머신이다. CLR가 하는 일은 다음 |
|
|
|
|
|
CTS는 값 타입(Value Type)과 참조 타입(Reference Type)의 2가지로 나눌 수 있다.
|
|
|
|
|
|
>**값 타입? 참조타입?**
|
|
|
>* 값 타입 : 값을 변수에 넣는 데이터 형식 -> 스택에 저장
|
|
|
>* 참조 타입 : 변수에 대한 위치(메모리 위치)를 담는 데이터 형식 -> 힙과 스택에 저장. GC가 일어나는 원인!
|
|
|
>* 참조 타입 : 변수에 대한 위치(메모리 위치)를 담는 데이터 형식 -> 힙과 스택에 저장. 가비지 컬렉팅이 일어나는 원인!
|
|
|
|
|
|
<br />
|
|
|
|
... | ... | @@ -87,19 +70,18 @@ CTS는 값 타입(Value Type)과 참조 타입(Reference Type)의 2가지로 나 |
|
|
## 어셈블리(Assembly)
|
|
|
어셈블리는 닷넷에서의 실행파일(주로 EXE, DLL 파일)을 말한다.
|
|
|
|
|
|
어셈블리는 1개 이상의 모듈로 구성되는데, 모듈 하나당 한 개의 파일이 대응된다. 하지만 여러개의 파일이 어셈블리를 구성한다면 이 파일들의 목록을 관리하는 데이터가 필요하다. 그 때문에 이 모듈 중의 하나는 다른 모듈의 목록을 관리하는 매니페스트(Manifest) 데이터를 갖고있다.
|
|
|
메니페스트를 포함하고 있지 않은 모듈은 확장자가 netmodule이고, 메니페스트를 포함하는 경우에는 확장자가 DLL(또는 EXE)이다.
|
|
|
어셈블리는 1개 이상의 모듈로 구성되는데, 모듈 하나당 한 개의 파일이 대응된다. 하지만 여러개의 파일이 어셈블리를 구성한다면 이 파일들의 목록을 관리하는 데이터가 필요하다. 그 때문에 이 모듈 중의 하나는 다른 모듈의 목록을 관리하는 매니페스트(Manifest) 데이터를 갖고있다. 메니페스트를 포함하고 있지 않은 모듈은 확장자가 netmodule이고, 메니페스트를 포함하는 경우에는 확장자가 DLL(또는 EXE)이다.
|
|
|
|
|
|
|
|
|
|
|
|
>**EXE 와 DLL의 차이**
|
|
|
>DLL의 내부에 구현된 API는 외부에서 참조 할 수 있지만 EXE는 불가능하다. 그래서 재사용 가능한 코드는 컴파일해서 DLL 파일에 모아두고 서로 다른 EXE에서 공유해서 사용하는 방식이 일반적이다.
|
|
|
|
|
|
>>>
|
|
|
EXE 와 DLL의 차이
|
|
|
DLL의 내부에 구현된 API는 외부에서 참조 할 수 있지만 EXE는 불가능하다. 그래서 재사용 가능한 코드는 컴파일해서 DLL 파일에 모아두고 서로 다른 EXE에서 공유해서 사용하는 방식이 일반적이다.
|
|
|
>>>
|
|
|
|
|
|
<br />
|
|
|
## Managed
|
|
|
VB.NET 또는 C# 등의 소스코드가 컴파일러를 거친후 IL 코드로 변환되고, IL 코드가 CLR 통해 실행되는데 이 프로세스를 **Managed Process**라고 한다.
|
|
|
또한 CLR자체를 **Managed Environment**라고 하며,
|
|
|
닷넷 호환 언어 역시 기존의 언어와 구분하는 의미에서 **Managed Language**라고 한다.
|
|
|
또한 CLR자체를 **Managed Environment**라고 하며, 닷넷 호환 언어 역시 기존의 언어와 구분하는 의미에서 **Managed Language**라고 한다.
|
|
|
|
|
|
Managed Process를 그림으로 나타내면 다음과 같다.
|
|
|
|
... | ... | @@ -107,7 +89,7 @@ Managed Process를 그림으로 나타내면 다음과 같다. |
|
|
|
|
|
<br />
|
|
|
## Unmanaged
|
|
|
Managed와 달리 IL 코드 같은 중간 언어를 거치지 않고 컴파일 이후 바로 실행이 되는 머신 코드를 만들어 내는 것을 말한다. 때문에 속도에 장점을 가진다.
|
|
|
Managed와 달리 IL코드 같은 중간 언어를 거치지 않고 컴파일 이후 바로 실행이 되는 머신 코드를 만들어 내는 것을 말한다. 때문에 속도에 장점을 가진다.
|
|
|
|
|
|
Unmanaged Process를 그림으로 나타내면 다음과 같다.
|
|
|
|
... | ... | @@ -129,5 +111,3 @@ C#, Visual Studio, 닷넷과의 버전 간의 상관 관계는 다음과 같다. |
|
|
|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 | |
|
|
\ No newline at end of file |
|
|
|
|
|
// 문장이 어색한지 다시 한 번 점검, 책 다시 리뷰하면서 흐름상 중요한 부분 삽입. |