Open junhochoi-dev opened 1 year ago
질문은 아마 Generic Type으로 Object 형만을 사용할 수 있는 이유를 묻는 것 같습니다. 이전의 제가 맡았던 이슈의 답변을 참고하자면
- 자바에서 제네릭은 완전히 컴파일-타임 구조이다. 컴파일러가 모든 제네릭을 맞는 타입으로 변환해준다. backwards compatibility를 지키기 위해 이렇게 만들어졌다.
- backwards compatibility : 하위 호환성
- 지금은 제네릭을 사용하여 어떤 타입이 들어가는지 정해주거나 알 수 있지만 2004년의 자바 등 오래된 버전에서는 그런 것이 존재하지 않았고, 모든 것들을 Object로 받았다.
- 하위 호환성으로 인해 제네릭으로 사용되는 모든 것들은 Object로 변환할 수 있어야 하지만, primitive type은 그렇지 않다. 그래서 사용할 수 없다. 와 같습니다.
제네릭이 완전히 컴파일 - 타임 구조라는 것은
List<ClassA> list = new ArrayList<ClassA>();
list.add(new ClassA());
ClassA a = list.get(0);
라고 코드를 작성한 것이 컴파일을 하면서
List list = new ArrayList();
list.add(new ClassA());
ClassA a = (ClassA)list.get(0);
와 같은 동작을 하게 만드는 것을 뜻합니다. 이는 오래된 버전의 자바에서 Collection 형들이 Object만을 저장할 수 있게 한 것에 대한 호환성을 깨지 않기 위해서입니다.
참고 https://stackoverflow.com/questions/2721546/why-dont-java-generics-support-primitive-types https://docs.oracle.com/javase/tutorial/java/generics/why.html https://ttl-blog.tistory.com/282#%F0%9F%A7%90%20%EC%A0%9C%EB%84%A4%EB%A6%AD(Generic)%EC%9D%B4%EB%9E%80%3F-1
call by value, call by reference 에 대해 정리한 자료입니다 . https://malangcow.tistory.com/3
문제
contents - 세부 내용
CPP에서는
vector<int>
,stack<int>
,queue<int>
등 기본형 (Primitive Type)으로 컨테이너 내의 데이터형을 정의합니다. JAVA에서는ArrayList<Integer>
,Stack<Integer>
,Queue<Integer>
등 객체형 (Generic Type)으로 컨테이너 내의 데이터를 정의합니다. 각 언어의 장단점이 있겠지만 JAVA의 컨테이너 내의 데이터 형을 객체형 (Generic Type)으로 정의한 이유와 장단점에 대해서 논의해보고 싶습니다.참고
p.650 ~