[Java] Generics

이멀젼씨

·

2021. 7. 30. 16:40

목적

제네릭에서 Object와 ?의 차이에 대해 알고자 함

목차

  1. Generics란?
  2. List와 Array의 차이
  3. <Object>와 <?>의 차이
  4. 파라미터로받는 <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