: 만약 게임을 제작해서 PC, 안드로이드, iOS 버전을 다 배포하기로 했다. 고전 방식으로는 각 플랫폼에 따라 알맞은 코드를 다시 작성해야 한다. 이러한 번거로움을 없애기 위해 하나의 코드로 여러 플랫폼에 대응하는 프로그램을 제작할 수 있는 java가 탄생했다.
C# 또한 하나의 코드로 여러 플랫폼에 대응하는 프로그램을 제작해주는 프로그램이 있다. 바로 그것이 .NET 아키텍쳐이다.
.NET 아키텍쳐는 C# 코드를 읽어서 실행하고, 플랫폼에 대응하도록 다시 컴파일하는 미들웨어다.
1) 공용 언어 런타임 (CLR, Common Language Runtime)
2) 표준 클래스 라이브러리
1) 소스 코드를 기반으로 프로그램을 만드는 과정
2) C# 코드의 빌드 과정
1) 언어마다 존재하는 타입시스템이 있으며, .NET은 세가지 언어가 동작
2) 이 세가지 언어가 모두 공용으로 사용할 수 있는 공용 타입시스템이 존재
3) .NET의 모든 타입은 값 타입 혹은 참조 타입으로 나뉨
4) 모든 타입은 System.Object에 근간
1) 구조체, 열거형, 그 외 기본 제공 타입으로 구성
2) System.ValueType에서 파생 (구조체 제외)
3) 상속이 불가능함
4) 스택에 데이터가 저장
1) 클래스, 대리자, 배열, 인터페이스로 구성
2) 힙 메모리에 데이터가 저장, 스택에 데이터가 저장된 주소가 저장
3) null을 할당할 수 있음
1) 값 타입을 참조 타입으로 바꾸는 것
2) 암시적으로 가능
int number = 10; // 값타입
object o; // 참조타입
o = number; // 이 가능한데, 이것이 박싱의 결과임, 암시적이다
o = new object(number); // 과 같은 의미인데, 힙에 인스턴스라는 데이터 영역을 만들어서 10을 복사 ->
// 힙에 복사한 결과를 저장해줌 이게 패키징한다고 느껴져서 박싱이라고 함
1) 박싱된 데이터를 값 타입으로 바꿈
2) 힙 영역의 데이터를 스택으로 복사
3) 명시적으로 코드를 작성해야 함
int number2 = (int)o; // unboxing, 명시적이다
objext o2 = null;
int number3 = (int)o2; // 이는 언박싱이 아님, number3에 저장되는 데이터는 박싱된 적이 없기 때문
: 박싱과 언박싱은 병목 지점이 될 수 있으므로 잘 알고 피할 수 있어야 함
→ 라이브러리를 사용할 때 인자로 object 타입이 적혀있는 것을 발견할 수 있다. 이 때 값 타입을 넣을 경우 암시적으로 박싱이 일어나 메모리 영역에서 스택과 힙의 복사가 일어나게 된다. 이는 새로운 객체를 생성하는 것으로 오랜 시간이 소요되는 연산이다.