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로 결정하여 인스턴스를 생성한다.
  1. 타입매개변수 : Box에서 T
  2. 타입인자 : Box에서 Apple
  3. 매개변수화 타입 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