티스토리 뷰
제네릭스란?
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)을 넣어줄 수 없는데 스택 오버플로우를 찾아보니 자바에서의 제네릭스는 컴파일관련해서 원시적 타입을 쓸 수 없다고 한다.
'Java' 카테고리의 다른 글
HashMap 에서 최대값(Max) 뽑기 (0) | 2018.01.31 |
---|---|
(cafe24 카페24 호스팅) Access denied ~~ 에러 뜰 때 (2) | 2017.04.20 |
System 클래스의 스트림 멤버들 (0) | 2017.02.06 |
Hello World! (0) | 2017.02.06 |
추상클래스 vs 인터페이스 (0) | 2017.02.06 |