.NET Framework

DINO·2023년 12월 9일
0

Csharp

목록 보기
1/1

.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을 한 번 거쳐 들어가는 구조이다. 그 순서는 다음과 같다.

  1. C#언어로 짜여진 script는 .NET midware에 CLI(Common Language Infra)에 맞는 IL(Intermediate Language) 언어로 compile 된다.
  2. .NET에서 compile된 IL언어와 프로그램 구동에 필요한 리소스들은 함께 패키징되어 Assembly가 된다.
  3. Assembly는 MSIL code, TYPE metadata, resource, assembly manifest가 합쳐진 것으로 .exe 파일 또는 .dll에 저장
  4. 프로그램이 실행될 때, Assembly가 CLR(Common Language Runtime)에 로드 되어 해당 플랫폼에 대응되는 native code로 변환해준다.

CTS(Common Type System: 공용 타입 시스템)

.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 과정에서 많은 계산 과정이 필요로 하기 때문에 시간이 많이 걸리므로 주의할 필요가 있다.

profile
NEWB!

0개의 댓글