Java 가상머신 나온환경 : 가상머신이 나오기 이전에는 운영체제마다 다른 언어를 사용해서 다른 운영체제에서 호환이 되지않는 시대에 java에서 각 운영체제마다 jave언어를 호환하게 하는 가상머신을 제작하여 베포함 그래서 개발자가 java 원어만 배워도 여러 운영체제에서도 java언어를 사용할수 있게 함.
Java에서 가상머신을 개발한걸 보고 윈도우에서 C#용 가상머신을 만듬
어셈블리어 : 컴퓨터한테 직관적인 언어로 직접적으로 메모리 관리에 쓰이는 소스코드다.
C#도 어셈블리어 같은 C# compiler가 CIL code(Bytecode)로 변환해줌
.NET 환경의 컴파일 과정
- C#은 .NET 프레임워크의 의해 실행파일을 만든다.
- 메모리 관리, 쓰레드 컨트롤 등 간접적인 관리와 운용이 가상머신의 인해 관리된다.
- CLR은 런타임에 JIT(Just-in-Time) 방식으로 운영체제가 이해할 수 있는 Native Code로 변환한다.
- 가상머신이 데이터 저장 정보를 갖고있어서 다른 타입으로 접근시 저장된 데이터에 접근(리플렉션 기능) 해서 비교해서 거부하는 기능도 있음
리플렉션(Reflection) : 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 .NET의 기능
* ex : startCountine 함수를 사용시 (" ")에 클래스내 함수이름을 적으면 가상머신이 클래스내 같은이름의 함수를 찾는다
- 단점 : 가상머신에서 저장된 데이터를 접근해서 읽어야 하기 때문에 느리다는 단점이 있음
제네릭(generic) : 데이터의 타입(data type)을 일반화함.
- 상속된 객체정보를 알수있음
- 리플렉션이 느리다는 단점을 보완하기 위해 제네릭을 대신사용 하는 경우도 있다.
- 딕셔너리 자료구조에서 자주 쓰임
- C++에도 거의 같은 용도을 가진 템플릿이라는게 있음(제네릭은 런타임형식, 템플릿은 컴파일)
* ex : <T>사용