class를 설계할 때 멤버의 자료형을 정하지 않고 객체를 생성(new)할 때 결정하도록 하는 문법
객체를 생성할 때 <>제네릭 문법으로 자료형을 지정
class의 타입을 지정하지 않고 설계해서 코드를 재사용 할 수 있다는 장점이 있다
🧨 주의사항
<> 안에는 참조형 자료형만 올 수 있다
즉, 기본형 자료형(8가지)은 올 수 없다 기본형을 객체형으로 감싸기 위해 존재하는 Wrapper Class를 사용해야됨
Boolean, Byte, Character, Short, Integer, Long, Float, Double
🔨 제네릭 클래스 선언
class 클래스명<타입인자> {
}
🔨 제네릭 클래스의 객체(인스턴스)생성
new 클래스명<타입인자>();
//이 Box클래스를 객체로 생성 할 때 <>안에 작성한 자료형으로 설계도가 완성됨
public class Box<T> { //<T>는 인스턴스 생성 시 전달되는 타입 : 타입인자
//멤버 변수의 자료형을 아직 정하지 않고 설계
T a; //자료형 바이트 예측 불가
//멤버변수의 값을 대입해주는 기능 메소드 - setter
public T getA() {
return a;
}
public void setA(T a) {
this.a = a;
}
}
import java.util.Random;
public class Main {
public static void main(String[] args) {
//Box box;
//Box is a raw type. References to generic type Box<T> should be parameterized
//제네릭 클래스의 타입지정이 없으면 경고
Box<String> box = new Box<>();
box.a = "Hello";
System.out.println(box.a);
Box<Random> box2 = new Box<>();
box2.a = new Random();
System.out.println(box2.a.nextInt(10));
//제네릭의 문법적 제약사항 - 참조형 자료형만 <>안에 지정할 수 있음
Box<int> box3 = new Box<>(); //error - 기본형 자료형 int는 <> 안에 사용할 수 없음
//int형 같은 기본형을 사용하고 싶다면, Wrapper Class를 대체사용
//Wrapper Class : Boolean, Byte, Character, Short, Integer, Long, Float, Double
int a=10; //기본형
Integer b = new Integer(10); //참조형
Integer c = 30; //자동 new Integer(30) : auto boxing
int d = c; //자동 Integer를 int로 변환 : auto unboxing
//Wrapper Class의 참조변수를 마치 기본형 변수 자료형처럼 사용해도 알아서 변환됨
//기본형 자료형을 제네릭에 사용하려면 Wrapper Class를 지정해주면 됨
Box<Integer> box4 = new Box<>();
box4.a = 50;
System.out.println(box4.a);
Box<Double> box5 = new Box<>();
//만약 Box를 생성하면서 <>을 명시하지 않으면?
Box box6 = new Box();
box6.a; //자료형이 지정되지않으면 기본 Object 자료형으로 만들어짐
//2개 이상의 제네릭 타입을 가지는 클래스 객체로 생성
Box2<String, Integer> obj = new Box2<>();
obj.a = "aaa";
obj.b = 13;
}
}