2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[자바기초] List<? extends>란 무엇인가?

2024. 1. 31. 22:07ㆍJAVA 기초

 

스프링을 사용하다보면 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형태로 묶여도 들어올 수 있게 되는 것 이다.