2018-4-01 TIL 자바의 제네릭에 관해서
제너릭
- 제너릭이 갖는 의미는 ‘일반화’이다.
package yoon;
class Apple {
public String toString() {
return "I am an apple.";
}
}
class Orange {
@Override
public String toString() {
return "I am an orange";
}
}
class Box2 {
private Object ob;
public void set(Object o) {
ob = o;
}
public Object get() {
return ob;
}
}
public class FruitAndBox {
public static void main(String [] args) {
Box2 aBox = new Box2(); //상자생성
Box2 bBox = new Box2(); //상자생성
aBox.set(new Apple()); // 상자에 사과를 담는다
bBox.set(new Orange());
Apple ap = (Apple)aBox.get(); // 상자에서 사과를 꺼낸다
Orange og = (Orange)bBox.get();
System.out.println(ap);
System.out.println(og);
}
}
//result
I am an apple.
I am an orange.
- Box 내에서 인스턴스를 저장하는 참조변수가 Object형이기때문에, 꺼낼때는 형변환을 해야한다.
- 하지만 제네릭을 사용을 하면 위와같은 문제를 해결을 할 수가 있다.
class Box {
private Object ob;
public void set(Object o) {
ob = o;
}
public Object get() {
return ob;
}
}
- 위의 클래스는 Object형 인스턴스를 저장하고 반환을 한다.
class Box {
private T ob;
public void set(T o) {
ob = o;
}
public T get() {
return ob;
}
}
- 위의 경우는 인스턴스를 생성을 할 때, T를 결정하면된다.
인스턴스를 생성 시 T의 자료형을 결정하는 것이 ‘제네릭’이다.
class Box<T> {
private T ob;
public void set(T o) {
ob = o;
}
}
- Box
aBox = new Box (); - T를 Apple로 결정하여 인스턴스를 생성한다.
- 타입매개변수 : Box
에서 T - 타입인자 : Box
에서 Apple - 매개변수화 타입 Box
package yoon;
class Apple {
public String toString() {
return "I am an apple.";
}
}
class Orange {
@Override
public String toString() {
return "I am an orange";
}
}
class Box2<T> {
private T ob;
public void set(T o) {
ob = o;
}
public T get() {
return ob;
}
}
public class FruitAndBox {
public static void main(String [] args) {
Box2<Apple> aBox = new Box2<Apple>(); // T를 Apple로 결정
Box2<Orange> bBox = new Box2<Orange>();
aBox.set(new Apple()); // 상자에 사과를 담는다
bBox.set(new Orange());
Apple ap = aBox.get(); // 상자에서 사과를 꺼낸다
Orange og = bBox.get();
System.out.println(ap);
System.out.println(og);
}
}
//result
I am an apple.
I am an orange.
Written on April 1, 2018