제네릭을 만들 때 그 당시 여유상황이 별로 없었기 때문에 타입 소거 방식의 제네릭을 택했기 때문.
타입 소거 방식 때문에 컴파일 이후 자바 제네릭은 그 타입을 잃어 버리고 원시타입이 됨.
ArrayList<Integer>,
ArrayList<String> 가 컴파일 후 ArrayList 가 된다는 것.
그렇기 때문에 메서드 오버로딩에서 ArrayList<Integer> 와 ArrayList<String> 를 하면 컴파일 에러 발생.
왜? 어차피 같은 Array 원시타입이거든
타입 소거의 가장 큰 문제점은 성능이 별로 좋지 않다는 것.
ArrayList<int>, ArrayList<long> 이런게 자바에서 없는 이유,
자바는 본질적으로 int, Object 사이 직접적인 형 변환 지원 안함.
타입 소거로 타입을 없애버리면 형 변환 코드로 답이 안나온다는 말임.
어케할까 고민하다 싸지른게 ArrayList<Integer>, ArrayList<Long> 이렇게 래퍼객체를 쓰자 였음.
사용자는 타이핑 좀 더 하는거말고 불편함 못느낌
그런데 뒷단에선 배열 하나 생성할 때마다 존나 많은 래퍼클래스 + 박싱,언박싱 콤보를 처맞게됨.
List<Integer> list = new ArrayList<>();
list.add(10) -> 자동 박싱
int value = list.get(0) -> 자동 언박싱
그래서 성능이 진짜 제네릭을 구현한 여타 언어(C#) 보다 구려질수밖에
성능이 구리다고? 개소리ㅋㅋ제네릭 타입 소거는 성능에 큰 영향 안 줌ㅇㅇJVM이 최적화 잘해서 대부분 케이스에서 오버헤드 거의 없음실제로 벤치마크해보면 C#이랑 별 차이 없음ㅇㅇ래퍼 클래스 + 박싱/언박싱이 문제라고? 또 개소리JVM 1.5부터 오토박싱/언박싱 최적화 개쩜대부분 상황에서 그냥 원시 타입 쓰는 것처럼 최적화함ㅇㅇ그리고 실제로 ArrayList 이런 거 필요한 경우 드물어서 성능에 큰 영향 없음C#이 더 낫다고? 3번째 개소리C#도 제네릭 구현하면서 CLR 크게 바꿔야 했음ㅇㅇ자바는 하위 호환성 유지하면서 제네릭 도입한 거임그래서 타입 소거 방식 택한 거고메서드 오버로딩 문제? 이건 맞는 말근데 이거 실제로 큰 문제 되는 경우 드물고 다른 방식으로 해결 가능함ㅇㅇ
제네릭 성능 구리다는 건 옛날 얘기임ㅋㅋ 요즘 JVM 개쩔어서 대부분 상황에서 성능 차이 거의 없음ㅇㅇ 실제 프로젝트에서 제네릭 때문에 성능 문제 생기는 경우 거의 없음 ㅇㅇ 이래도 납득 안 되면 실제로 벤치마크해보셈ㅋ
발할라 프로젝트에서도 언박싱 부하 해결하려고 노력중인데. 이미 비슷하면 할필요없지않나. 벤치마크도니 자료 링크좀.
제네릭에 프리미티브 타입 쓸때만 래퍼타입때문에 느린거지 제네릭 자체가 느린건 아니잖아
래퍼 클래스에 따른 손해가 있는건 사실인데, 대부분의 상황에서는 없다고 봐도 무방함 발할라 프로젝트에서는 그 대부분의 상황이 아닌 상황에서도 성능 손해를 안보려고 하는거지 자바가 특정 케이스들에서 성능 안나오긴 해
시발 고수들의 대화라 아는척을 몬하것네 ㅋㅋㅋ
그래서 원시타입이 아닌 객체로 선언하는거였군 - dc App
하와와~