코딩하는 문과생

[Java] Generics 본문

프로그래밍/Java

[Java] Generics

코딩하는 문과생 2020. 1. 18. 14:09

- 제네릭 타입을 메소드에도 부여할 수 있다.

class Box<T> {
	private T ob;
	
	public Box() {
	}

	public T getOb() {
		return ob;
	}

	public void setOb(T ob) {
		this.ob = ob;
	}
	
}
class Unboxer {
	public static <T> T openBox(Box<T> box) {
		return box.getOb();
	}
}
public class GenericMain {

	public static void main(String[] args) {
		Box<String> box = new Box<>();
		box.setOb("ssss");
		
		String str = Unboxer.openBox(box);
		System.out.println(str);
	}

}

 

- 제네릭 타입 간 상속이 허용된다.

class Box<T> {
	protected T ob;
	
	public Box() {
	}

	public T getOb() {
		return ob;
	}

	public void setOb(T ob) {
		this.ob = ob;
	}
	
}
class SteelBox<T> extends Box<T> {

	public SteelBox(T o) {
		ob = o;
	}
	
}
public class GenericMain {

	public static void main(String[] args) {
		Box<Integer> iBox = new SteelBox<>(7979);
		Box<String> sBox = new SteelBox<>("ssss");
		
		System.out.println(iBox.getOb());
		System.out.println(sBox.getOb());
		
	}

}

 

-와일드카드의 활용

class Box<T> {
	private T ob;
	
	public Box() {
	}

	public T getOb() {
		return ob;
	}

	public void setOb(T ob) {
		this.ob = ob;
	}
	
}
class Toy {
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "I'm a Toy";
	}
}
class BoxHandler {
	public static void outBox(Box<? extends Toy> box) {
		// 상자에 넣는 것만 허용하겠다.
		Toy t = box.getOb();
		System.out.println(t);

	}
	public static void inBox(Box<? super Toy> box, Toy n) {
		// 상자에서 빼는 것만 허용하겠다.
		box.setOb(n);

	}
}
public class GenericMain {

	public static void main(String[] args) {
		Box<Toy> box = new Box<>();
		BoxHandler.inBox(box, new Toy());
		BoxHandler.outBox(box);
		
	}

}

 

- <? extends T>, <? super T>

: T는 박스에 담을 수 있는 객체 타입을 제한한다.

그리고 extends와 super를 이용해 컴파일될 때 메소드의 활용범위를 제한시킨다.

class Box<T> {
	private T ob;
	
	public Box() {
	}

	public T getOb() {
		return ob;
	}

	public void setOb(T ob) {
		this.ob = ob;
	}
	
}
class Toy {
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "I'm a Toy";
	}
}
class Robot {
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "I'm a Robot";
	}
}
class BoxHandler {
	public static <T> void outBox(Box<? extends T> box) {
		// 상자에 넣는 것만 허용하겠다.
		T t = box.getOb();
		System.out.println(t);

	}
	public static <T> void inBox(Box<? super T> box, T n) {
		// 상자에서 빼는 것만 허용하겠다.
		box.setOb(n);

	}
}
public class GenericMain {

	public static void main(String[] args) {
		Box<Toy> tbox = new Box<>();
		BoxHandler.inBox(tbox, new Toy());
		BoxHandler.outBox(tbox);
		
		Box<Robot> rbox = new Box<>();
		BoxHandler.inBox(rbox, new Robot());
		BoxHandler.outBox(rbox);
	}

}

 

-제네릭 인터페이스

interface Getable<T> {
	public T get();
}
class Box<T> implements Getable<String>{
	private T ob;
	
	public void setOb(T ob) {
		this.ob = ob;
	}
	@Override
	public String get() {
		return ob.toString();
	}
}
class Toy {
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "I'm a Toy";
	}
}
class GenericMain {

	public static void main(String[] args) {
		Box<Toy> box = new Box<>();
		box.setOb(new Toy());
		
		//Getable<string>형 참조변수는 Box<T> 인스턴스의 T에 상관없이 Box<T>인스턴스를 참조할 수 있다.
		Getable<String> gt = box;
		System.out.println(gt.get());
	}

}

'프로그래밍 > Java' 카테고리의 다른 글

[Java] Enum 클래스  (2) 2021.04.04
[Java] 변수와 자료형  (0) 2020.01.05