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}

다운캐스팅을 명시적으로 주지 않아도 정상적으로 강아지 넣을 수 있다.