Java Generic

.Collection을 생성할때 마주하는 <>에 대한 궁금증을 해결하려고 한다.
제네릭이라고 불리며 간단하게 사용자가 변수의 자료형을 동적으로 지정할 수 있다. 객체의 자료형을 사용자가 정할 수 있다.

GenericExam

class CenericExam{
  //Object 클래스는 모든 클래스의 부모 클래스이다.
  Object obj;

  //Object 클래스를 인자로 받아 객체를 생성한다.
  public CenericExam(Object obj) {
    this.obj = obj;
  }

  //Object 객체를 리턴한다.
  public Object getObj() {
    return obj;
  }
}

Main.java

class Main{
  public static void main(String[] args) {
    // 부모의 클래스로 자식 클래스를 생성할 수 있는
    // 자바의 다형성 때문에
    // String 객체로 GenericExam 객체를 생성하고,
    // getObj 메소드를 호출할 수 있다.
    String str = new String("hello world");
    GenericExam g = new GenericExam(str);
    //return은 Object 이므로 형변환을 해주어야한다.
    String genericStr = (String)g.getObj();
    System.out.println(genericStr);


    // Integer 객체로 GenericExam 객체를 생성하고,
    // getObj 메소드를 호출할 수 있다.
    Integer i = new Integer(123);
    GenericExam g2 = new GenericExam(i);
    //return은 Object 이므로 형변환을 해주어야한다.
    Integer genericI = (Integer)g2.getObj();
    System.out.println(genericI);
  }
}
hello world
123

객체의 자료형(Integer, String)은 다르지만 하나의 객체(GenericExam)를 생성하고 메소드를 호출할 수 있다. 여기 Generic 의 개념이 숨어있다.


Generic의 사용

실제로 Generic을 사용하는 방법은 다음과 같다.

class CenericExam2<T>{
  T t;

  //Object 클래스를 인자로 받아 객체를 생성한다.
  public CenericExam(T t) {
    this.t = t;
  }

  //Object 객체를 리턴한다.
  public T getT() {
    return t;
  }
}

Main.java

class Main{
  public static void main(String[] args) {

    String str = new String("hello world");
    //String 객체를 변수로 GenericExam을 객체화한다.
    //이때 제네릭 변수는 String이다.
    //GenericExam 객체의 모든 T는 String으로 바뀌어 객체가 생성된다.
    GenericExam<String> g = new GenericExam2<String>(str);

    //return타입은 T이지만 우리가 생성한 객체는 T가 String 이기 때문에
    //캐스팅 해주지 않아도 된다.
    String genericStr = g.getObj();
    System.out.println(genericStr);



    Integer i = new Integer(123);
    //Integer 객체를 변수로 GenericExam을 객체화한다.
    //이때 제네릭 변수는 Integer.
    //GenericExam 객체의 모든 T는 Integer로 바뀌어 객체가 생성된다.
    GenericExam<Integer> g2 = new GenericExam2<Integer>(i);

    //return타입은 T이지만 우리가 생성한 객체는 T가 String 이기 때문에
    //캐스팅 해주지 않아도 된다.
    Integer genericI = g2.getObj();
    System.out.println(genericI);

    //"Yes! You Can" 을 직접 넣어줘도 String 객체로 생성되기 때문에 사용가능하다.
    GenericExam<String> g3 = new GenericExam2<String>("Yes! You Can!");
    String genericStr1 = g3.getObj();
    System.out.println(genericStr);

    //456을 직접 넣으면 Integer 객체로 자동 생성되어 GenericExam 객체를 생성한다.
    GenericExam<Integer> g4 = new GenericExam2<Integer>(456);
    Integer genericI1 = g4.getObj();
    System.out.println(genericI1);
  }
}
hello world
123
Yes! You Can
456


  • T는 Template의 약자이다.
  • T는 사용자 정의 자료형으로 사용할 때 정의 할 수 있다.
  • Generic 은 자료형을 저장하는 변수의 개념이다.
  • T를 Integer로 콜하면 클래스내 T를 전부 Integer로 바꾼다.
  • T는 정해진 이름은 아니므로 다른 문자로 바꿀수 있다.
  • Generic 변수는 반드시 클래스여야 한다. (Integer, Double, String 등)
    • 기본 자료형이 아닌 WrapperClass를 사용한 이유.



정리

Generic 은 자료형의 변수로써 사용자가 원하는 자료형으로 객체를 생성하고 메소드를 정의할 수 있다.

Comments