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 은 자료형의 변수로써 사용자가 원하는 자료형으로 객체를 생성하고 메소드를 정의할 수 있다.
출처 : https://qkrrudtjr954.github.io/java/2017/11/22/generic.html
'Collection & Generic' 카테고리의 다른 글
Java Collection (0) | 2018.06.20 |
---|