--> 어떤 객체를 만들때 타입이 정해져 있지않을때 여러 타입을 가질수 있도록 지정 할 수 있다.
Object 대신 제네릭을 쓰면 편하다. (다운캐스팅을 하지 않아도 되기 때문에)
class 호랑이 {
String name = "호랑이";
}
class 사자 {
String name = "사자";
}
class 큰바구니<T> {
T data;
}
public class GenericEx02 {
public static void main(String[] args) {
큰바구니<호랑이> s1 = new 큰바구니<>();
s1.data = new 호랑이();
System.out.println(s1.data.name); // 호랑이
큰바구니<사자> s2 = new 큰바구니<>();
s2.data = new 사자();
System.out.println(s2.data.name); // 사자
}
}
이때 <?> 는 <? extends Object> 의미와 같다.
또한 <> 내부에는 기본자료형(값)은 들어갈 수 없고 레퍼런스자료형(주소)만 들어갈 수 있다.
abstract class 공 {
abstract String getName();
}
class 농구공 extends 공{
private String name = "농구공";
public String getName() { // 자식이 부모의 메서드와 동일한것을 같고있으면
return name; // 부모의 메서드가 오버라이드(무효화) 된다.
}
public void setName(String name) {
this.name = name;
}
}
class 축구공 extends 공{
private String name = "축구공";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class 가방<T> {
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
public class GenericEx03 {
static 가방<? extends 공> 꺼내기(int time) {
if(time==9) {
축구공 s1 = new 축구공();
가방<축구공> g2 = new 가방<>();
g2.setData(s1);
return g2;
}else {
농구공 b1 = new 농구공();
가방<농구공> g1 = new 가방<>();
g1.setData(b1);
return g1;
}
}
// 다형성, Object, 추상클래스, 오버라이드(무효화), 동적바인딩 개념 이해 필요
public static void main(String[] args) {
가방<? extends 공> r1 = 꺼내기(9);
가방<? extends 공> r2 = 꺼내기(12);
System.out.println(r1.getData().getName()); // 축구공
System.out.println(r2.getData().getName()); // 농구공
}
}
출처
- 이지업 컨텐츠 내의 데어프로그래밍 자바강의