제네릭은 대충 알고 써왔었는데, 새로 배운 내용 위주로 정리해보고자 한다.

자바가 스스로 타입 정보를 추론해서 개발자가 타입 정보를 생략할 수 있는 것을 타입 추론이라고 한다.

GenericBox<Integer> integerBox = new GenericBox<Integer>() // 타입 직접 입력
GenericBox<Integer> integerBox2 = new GenericBox<>() // 타입 추론

Spring Data JPA의 extends JpaRepository<Member, Long> 이런것도 다 제네릭 이었구나…!

아래는 제네릭의 타입 매개변수 제한이다! <T> 로 모든 타입이 올 수 있겠지만,, Object가 올 수도 있고 원하지 않는 타입이 올수도 있다! 타입의 제한을 두어, 체크예외인 컴파일오류로 실수를 방지하자!

public class AnimalHospitalV3<T extends Animal> {
	
	private T animal;
	
	public void set(T animal) {
		this.animal = animal;
	}
	
	public void checkup() {
		System.out.println("동물 이름: " + animal.getName());
		System.out.println("동물 크기: " + animal.getSize());
		animal.sound();
	}
	
	public T getBigger(T target) {
		return animal.getSize() > target.getSize() ? animal : target;
	}
}

아래와 같이 매서드에도 제네릭별로 다르게 하여 오버로딩 할 수 있다! 제네릭 매서드 타입추론도 가능하여 굳이 지정해서 넘기는 것이 아니라 매개변수에 따른 타입추론으로 알맞는 매서드를 찾아 실행한다 다양한 타입이 들어올 확률이 있을 때 유용하겠네!

public class GenericMethod {

	public static Object objMethod(Object obj) {
		System.out.println("object print: " + obj);
		return obj;
	}
	
	public static <T> T genericMethod(T t) {
		System.out.println("generic print: " + t);
		return t;
	}
	
	public static <T extends Number> T numberMethod(T t) {
		System.out.println("bound print: " + t);
		return t;
	}
}

public class MethodMain1 {

	public static void main(String[] args) {
			Integer i = 10;
			Object object = GenericMethod.objMethod(i);
			
			// 타입 인자(Type Argument) 명시적 전달
			System.out.println("명시적 타입 인자 전달");
			Integer result = GenericMethod.<Integer>genericMethod(i);
			Integer integerValue = GenericMethod.<Integer>numberMethod(10);
			Double doubleValue = GenericMethod.<Double>numberMethod(20.0);
			
			//타입 추론, 타입 인자 생략
			System.out.println("타입 추론");
			Integer result2 = GenericMethod.genericMethod(i);
			Integer integerValue2 = GenericMethod.numberMethod(10);
			Double doubleValue2 = GenericMethod.numberMethod(20.0);
		}
}

// 실행결과
object print: 10
명시적 타입 인자 전달
generic print: 10
bound print: 10
bound print: 20.0

//추가한 내용만 출력
타입 추론
generic print: 10
bound print: 10
bound print: 20.0

다음은 제네릭 타입을 좀 더 편리하게 사용할 수 있는 와일드카드(wildcard)에 대해서 알아보려고 한다.

와일드 카드는 컴퓨터프로그래밍에서 *나 #같은 하나 이상의 문자들을 상징하는 특수문자를 뜻한다. 쉽게 말해서 여러 타입이 들어올 수 있음을 뜻한다.