데이터 형식에 의존하지 않고,
하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법
<> 괄호 안에 들어가는 타입을 지정해준다.
객체<타입> 객체명 = new 객체<타입>(); 이렇게 쓰지 않는가? 즉, 아래와 같이 여러 생성방식이 있다.
사용 이유 : 만약에 우리가 어떤 자료구조를 만들어 배포하려고 한다. 그런데 String 타입도 지원하고싶고 Integer타입도 지원하고 싶고 많은 타입을 지원하고 싶다. 그러면 String에 대한 클래스, Integer에 대한 클래스 등 하나하나 타입에 따라 만들 것인가? 그건 너무 비효율적이다. 이러한 문제를 해결하기 위해 우리는 제네릭이라는 것을 사용한다.
이렇듯 제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다. 한마디로 특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것이다.
(정확히 말하자면 지정된다는 것 보다는 타입의 경계를 지정하고, 컴파일 때 해당 타입으로 캐스팅하여 매개변수화 된 유형을 삭제하는 것이다.
[ 장점 ]
제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.
비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
↑ 글 펌) https://st-lab.tistory.com/153
public static void main(String[] args) {
// String(문자열)을 저장하는 박스.
Box<String> box1 = new Box<String>();
box1.setItem("Hello world");
System.out.println(box1.getItem());
// int(정수)를 저장하는 box2
// 오직 "참조타입"만 Generic 처리에서 사용할 수 있다.
// int의 참조타입인 Integer를 사용한다.
Box<Integer> box2 = new Box<Integer>();
box2.setItem(10);
System.out.println(box2.getItem());
// Wrapper Class (기본형의 참조타입)
// Boolean, Byte, Character, Integer, Long, Double
// Person을 저장하는 box3
Box<Person> box3 = new Box<Person>();
box3.setItem(new Person("홍길동"));
System.out.println(box3.getItem());
}
public class Box<T> {
private T item;
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}