관리 메뉴

bright jazz music

제네릭 사용 연습: 03. 제네릭 메소드 본문

JAVA

제네릭 사용 연습: 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
 */

 

 

 

 

Comments