Books
제네릭 사용 연습: 03. 제네릭 메소드
bright jazz music
2022. 11. 2. 22:27
아래 페이지를 참고하였다.
http://www.tcpschool.com/java/java_generic_various
제네릭 메소드(Generic method)
- 제네릭 메소드란 메소드의 선언부에 타입 변수를 사용한 메소드를 의미.
- 이 때 타입변수의 선언은 메소드 선언부에서 반환 타입 바로 앞에 위치
public static <T> void sort(...) { ... }
아래 예제에서 제네릭 클래스에서 정의된 타입변수 T와 제네릭 메소드에서 사용된 타입변수 T는 별개의 것임을 주의.
class AnimalList<T> {
...
public static <T> void sort(List<T> list, Comparator<? super T> comp){
...
}
}
//제네릭 클래스에서 정의된 타입변수 T와 제네릭 메소드에서 사용된 타입변수 T는 별개이다.
와일드카드(wild card)의 사용
- 와일드카드란 이름에 제한을 두지 않음을 표현하는 데 사용하는 기호를 의미
- 자바의 제네릭에서는 물음표 기호(?)를 사용하여 와일드카드 사용 가능
<?> // 타입변수에 모든 타입을 사용할 수 있다.
<? extends T> // T 타입과 T 타입을 상속하는 자손 클래스 타입만을 사용할 수 있다.
<? super T> // T 타입과 T 타입이 상속한 조상 클래스 타입만을 사용할 수 있다.
- 아래 예제는 클래스 메소드(static method)인 cryingAnimalList() 메소드의 매개변수의 타입을 와일드카드를 사용하여 제한한다.
- 오직 LandAnimal클래스 타입과 LandAnimal를 상속한 자식 클래스 타입만이 cryingAnimalList()의 파라미터가 될 수 있다.
package com.example.demospring.testFile;
import java.util.ArrayList;
//부모 클래스
class LandAnimal{public void crying(){System.out.println("## LandAnimal");}}
//LandAnimal을 상속하는 자식클래스
class Cat extends LandAnimal{public void crying(){System.out.println("## cat cat");}}
class Dog extends LandAnimal{public void crying() {System.out.println("## dog dog");}}
//LandAnimal을 상속하지 *않는* 클래스
class Sparrow{public void Crying(){System.out.println("## chup chup");}}
class AnimalList<T> {
ArrayList<T> animalList = new ArrayList<T>();
//클래스(정적) 메소드 cryingAnimalList()
//오직 LandAnimal클래스 타입과 LandAnimal를 상속한 자식 클래스 타입만이 cryingAnimalList()의 파라미터가 될 수 있다.
public static void cryingAnimalList(AnimalList<? extends LandAnimal> animalList){
//LandAnimal landAnimal = animalList.animalList.get(0); 이렇게 해도 되지만 get을 만들었다.
LandAnimal landAnimal = animalList.get(0);
landAnimal.crying();
}
void add(T animal){animalList.add(animal);}
T get(int index){return animalList.get(index);}
int size(){return animalList.size();}
}
public class TestGeneric03 {
public static void main(String[] args){
AnimalList<Cat> catList = new AnimalList<Cat>();
AnimalList<Dog> dogList = new AnimalList<Dog>();
AnimalList<Sparrow> sparrowList = new AnimalList<Sparrow>();
catList.add(new Cat());
dogList.add(new Dog());
sparrowList.add(new Sparrow());
AnimalList.cryingAnimalList(catList);
AnimalList.cryingAnimalList(dogList);
//AnimalList.cryingAnimalList(sparrowList); //오류발생: Sparrow클래스는 LandAnimal을 상속하지 않기 때문.
}
}
/*
## cat cat
## dog dog
*/