스프링을 사용하다보면 List<? extends >형식을 봤을 것 이다.
이게 무엇인지 이번에 알아보자.
1. List ? extend와 List의 차이
Apple과 Fruit란 클래스가 있다.
Apple은 Fruit객체를 상속받고 있다.
List<Apple>에는 Apple의 객체를 담았고
List<Fruit> 객체는 Apple의 객체와 Fruit 객체를 담았다.
하지만 List<fruit>객체에 List<Apple>의 객체를 담을려고 하지만 담을 수 없다고 뜬다.
이유는 무엇일까?
분명히 Fruit객체는 Apple의 객체의 부모이고
Apple 객체는 Fruit객체의 자식인데 담을 수가 없다.
그 이유는
한 객체를 List로 만들어버리면 상속을 받는 관계든 구현을 받든 관계든 별개의 클래스로 취급하기 때문이다
즉 List<Apple> 개체와 List<Fruit> 개체와는 별개의 클래스란 뜻이다.
Apple개체와 Fruit개체와는 상속관계로 맺어져있지만
List<Apple>과 List<Fruit>와는 상속자체가 맺어짖 않은 별개에 클래스다.
이것은 List형태로 묶어버리면 이런 현상이 발생하는 것 이다.
이러한것을 가능하게 하는 것이 List<? extends Fruit>이다.
? extends Fruit 는 List의 형태라도 Fruit를 상속받는 모든 구현체들을 List형태로 담을 수 있게 만드는 것이다.
즉 ? extends Fruit를 사용한다면 Fruit를 상속받은 Apple의 구현체도 들어갈 수 있다는 뜻이 된다.
이렇게 ? extends Fruit로 바꿧더니 에러가 사라진 걸 볼 수 있다.
그렇다면 ? extends는 언제 사용하는 것 인가?
예를들어
List의 어떤 최상위 객체가 있다.
하지만 나는 최상위 객체를 구현받은 어떠한 객체가 있는데
이 객체를 List형태로 만들어서 최상위 객체 List에 저장하고싶다.
하지만 List로 묶는순간 상속관계가 되었던 안되었던간에 별개의 클래스로 취급해버리기 때문에
? extends 를 사용해야 한다.
사용한다면 ? extends (객체)를 받은 모든 구현체는 List형태로 묶여도 들어올 수 있게 되는 것 이다.
'JAVA 기초' 카테고리의 다른 글
[자바 기초] 다운캐스팅과 업캐스팅 (1) | 2023.12.25 |
---|---|
[자바 기초 ] - Call by value 와 Call By Reference란 무엇인가? (1) | 2023.10.06 |
[자바 기초] 알고리즘 필수인 StringTokenizer의 개념 (0) | 2023.08.09 |
[자바 기초] Return 과 break의 개념과 차이 점 - With Java (0) | 2023.08.03 |
[자바 기초] if 와 esle if의 차이 점 (0) | 2023.07.31 |