11 .NET에 대한 이해

김민영·2023년 1월 19일
0

C# 기초 프로그래밍

목록 보기
10/18

🦥 .NET 아키텍쳐

: 만약 게임을 제작해서 PC, 안드로이드, iOS 버전을 다 배포하기로 했다. 고전 방식으로는 각 플랫폼에 따라 알맞은 코드를 다시 작성해야 한다. 이러한 번거로움을 없애기 위해 하나의 코드로 여러 플랫폼에 대응하는 프로그램을 제작할 수 있는 java가 탄생했다.

C# 또한 하나의 코드로 여러 플랫폼에 대응하는 프로그램을 제작해주는 프로그램이 있다. 바로 그것이 .NET 아키텍쳐이다.

.NET 아키텍쳐는 C# 코드를 읽어서 실행하고, 플랫폼에 대응하도록 다시 컴파일하는 미들웨어다.

1. 구성 요소

1) 공용 언어 런타임 (CLR, Common Language Runtime)
2) 표준 클래스 라이브러리

2. 빌드

1) 소스 코드를 기반으로 프로그램을 만드는 과정
2) C# 코드의 빌드 과정

  • CLI 사양을 준수하는 중간 언어(IL언어)로 컴파일
  • IL 언어로 된 코드, 프로그램에 사용된 리소스(커서 아이콘 등)가 패키징되어 어셈블리가 됨
    → 어셈블리는 어셈블리어와는 별개의 개념, 혼동하지 않도록 유의
  • C# 프로그램 실행 시 어셈블리가 CLR에 로드
  • CLR은 IL코드를 플랫폼에 따라 JIT(Just-In-Time, 인터프리터 방식) 혹은 AOT(Ahead-Of-Time, 코드 전체를 미리 컴파일하고 실행) 컴파일을 수행하여 네이티브 명령어로 변환

🦥 공용 타입 시스템 (CTS)

1. 공용 타입 시스템이란?

1) 언어마다 존재하는 타입시스템이 있으며, .NET은 세가지 언어가 동작
2) 이 세가지 언어가 모두 공용으로 사용할 수 있는 공용 타입시스템이 존재
3) .NET의 모든 타입은 값 타입 혹은 참조 타입으로 나뉨
4) 모든 타입은 System.Object에 근간

2. 값 타입 (Value Type)

1) 구조체, 열거형, 그 외 기본 제공 타입으로 구성
2) System.ValueType에서 파생 (구조체 제외)
3) 상속이 불가능함
4) 스택에 데이터가 저장

3. 참조 타입 (Reference Type)

1) 클래스, 대리자, 배열, 인터페이스로 구성
2) 힙 메모리에 데이터가 저장, 스택에 데이터가 저장된 주소가 저장
3) null을 할당할 수 있음

🦥 박싱과 언박싱

1. 박싱

1) 값 타입을 참조 타입으로 바꾸는 것
2) 암시적으로 가능

int number = 10;  // 값타입
object o;  // 참조타입
o = number; // 이 가능한데, 이것이 박싱의 결과임, 암시적이다

o = new object(number); // 과 같은 의미인데, 힙에 인스턴스라는 데이터 영역을 만들어서 10을 복사 ->
// 힙에 복사한 결과를 저장해줌 이게 패키징한다고 느껴져서 박싱이라고 함

2. 언박싱

1) 박싱된 데이터를 값 타입으로 바꿈
2) 힙 영역의 데이터를 스택으로 복사
3) 명시적으로 코드를 작성해야 함

int number2 = (int)o; // unboxing, 명시적이다

objext o2 = null;
int number3 = (int)o2;  // 이는 언박싱이 아님, number3에 저장되는 데이터는 박싱된 적이 없기 때문

3. 특징

: 박싱과 언박싱은 병목 지점이 될 수 있으므로 잘 알고 피할 수 있어야 함
→ 라이브러리를 사용할 때 인자로 object 타입이 적혀있는 것을 발견할 수 있다. 이 때 값 타입을 넣을 경우 암시적으로 박싱이 일어나 메모리 영역에서 스택과 힙의 복사가 일어나게 된다. 이는 새로운 객체를 생성하는 것으로 오랜 시간이 소요되는 연산이다.

0개의 댓글