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