일반적인
- 타입을 구체적으로 지정하지 말고 나중에 지정할 수 있도록 일반화 – Generic
- 특정 데이터 형식에 바인딩되지 않은 클래스 또는 메서드입니다.
제네릭 클래스
class Basket <T>{ // 제네릭 클래스, T라는 타입 매겨변수 선언, 임의의 문자로 지정가능 T,K,V (Type, Key, Value) 등 사용
private T item;
// static T item; // 클래스 변수에는 사용 불가 - 클래스 변수의 타입이 인스턴스 별로 달라 지게 된다.
// 클래스 변수는 공통적으로 사용해야 하는데 인스턴스별로 타입을 다르게 생성하면 같은 타입이 아니게 된다.
public Basket(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
// 제네릭 클래스 인스턴스화
Basket<String> basket1 = new Basket<String>("Ipad"); // String으로 생성
Basket<Integer> basket2 = new Basket<Integer>(340); // Interger로 생성
// 타입 매개변수에 치환될 타입으로 기본 타입 사용 불가
// int -> Integer, double -> Double (래퍼클래스 사용)
// getter
System.out.println(basket1.getItem()); // Ipad
System.out.println(basket2.getItem()); // 340
// setter
basket1.setItem("Galaxy Tab");
System.out.println(basket1.getItem()); // Galaxy Tab
/*
Ipad
340
Galaxy Tab
*/
제한된 제네릭
- extend로 지정된 클래스의 하위 클래스만 인스턴스화할 수 있습니다.
- 인터페이스도 가능합니다.
즉, 인터페이스를 구현하는 클래스의 인스턴스만 가능합니다. - 다형성을 적용할 수 있으며 하위 클래스의 객체 유형을 사용할 수 있습니다.
class LimitBasket <T extends Phone>{ // 제한된 제네릭, 인스턴스화 할때 Phone의 하위 클래스만 지정 가능
// 인터페이스도 가능 구현한 클래스만 사용가능
// 특정클래스를 상속받으면서 인터페이스를 구현한 클래스 타입도 지정 가능
// <T extend 부모클래스명 & 인터페이스명>
private T item;
public LimitBasket(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
class Phone{ }
class Iphone extends Phone{}
class Ipad{}
Basket<Phone> phoneBasket = new Basket<>(new Iphone());
phoneBasket.setItem(new Iphone()); // Phone의 자식 클래스 이므로 다형성 가능
// phoneBasket.setItem(new Galaxy()); // Phone과 아무사이도 아니기 때문에 에러
// 제한된 클래스 사용
LimitBasket<Phone> phoneLimitBasket = new LimitBasket<>(new Phone()); // Phone 자신
LimitBasket<Iphone> iphoneLimitBasket = new LimitBasket<>(new Iphone()); // Phone의 자식클래스
//LimitBasket<Galaxy> galaxyLimitBasket = new LimitBasket<new Galaxy>(); // 에러 Phone의 자식클래스가 아님
제네릭 메서드
- 메서드 유형이 지정되지 않음
- 제네릭 클래스와 제네릭 메서드의 다양한 매개변수
- 제네릭 메서드는 정적일 수 있습니다.
class GenericMethod<T>{ // 1. 제네릭 클래스의 타입 매개변수
private T result;
public GenericMethod(T result) {
this.result = result;
}
public T getNum() {
return result;
}
public void setNum(T result) {
this.result = result;
}
public <T> void print(T element){ // 2. 제네릭 메소드의 타입 매겨변수, 1과 2는 서로 다르다.
System.out.println(element);
//System.out.println(element.length()); // 타입이 지정안됬기 때문에 특정클래스 메서드 사용 불가
}
public static <T> void print2(T elemnet){ // 제네릭 메서드는 static 사용가능
System.out.println("static 메서드");
}
}
GenericMethod<String> genericMethod = new GenericMethod<>("test");
genericMethod.<Integer>print(123); // 제네릭 메서드
genericMethod.print(1234); // 타입 지정 생략 가능
/*
123
1234
*/
** 래퍼 클래스
- 개체의 8가지 기본 유형을 준수하는 데이터를 래핑하는 클래스의 래퍼 클래스입니다.
기본 래퍼 | 래퍼 클래스 |
바이트 | 바이트 |
짧은 | 짧은 |
내부 | 정수 |
긴 | 긴 |
호버링 | 호버 |
더블 | 더블 |
숯 | 성격 |
부울 | 부울 |