와일드 카드에 대하여
- 와일드카드(?)는 제너릭 타입을 이용한 타입 안전환 코드를 위해 사용되는 특별한 종류의 인수(Argument)로서, 변수선언, 객체생성 및 메서드를 정의할 때 사용된다.
- <? extends T> => 와일드카드의 상한 제한. T와 그 자손들만 가능
- <? super T> => 와일드카드의 하한 제한. T와 그 조상들만 가능
- <?> => 모든 허용가능한 타입이 가능
Fruit 클래스 생성
class Fruit{
private String name;// 과일이름
public Fruit(String name) {
super(); //자신이 상속받은 부모의 생성자를 호출하는 메소드
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "과일 (이름 =" + name + ")";
}
}
Fruit 클래스의 Apple클래스 (자식클래스)생성
class Apple extends Fruit {
public Apple() {
super("사과");
}
}
Fruit 클래스의 Grape클래스 (자식클래스)생성
class Grape extends Fruit {
public Grape() {
super("포도");
}
}
FruitBox 클래스 생성
//제너릭클래스 근데 Fruit 클래스에 제약되어있음
class FruitBox<T extends Fruit> {
// 타입을 List타입 선언
private List<T> fruitList;
public FruitBox() {
//List 타입 객체 선언
fruitList = new ArrayList<>();
}
//출력문
public List<T> getFruitList() {
return fruitList;
}
//값 추가
public void add(T fruit) {
fruitList.add(fruit);
}
}
Juicer클래스 생성
class Juicer{
static void makeJuice(FruitBox<? extends Fruit> box) {
String fruitListStr = ""; // 과일목록
int cnt = 0;
for(Object f: box.getFruitList()) {
if(cnt ==0) {
fruitListStr += f;
}else {
fruitListStr += ", "+ f;
}
cnt++;
}
System.out.println(fruitListStr + "=> 쥬스완성!!");
}
}
원본
더보기
package kr.or.ddit.basic;
import java.util.ArrayList;
import java.util.List;
public class T05WildCardTest {
/*
* 와일드 카드에 대하여
* 와일드카드(?)는 제너릭 타입을 이용한 타입 안전환 코드를 위해 사용되는 특별한 종류의 인수(Argument)로서,
* 변수선언, 객체생성 및 메서드를 정의할 때 사용된다.
*
* <? extends T> => 와일드카드의 상한 제한. T와 그 자손들만 가능
* <? super T> => 와일드카드의 하한 제한. T와 그 조상들만 가능
* <?> => 모든 허용가능한 타입이 가능
*
*/
public static void main(String[] args) {
FruitBox<Fruit> fruitBox = new FruitBox<>(); // 과일상자
FruitBox<Apple> appleBox = new FruitBox<>();
fruitBox.add(new Apple());
fruitBox.add(new Grape());
appleBox.add(new Apple());
// appleBox.add(new Grape());//타입체크나서 에러가 나옴
Juicer.makeJuice(fruitBox);
// Juicer.makeJuice(appleBox);//에러 나옴 Fruit담고있는 타임만가능
//List 타입이 확정아 안된 상태
//? List 변수는 아직 확정 지어진것이 아님
// List<?> list = new ArrayList<String>();
}
}
class Juicer{
//<T>제너릭 지정해주면 appleBox 가능
//<T>제너릭 단점 : 원치 않은 타입도 들어갈수 있음 그래서 extends(제약)를 주어서 사용
// static<T extends Fruit> void makeJuice(FruitBox<T> box) {
//또는
//와일드카드(?) 사용할때 일반 메소드 extends(타입제약) 걸수 있음
static void makeJuice(FruitBox<? extends Fruit> box) {
String fruitListStr = ""; // 과일목록
int cnt = 0;
for(Object f: box.getFruitList()) {
if(cnt ==0) {
fruitListStr += f;
}else {
fruitListStr += ", "+ f;
}
cnt++;
}
System.out.println(fruitListStr + "=> 쥬스완성!!");
}
}
class Fruit{
private String name;// 과일이름
public Fruit(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "과일 (이름 =" + name + ")";
}
}
class Apple extends Fruit {
public Apple() {
super("사과");
}
}
class Grape extends Fruit {
public Grape() {
super("포도");
}
}
//과일상자 클래스
class FruitBox<T extends Fruit> {
private List<T> fruitList;
public FruitBox() {
fruitList = new ArrayList<>();
}
public List<T> getFruitList() {
return fruitList;
}
public void add(T fruit) {
fruitList.add(fruit);
}
}
'JAVA > 수업' 카테고리의 다른 글
T01FileTest File 객체 (0) | 2024.01.31 |
---|---|
T01Thread 싱글 스레드 프로그램 (0) | 2024.01.26 |
T04GenericMethod (2) | 2024.01.24 |
T03GenericMethod (1) | 2024.01.24 |
T02GenericClass (0) | 2024.01.24 |