티스토리 뷰
포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.
이번시간엔 와일드카드에 대해 배워보자.
우선 와일드카드는 단독으로 사용될 순 없다.
이전 시간에 배운 제네릭 타입(제네릭 클래스)을 더 유연하고 간결하게 쓸 수 있게끔 도와주는 역할을 한다.
그러면 제네릭 메서드랑 와일드카드와의 차이점을 알아보자.
static <T extends Animal> T printAndReturnGeneric(Box<T> box){
T t = box.get();
System.out.println("이름 = " + t.getName());
return t;
} //제네릭 메서드
static Animal printAndReturnWildCard(Box<? extends Animal> box){
Animal animal = box.get();
System.out.println("이름 = " + animal.getName());
return animal;
} //와일드 카드
코드로 보았을 때, 큰 차이를 느낄 수는 없을 수 있다.
와일드카드 부분의 소괄호 내부에 다 합쳐져 있는 것을 볼 수 있다.
그래서 그냥 조금 더 쓰기 편하다.
그리고 자바에서도 같은 기능이라면, 와일드카드를 쓰는 것을 권장한다.
하지만 그럼에도 제네릭 메서드와 와일드카드의 차이점은 있다.
바로 반환타입이다.
제네릭 메서드는 입력받은 타입대로 반환을 시킬 수 있지만, 와일드카드는 입력받은 타입의 부모 타입으로 반환시켜 준다.
따라서 정확한 타입 반환이 요구된다면, 제네릭 메서드를 사용하는 것이 맞다.
또 와일드카드에는 상한/하한 와일드카드가 있다.
바로 위 코드에도 상한 와일드 카드가 있다.
Box<? extends Animal> box
? 가 와일드카드이며, Animal을 상속받는다.
해석해 보면,? 에는 Animal을 상속받는 하위 객체 타입만 들어올 수 있게 제한하는 것이다.
하한 또한 마찬가지이다.
Box<? super Animal> box
하한은 위와 같이 사용되며, 타입이 최소 Animal이상은 들어와야 한다.
Animal은 명시적으로 상속받는 부모가 없으므로(그럴 거라 가정), 들어올 수 있는 타입은 Animal과 Object가 있다.
또한 하한 와일드카드는 제네릭 타입, 제네릭 메서드에는 못쓰고 그냥 와일드카드에서만 사용가능하다.
타입 이레이저
앞서 배운 제네릭 타입은 컴파일 시간에만 타입이 존재하고 Runtime에서는 타입정보가 사라진다.
(컴파일러가 코드 읽고, 바이트 파일에 캐스팅해 주는 코드를 추가해 준다. 런타임 때 이 캐스팅을 통해 실행됨)
그렇기 때문에 Runtime에 제네릭 요소에서 new T 같이 인스턴스를 생성하거나, data instanceof T 같은 코드를 사용할 수없다. ( 컴파일 오류 나고, 런타임에서는 Object로 처리해 줌)
왜냐하면 컴파일 시간에만 타입정보가 존재했다가, 런타임 때 사라지니 타입 정보가 없기 때문이다. ( 타입 이레이저가 함)
자바의 후속버전에 제네릭이 추가되면서 타입 이레이저가 필요해졌다.
왜 삭제할까?
그건 바로 자바에 제네릭이 새로 추가되면서, 기존 자바 버전으로 만들어진 프로그램의 호환성을 위해서 이다.
그래서 런타임 때는 Object로 타입을 받아 기존 코드도 잘 돌아가게 하였으며, 마지막에 casting을 진행하여 원하는 타입으로 받아 볼 수 있게끔 하였다.
이게 타입 이레이저의 존재 이유이다.
다음 시간엔 컬렉션 프레임워크를 알아보자.
'기술스택 > 자바(Spring)' 카테고리의 다른 글
자바 연결 리스트 (Linked List feat.Node) (2) | 2025.03.02 |
---|---|
자바 배열과 배열 리스트(Array List) (1) | 2025.03.01 |
자바 제네릭 메서드 (Generic Method) (1) | 2025.02.22 |
자바 제네릭(Generic) (0) | 2025.02.22 |
자바 예외처리(Exception) (2) | 2025.02.20 |
- Total
- Today
- Yesterday
- 프로그래머스
- zixem
- los 15단계
- 백준 피보나치
- webhacking.kr
- extends
- 프로그래머스 상품을 구매한 회원 비율 구하기 파이썬
- 자바
- 김영한 실전 자바 기본
- los 15
- samron3
- 김영한
- 기술스택
- 백준 피보나치 수열
- 스프링
- 코딩테스트 준비
- 상속
- 코딩테스트
- 프로그래머스 상품을 구매한 회원 비율 구하기
- lord of sql
- java
- spring
- 백준
- 상품을 구매한 회원 비율 구하기 파이썬
- 김영한 실전 자바 기초
- samron
- 김영한 실전 자바 중급
- ys.k
- static
- Los
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |