코딩인터뷰 완전분석 책 13.4번 문제
자바는 type erasure 를 기반으로 한다. 바이트코드로 변환할때 인자로 주어진 타입을 제거하는 기술이다.
Vector<String> vector = new Vector<String>();
vector.add(new String("hello"));
String str = vector.get(0);
컴파일러는 위 코드를 다음과 같이 변환한다.
Vector vector = new Vector();
vector.add(new String("hello"));
String str = (String) vector.get(0);
자바 제네릭은 그저 코드를 좀 더 예쁘게 할 뿐이다.
자바 제네릭은 그저 신태틱 슈가이다.
반면 템플릿은 조금 더 우아한 매크로 기법이다.
컴파일러는 인자로 주어지는 각각의 타입에 대해 별도의 템플릿 코드를 생성한다.
MyClass<Foo> 와 MyClass<Bar>는 정적변수를 공유하지 않는다.
자바에서는 모두 공유한다.
이러한 구조적 차이 때문에 다음과 같은 상황이 발생한다.
- CPP 는 int와 같은 기본 타입을 인자로 넘길 수 있다.
- 자바의 경우 제네릭 타입 인자를 특정한 타입이 되도록 제한할 수 있다.(?)
- 씨플플 템플릿은 인자로 주어진 타입으로부터 객체를 만들어낼 수 있다. (???????)
- 자바에서 제네릭 타입의 인자는 정적 메서드나 변수를 선언하는 데 사용될 수 없다. 왜냐면 Foo 와 Bar 가 이 메서드와 변수를 공유하기 때문이다.
- 자바에서 MyClass로 만든 모든 객체는 제네릭 타입 인자가 무엇이냐에 관계없이 전부 동등한 타입이다. 실행시간에 타입 인자 정보가 삭제된다. (? 씨플플은 삭제 안 되나?)
오늘도 취업의 길은 멀고 험난하기만 하다
Vector
자바도 벡터가 잇는줄 처음 암