Generic 매개 변수 제한

야부엉·2024년 12월 3일
post-thumbnail

1. 기본 Generic의 한계

  • Generic 타입을 학습하고 나면, 아래 코드도 가능 할거라고 생각 할 수 있다.
public class Temp<T> {

	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 bigger(T target) {
		// 컴파일 에러 
        return animal.getSize() > target.getSize() ? animal : target;
	}
}
  • Animal이라는 타입이 들어와서 그 타입의 메서드를 사용할 수 있을거라고 생각하고 작성했지만, 자바 컴파일러는 정보가 없기 때문에 최상위 타입인 object로 가정을 하고 object 클래스 관련 메서드만 사용할 수 있다. 뿐만 아니라, 전혀 관계 Object로 인식하기 때문에 전혀 관계가 없는 타입들도 인자로 전달 할 수 있다는 문제가 있다.
  • 즉, 최소한의 타입 인자 클래스를 정의해야만 우리가 생각했던 방식으로 작동한다.

2. Generic의 매개변수 제한

  • 위와 같은 문제를 해결하기 위해, 아래와 같이 타입 매개 변수를 특정 타입으로 제한 할 수 있다.

public class Temp2<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();
	}

}
  • <T extends Animal> 형태로 작성하며, Animal을 포함하여, 그 자식 클래스들까지로 범위를 제한한다는 의미이다. -> 타입 매개변수 상한이라고 부른다.
  • 타입 매개변수 상한을 사용하면, Animal 클래스를 최대 클래스로 생각하여, Animal 클래스에 있는 기능들을 사용할 수 있게 된다.

출처

김영한의 실전 자바 - 중급 2편

profile
밤낮없는개발자

0개의 댓글