.NET Framework
framework: 프로그램 동작 순서
- C#은 cross platform으로 다양한 플랫폼에 대응할 수 있는 언어이다. 그것을 가능하게 만드는 것이 .NET. .NET은 C#과 Computer 사이에 끼여있는 framework이므로 midware라고도 불린다. 정확히 .NET은 CLR(Common Language Runtime: 공용 언어 런타임)와 클래스 라이브러리 세트이다.
C# 프로그램 실행 시
[그림 1] c, cpp 계층 구도
[그림 1]과 같이 C, Cpp은 각 플랫폼마다 대응을 하는 프로그램을 만들어야 한다. 이렇게 플랫폼 바로 위에서 구동하는 언어를 native language라고 한다.
[그림 2] c# 계층 구도
그 반면에 c#은 [그림 2]와 같이 .NET 위에서 구동 된다. 즉 c#은 바로 플랫폼과 대응되는 구조가 아닌 .NET을 한 번 거쳐 들어가는 구조이다. 그 순서는 다음과 같다.
- C#언어로 짜여진 script는 .NET midware에 CLI(Common Language Infra)에 맞는 IL(Intermediate Language) 언어로 compile 된다.
- .NET에서 compile된 IL언어와 프로그램 구동에 필요한 리소스들은 함께 패키징되어 Assembly가 된다.
- Assembly는 MSIL code, TYPE metadata, resource, assembly manifest가 합쳐진 것으로 .exe 파일 또는 .dll에 저장
- 프로그램이 실행될 때, Assembly가 CLR(Common Language Runtime)에 로드 되어 해당 플랫폼에 대응되는 native code로 변환해준다.
.NET은 C#외에도 F#, Visual Basic에서도 돌아가는 framework이다. 여러 .NET 언어에 대응이 되어야 하기 때문에 공통으로 쓸 수 있는 CTS를 지원한다.
CTS는 System.Object에서 파생되어 값 타입(Value Type), 참조 타입(Reference Type)으로 나누어 진다.
각각의 특징은 다음과 같다.
- 값 타입(Value Type) : int, enum, struct, boolean 등 대부분의 primitive type 포함
- 객체에 data의 값이 그대로 저장된다.
- 상속이 불가능 하다.
- struct을 제외한 모든 타입은 System.ValueType에서 파생된다.
- 참조 타입(Reference Type): String, Array, Class, Interface 등
- 객체에 데이터의 메모리 값이 저장된다. (데이터에 대한 참조를 가진다.)
- instsance 값은 힙 메모리에 저장된다.
- Null 값을 할당할 수 있다.
Boxing vs. Unboxing
- Boxing: 값 타입을 object 타입으로 변환하거나 값 타입에서 구현된 임의의 interface 타입으로 변환하는 프로세스. 이 과정에서 새로운 isntance를 생성해 힙으로 복사한다.
- Unboxing: Boxing된 object 타입 혹은 interface 타입을 원래의 값 타입으로 변환하는 프로세스. 힙에서 스택으로 값이 복사된다.
using System;
class BoxingUnboxing
{
struct Foo : IFoo {}
interface IFoo {}
staic void Main()
{
int a = 20;
//Boxing
//1. 값타입을 object 타입으로 변환
object o = 10;
object o2 = a;
object o3 = new Foo(); //boxing은 암시적으로 변환한다.
//2. 값타입을 갑타입에서 구현된 임의의 인터페이스 타입으로 변환
IFoo ifoo = new Foo();
//Unboxing
//1. object 타입을 본래의 값타입으로 변환
int num = (int)o;
//2. interface 타입을 본래의 값타입으로 변환
Foo foo = (Foo)ifoo; //Unboxing은 명시적으로 변환한다.
}
}
boxing, unboxing 과정에서 많은 계산 과정이 필요로 하기 때문에 시간이 많이 걸리므로 주의할 필요가 있다.