[Java] Generics
이멀젼씨
·2021. 7. 30. 16:40
목적
제네릭에서 Object와 ?의 차이에 대해 알고자 함
목차
- Generics란?
- List와 Array의 차이
- <Object>와 <?>의 차이
- 파라미터로받는 <Object>와 <?>의 차이
1. Generics란?
List<Integer> list = new ArrayList();
Map<String, String> map = new HashMap();
꺽쇠 안에 사용되어 해당 클래스에 사용되는 타입을 지정해주는 것
List<Integer>와 같이 사용하게 된다면 해당 List는 Integer타입만을 저장하고 사용할 수 있고,
Map<String, String>와 같이 사용하게 된다면 해당 map은 key와 value가 String타입만을 저장하고 사용할 수 있게 된다.
2. List와 Array의 차이
제네릭을 사용하는데 있어서 List와 Array의 차이는 상위클래스와 하위클래스의 관계가 성립하는가 이다.
Object obj[] = new Object[10];
Integer i[] = new Integer[10];
i[0] = 1;
obj = i;
System.out.println(obj[0]);
1
Array는 상위클래스와 하위클래스의 관계가 성립하기 때문에 상위클래스의 Array에 하위클래스의 Array를 할당해도 아무 문제가 없다.
List<Object> list = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
list2.add(1);
list = list2;
System.out.println(list.get(0));
error: incompatible types: List<Integer> cannot be converted to List<Object>
List<Ojbect>와 List<Integer>는 상위클래스와 하위클래스의 관계가 성립하지 않기 때문에 컴파일 에러가 발생한다.
상하위 클래스 관계가 성립하는지가 Array와 List의 차이이다.
3. <Object>와 <?>의 차이
List<Object> list = new ArrayList<>();
List안에 Object타입의 데이터를 넣을 수 있다.
따라서 Object를 상속받는 모든 타입을 넣을 수 있다.
List<?> list = new ArrayList<>();
List안에 ? 타입의 데이터를 넣을 수 있다.
?는 와일드카드로 어떤 타입인지 모르는 경우를 나타낸다.
타입을 알 수 없으니 어떠한 타입의 데이터도 들어갈 수 없고, 오직 null밖에 넣을 수 없다.
4. 파라미터로받는 <Object>와 <?>의 차이
public void add(List<Number> list){};
파라미터로 List<Number> 타입만 받는다. 그래서 List<Integer>, List<Float> 등의 타입은 받지 못한다.
변수를 선언하는 경우와 파라미터로 받는 경우에서 다른점은 ,
변수로 선언하는 경우 리스트가 받고자 하는 타입을 정의한 것이고, 파라미터로 받는 경우는 메소드의 매개변수로 받고자 하는 타입을 정의한 것이다.
따라서 파라미터로 받는 경우엔 정확히 타입이 일치해야만 파라미터로 넘겨줄 수 있다.
public void add(List<?> list){};
파라미터로 List<?>타입만 받는다. List 타입을 받긴 하지만 해당 List가 어떤 타입을 다루는지는 모른다.
그렇기때문에 List<Integer>, List<Float> 등 어떠한 타입을 갖는 List가 오더라도 파라미터로 넘겨줄 수 있다.
'백엔드 > Java' 카테고리의 다른 글
[Java] Objects.requireNonNull과 Optional (0) | 2021.06.09 |
---|