Generics란?
제네릭스란?
ArrayList<String> arrList = new ArrayList<String>();
우리가 객체를 생성할 때,
ArrayList arrList = new ArrayList();
위와 같이 생성했었다. 그렇다면 제네릭스로 선언하는건 또 뭘까?
물론 기존 방식대로 객체를 사용해도 당장은 문제가 없다. 하지만 형 변환에서 문제가 생긴다.
제네릭스를 사용하지 않는다면,
ArrayList arrList = new ArrayList(); //제네릭스를 생략하면 arrList는 Object형 객체로 생성 됨 arrList.add("Hi"); arrList.add("World"); String hi = (String)arrList.get(0); String world = (String)arrList.get(1); |
이런식으로 해당 값을 불러올 때 형변환을 반드시 해줘야 한다.
왜냐면 new로 객체를 생성할 때, 명시적으로 형을 안주었기 때문에 디폴트(?)인 Object형이 되어버렸기 때문이다.
그렇다면 위의 내용을 제네릭스로 표현해보자.
ArrayList<String> arrList = new ArrayList<String>(); //이렇게 선언하면 이 arrList라는 ArrayList에는 String형 자료만 담을 수 있다는 의미가 된다. arrList.add("Hi"); arrList.add("World"); String hi = arrList.get(0); String world = arrList.get(1); |
이렇게 되면 arrList의 값을 꺼내올 때에도 String형으로 형 변환을 해주지 않아도 된다.
이런 Generics는 HashMap에서도 사용된다. (key, value의 형을 지정해줌)
HashMap<String, String> hMap = new HashMap<String, String>(); |
지금 예시에서는 키, 값 모두 String 형이라고 명시 했지만, 어떤 자료형이든지 들어갈 수 있다.
단, Generics에서 int형을 명시하고 싶을때는 Integer로 넣어줘야한다.
원래 Generics에는 원시적타입(primitive type -> 예시:int)을 넣어줄 수 없는데 스택 오버플로우를 찾아보니 자바에서의 제네릭스는 컴파일관련해서 원시적 타입을 쓸 수 없다고 한다.