본문 바로가기

JH

Class<T> 를 이용한 Class 탐색

본 포스팅에서는 동물 그룹을 만들고, 특정 동물 

 

여러 동물 중, 특정 동물을 찾고 행동을 출력하는 예제를 작성한다.

 

AnimalBehavior.java

public interface AnimalBehavior {
	void eat();
	void bark(String sound);
	void play();
}

 

AbstractAnimal.java

public abstract class AbstractAnimal<T extends AnimalBehavior> implements AnimalBehavior{
	
	private String howling;
	
	public AbstractAnimal(String howling) {
		this.howling = howling;
	}
	
	public final void doAction () {
		bark(howling);
		eat();
		play();
	}
	
	@Override
	public abstract void eat();
	
	@Override
	public void bark(String sound) {
		System.out.println(sound);
	}
	
	@Override
	public abstract void play();

}

 

Cat.java

public class Cat extends AbstractAnimal<Cat>{

	public Cat(String howling) {
		super(howling);
	}

	@Override
	public void eat() {
		System.out.println("고양이 사료를 먹는다.");
	}

	@Override
	public void play() {
		System.out.println("혼자 뒹굴거린다.");
	}

}

 

Dog.java

public class Dog extends AbstractAnimal<Dog>{

	public Dog(String howling) {
		super(howling);
	}

	@Override
	public void eat() {
		System.out.println("강아지 사료를 먹는다.");
	}

	@Override
	public void play() {
		System.out.println("공놀이를 한다.");
	}

}

 

AnimalMain.java

public class AnimalMain {
	
	public static List<AnimalBehavior> animal = new ArrayList<>();
	
	public static void main(String args[]) {
		
		setup();
		
		//강아지를 찾는다.
		List<Dog> dogs = searchAnimal(Dog.class);
		System.out.println(dogs.size());
		
		for(Dog dog : dogs) {
			dog.doAction();
		}
	}
	
	public static void setup () {
		animal.add(new Cat("냐옹"));
		animal.add(new Cat("냐옹냐옹"));
		animal.add(new Cat("냐옹냐옹냐옹"));
		animal.add(new Dog("멍"));
		animal.add(new Dog("멍멍"));
		animal.add(new Dog("멍멍멍"));
	}
	
	public static <T> List<T> searchAnimal (Class<T> type){
		return animal.stream()
				.filter(type::isInstance)
				.map(type::cast)
				.collect(Collectors.toList());
	}

}