Java Generic <?> 과<? extends Object>

timothy jeong·2021년 7월 22일
0

JavaBasic

목록 보기
2/2

자바를 공부했을때 Generic 이라는 개념은 들어갈 수 있는 Object를 와일드 카드로 처리하는 것으로 이해했다.

그런 상태에서 이것저것 만들다보니 <S extends T> 형태의 메서드를 제공하는 인터페이스가 보였다. 그리고 이게 뭔지 나는 이해할 수 없었다. 그래서 검색해보니 나와 비슷한 의문을 가진 사람들이 역시나 있었다.

Generic 선언방법

Generic 을 선언할때 3가지 형태로 선언할 수 있다고 한다. 나는 첫번째 형태만 알고 넘어간 것이었다...

  • <?>
    임의의 Object로 설정한다.

  • <? extends O>
    구체적으로 <? extends Number> 이러한 형태로 제네릭이 정의되었다면, 이 변수는 Number객체나 하위 객체들만 담을 수 있어진다. 이 경우는 Integer나 Double이 될 것이다.

  • <? super O>
    위의 경우와 반대의 경우일것이다. <? super Integer> 로 정의되었다면 Integer 부터 상위의 Number, Object가 가능할 것이다.

<?> 와 <? extends Object>의 차이

여기서 드는 의문은 그러면 기본적으로 <?> 형태와 <? extends Object> 는 동일한게 아닐까? <?> 는 아무 객체나 들어올 수 있고, <? extends Object> 역시 Object를 포함한 하위의 모든 객체들, 그러니까 모든 가능한 객체들이 들어오는거니까?

그런데 둘에는 차이가 있다고 한다. 컴파일시 전달되는 정보에 차이가 있는 것인데 Baeldung에 잘 설명되어 있다.

Reifiable types 이란 컴파일시 정보가 지워지지 않는 것들을 이야기한다. 반대로 non-reifiable type 의 경우에는 컴파일시 정보가 지워져 전달되기 때문에 상대적으로 더 적은 정보가 컴파일러에게 전달된다.

예외적으로 unbounded wildcard types은 reifiable하다고 한다.List 와 Map 는 reifiable한 것이다.List<? extends Object> 는 reifiable하지 않다. 의외로 제네릭의 범위를 제한한 경우가 컴파일러에게 전달되는 정보가 적어진다고 하니 신기하다.

Refined Type

runtime 단계에서 타입에 대하 정보가 있는 경우 그 타입은 구체화되었다(reified)고 한다.
java에서 reified 되는 타입들은 다음과 같다.

  • primitive type
  • List 나 HashMap 같은 Raw type
  • 모든 타입들이 와일드카드인 제네릭 List, HashMap
  • String[], int[]와 같은 Refined Type의 Array

자료 출처

stackoverflow
Baeldung
nillk.tistory

profile
개발자

0개의 댓글