Java Generic - 활용 예제
Animal 클래스와 제네릭을 만들어보면서 알아보자
Animal 클래스 구조
Animal
+-------------+
| String name |
| int size |
| |
| sound() |
| toString() |
+------+------+
|
+---------+ | +---------+
| sound() +---+---+ sound() |
+---------+ +---------+
Dog Cat
Animal.class
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;
}
void sound() {
System.out.println("동물 울음 소리");
}
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", size=" + size +
'}';
}
}
- 이름(name), 크기(size) 정보를 가진 부모 클래스이다.
- toString() IDE 통해 오버라이딩한다.
Cat.class
public class Cat extends Animal {
public Cat(String name, int size) {
super(name, size);
}
@Override
void sound() {
System.out.println("냥");
}
}
Dog.class
public class Dog extends Animal {
public Dog(String name, int size) {
super(name, size);
}
@Override
void sound() {
System.out.println("멍");
}
}
기본 예제로 많이 사용하는 Animal, Dog, Cat 클래스를 각각 작성하였다.
다음으로 동물 타입을 모두 받을 수 있는 제네릭으로 작성해보도록 한다.
Box.class
public class Box<T> {
private T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
Main.class
public class Main {
public static void main(String[] args) {
Animal animal = new Animal("동물", 10);
Dog dog = new Dog("강아지", 20);
Cat cat = new Cat("고양이", 20);
Box<Dog> dogBox = new Box<>();
dogBox.set(dog);
Dog searchDog = dogBox.get();
System.out.println("search Dog = " + searchDog);
Box<Cat> catBox = new Box<>();
catBox.set(cat);
Cat searchCat = catBox.get();
System.out.println("search Cat = " + searchCat);
}
}
search Dog = Animal{name='강아지', size=20}
search Cat = Animal{name='고양이', size=20}
제네릭 클래스 하나로 종류별 동물이 모두 들어가 출력한 것을 볼 수 있다.
다형성 응용하기
Main 호출부를 수정해 상속의 다형성으로 이용해본다.
public class Main {
public static void main(String[] args) {
Animal animal = new Animal("동물", 10);
Dog dog = new Dog("강아지", 20);
Cat cat = new Cat("고양이", 20);
Box<Animal> box = new Box<>();
box.set(dog);
Animal polyDog = box.get();
System.out.println(polyDog);
}
}
Animal{name='강아지', size=20}
다운캐스팅을 명시적으로 주지 않아도 정상적으로 강아지 넣을 수 있다.