
package generic.animal;
public class Animal {
private String name;
private int size;
public Animal(String name, int size) {
this.name = name;
this.size = size;
}
public String getName() {
return name;
}
public int getSize() {
return size;
}
public void sound() {
System.out.println("동물 울음 소리");
}
@Override
public String toString() {
return "Animal{" + "name='" + name + '\'' + ", size=" + size + '}';
}
}
package generic.animal;
public class Dog extends Animal {
public Dog(String name, int size) {
super(name, size);
}
@Override
public void sound() {
System.out.println("멍멍");
}
}
Animal을 상속 받음super(name, size)를 호출package generic.animal;
public class Cat extends Animal {
public Cat(String name, int size) {
super(name, size);
}
@Override
public void sound() {
System.out.println("냐옹");
}
}
Animal을 상속 받는 클래스 하나 더 생성package generic.ex2;
public class Box<T> {
private T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
package generic.ex2;
import generic.animal.Animal;
import generic.animal.Cat;
import generic.animal.Dog;
public class AnimalMain1 {
public static void main(String[] args) {
Animal animal = new Animal("동물", 0);
Dog dog = new Dog("멍멍이", 100);
Cat cat = new Cat("냐옹이", 50);
Box<Dog> dogBox = new Box<>();
dogBox.set(dog);
Dog findDog = dogBox.get();
System.out.println("findDog = " + findDog);
Box<Cat> catBox = new Box<>();
catBox.set(cat);
Cat findCat = catBox.get();
System.out.println("findCat = " + findCat);
Box<Animal> animalBox = new Box<>();
animalBox.set(animal);
Animal findAnimal = animalBox.get();
System.out.println("findAnimal = " + findAnimal);
}
}
실행결과
findDog = Animal{name='멍멍이', size=100}
findCat = Animal{name='냐옹이', size=50}
findAnimal = Animal{name='동물', size=0}
Box 제네릭 클래스에 각각의 타입에 맞는 동물을 보관하고 꺼냄Box<Dog> dogBox : Dog 타입을 보관할 수 있음Box<Cat> catBox : Cat 타입을 보관할 수 있음Box<Animal> animalBox : Animal 타입을 보관할 수 있음Box<Animal>의 경우 타입 매개변수 T에 타입 인자 Animal을 대입하면 아래 코드와 같음public class Box<Animal> {
private Animal value;
public void set(Animal value) {
this.value = value;
}
public Animal get() {
return value;
}
}
set(Animal value)이므로 set()에 Animal의 하위 타입인 Dog, Cat도 전달할 수 있음Animal 타입으로만 꺼낼 수 있음package generic.ex2;
import generic.animal.Animal;
import generic.animal.Cat;
import generic.animal.Dog;
public class AnimalMain2 {
public static void main(String[] args) {
Animal animal = new Animal("동물", 0);
Dog dog = new Dog("멍멍이", 100);
Cat cat = new Cat("냐옹이", 50);
Box<Animal> animalBox = new Box<>();
animalBox.set(animal);
animalBox.set(dog); // Animal = Dog
animalBox.set(cat); // Animal = Cat
Animal findAnimal = animalBox.get();
System.out.println("findAnimal = " + findAnimal);
}
}
실행 결과
findAnimal = Animal{name='냐옹이', size=50}