일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Java
- 자료구조
- JavaScript
- 운영체제
- MySQL
- Heap
- C
- 자바
- Proxy
- design pattern
- 알고리즘
- Spring
- 디자인 패턴
- Galera Cluster
- redis
- Kafka
- react
- 컴퓨터구조
- 백준
- Data Structure
- 네트워크
- OS
- spring webflux
- MSA
- JPA
- 파이썬
- Algorithm
- IT
- mongoDB
- c언어
Archives
- Today
- Total
시냅스
[Java] Generic - 와일드 카드 Wildcard 본문
와일드카드(Wildcard) <?>
와일드 카드는 모든 타입을 대신할 수 있는 타입이다.
와일드 카드는 정해지지 않은 unknown type 이기 때문에 모든 타입에 대한 호출이 가능하다.
상한 경계 와일드 카드
<? extends T> - ? 는 앞으로 들어올 타입으로 T의 자손 객체 타입이어야 한다.
하한 경계 와일드 카드
<? super T> - ? 는 앞으로 들어올 타입으로 T이거나 조상 객체 타입이어야 한다.
getter 와 setter에서 상항/하한 경계 와일드 카드 사용으로 발생할 수 있는 문제를 아래 코드를 통해 알아본다.
예시 코드
class Box<T> {
protected T ob;
public T getOb() {
return ob;
}
public void setOb(T ob) {
this.ob = ob;
}
@Override
public String toString() {
return ob.toString();
}
}
class Toy {
@Override
public String toString() { return "I am a Toy"; }
}
class BoxHandler {
public static void outBox(Box<? extends Toy> box) {
// 박스가 참조하는 인스턴스를 대상으로 꺼내는 작업만 허용하겠다는 의미
// 아래에서 box.set은 컴파일 에러
// 매개변수로 toy 인스턴스를 저장할 수 있는 상자만 전달된다는 사실을 보장할 수 없기 때문에
// ? 가 toy보다 작은애라 set안됨
Toy t = box.getOb();
// box.set(); 컴파일 에러
System.out.println(t);
}
public static void inbox(Box<? super Toy> box, Toy n) {
// 박스가 참조하는 인스턴스 대상으로 넣는 작업만 허용하겠다는 의미
// get 메소드는 반환되는 값을 저장하기 위해 선언한 참조변수의 형을 Toy로 결정했다는 사실에서 문제가 발생
// super 면 반환 타입이 toy 이거나 Toy 이상이라 get 안됨
box.setOb(n);
// box.get(); 컴파일 에러
}
}
public class BoundedWildcardUsage2 {
public static void main(String[] args) {
Box<Toy> box = new Box<>();
BoxHandler.inbox(box, new Toy());
BoxHandler.outBox(box);
}
}
'Java, Spring' 카테고리의 다른 글
IOC와 DI, 컨테이너 (0) | 2022.07.25 |
---|---|
좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2022.07.15 |
[Java] 객체지향(OOP) 관련 용어 정리 (0) | 2022.07.15 |
[JAVA] Equals와 hashcode (0) | 2022.07.11 |
자바 가상 머신, JVM이란 (0) | 2022.07.11 |
Comments