코딩하는 문과생
[Java] Generics 본문
- 제네릭 타입을 메소드에도 부여할 수 있다.
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 |