1-4. 제네릭 활용 예제

shin·2024년 6월 30일

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 + '}';
    }
    
 }
  • 이름, 크기 정보를 가지는 부모 클래스
  • toString()을 IDE를 통해서 오버라이딩함

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}


강의 출처 : 김영한의 실전 자바 - 중급 2편

profile
Backend development

0개의 댓글