JAVA 입문 시작
22.12.02(불금) 제네릭 / <? super Object> <? extend Object>
강준석
2022. 12. 2. 15:01
728x90
<?> : 모든 자료형 가능 ,자료형:(int,str등등)
<? super Object> : Object의 부모클래스 자료형을 참조 가능
<? extend Object> : Object의 자식클래스 자료형을 참조 가능
package 제네릭;
//부모클래
public class Gen1 {
String name = "Gen1";
String getName() {
return name;
}
}
package 제네릭;
//자식클래스
public class Gen2 extends Gen1{
String name = "Gen2";
String getName() {
return name;
}
}
package 제네릭;
//손주클래스
public class Gen3 extends Gen2 {
String name = "Gen3";
String getName() {
return name;
}
}
package 제네릭;
public class Gen4<T> {
//T = Gen1 메인클래스에서 선언
T obj; //Gen1=g3
//obj=g3
//하지만g3은 손주클래스니 그 위 조부모,부모클래스(Gen1,Gen2)로도 인식가능
Gen4(T obj){
//obj = g3,Gen1 메인클래스에서 선언
this.obj = obj; //obj = g3
}
void set(T obj) {
this.obj=obj;
}
T get() {
return obj;
}
}
package 제네릭;
public class Main {
public static void main(String[] args) {
Gen3 g3 = new Gen3();
Gen4<? super Gen2/*자식*/> g2 = new Gen4<Gen1/*부모*/>(g3);
// Gen4클래스에 생성자를 만들었기때문에 ()안에 값을 넣어줘야함
// <? super Object> : Object의 부모클래스 자료형을 참조 가능
// 이기때문에 뒤에<>에 앞에 선언된 Gen2의 부모클래스(Gen1)를 입력
// Gen2 t1 = g2.get();
System.out.println(g2.obj);
Gen4<? extends Gen2/* 자식 */> g4 = new Gen4<Gen3/*부모*/>(g3);
//<? extend Object> : Object의 자식클래스 자료형을 참조 가능
g2.obj = g3;
System.out.println(g4.obj);
}
}
육지동물 울음소리로 예시 만듬 ㅋ 티모도 나옴 ㅋ
package 제네릭2;
//자식클래스
public class Dog extends LandAnimal{
void crying() {
System.out.println("멍멍");
}
}
package 제네릭2;
//상속받은거 없음
public class Sparrow{
void crying() {
System.out.println("짹쨱");
}
}
package 제네릭2;
public class Teemo extends LandAnimal{
void crying() {
System.out.println("헛 둘 셋 넷~ 크기가 전부는 아니잖아요~");
}
}
package 제네릭2;
//부모클래스
public class LandAnimal {
void crying() {
System.out.println("육지동물");
}
}
package 제네릭2;
//
import java.util.ArrayList;
public class AnimalList<T> {
ArrayList<T> al = new ArrayList<T>();
// T=Dog, al에 Dog르 저장
//자식클래스만 사용가능(Dog)
public static void cryingAnimalList(AnimalList<? extends LandAnimal> al) {
LandAnimal la = al.get(0);
//al의0번방을 가져옴,la은 al안의 LandAnimal관련 상속클래스만 가져올 수 있음
//자료형(LandAnimal),변수(la)
la.crying();
//la에 관련된 클래스의 crying 메서드 호출
}
void add(T animal) {
//T=dog Main문에서 받음 위 ArrayList<T>에 Dog보냄
al.add(animal);
}
T get(int index) {
return al.get(index);
}
}
package 제네릭2;
public class Main {
public static void main(String[] args) {
AnimalList<Dog> dogList = new AnimalList<>();
//AnimalList클래스에 T에 Dog를 보냄
//AnimalList에 관련된 객체생성(dog에 관련된)
dogList.add(new Dog());
AnimalList<Sparrow> SparrowList = new AnimalList<>();
//AnimalList에 관련된 객체생성
SparrowList.add(new Sparrow());
AnimalList<Teemo> TeemoList = new AnimalList<>();
TeemoList.add(new Teemo());
AnimalList.cryingAnimalList(dogList);
AnimalList.cryingAnimalList(TeemoList);
// AnimalList.cryingAnimalList(sparrowList);
}
}
결과
멍멍
헛 둘 셋 넷~ 크기가 전부는 아니잖아요~
728x90