Language/JAVA

[JAVA] 제네릭 타입

IT수정 2024. 10. 16. 16:23

제네릭 타입

제네릭 타입은 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다. 제네릭 타입은 선언부에 '<>' 부호가 붙고 그 사이에 타입 파라미터들이 위치한다.

public class 클래스명<A, B, ...> { ... }
public interface 인터페이스명<A, B, ...> { ... }

 

타입 파라미터는 변수명과 동일한 규칙에 따라 작성할 수 있지만 일반적으로 대문자 알파벳 한 글자로 표현한다. 외부에서 제네릭 타입을 사용하려면 타입 파라미터에 구체적인 타입을 지정해야 한다. 만약 지정하지 않으면 암묵적으로 Object 타입이 사용된다.

 

다음 예제에서 Product 클래스를 제네릭 타입으로 선언해 보자. kind와 model 필드를 타입 파라미터로 선언하고, Getter의 매개변수와 Setter의 리턴 타입 역시 타입 파라미터로 선언한다. 왜냐하면 Product에 다양한 종류와 모델 제품을 저장하기 위해서이다.

package ch13;

public class Product<K, M> {
	private K kind;
	private M model;
	
	public K getKind() { return this.kind; }
	public M getModel() { return this.model; }
	public void setKind(K kind) { this.kind = kind; }
	public void setModel(M model) { this.model = model; }
}
package ch13;

public class Tv {

}
package ch13;

public class Car {

}
package ch13;

public class GenericExample2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// K는 Tv로 대체, M은 String으로 대체
		Product<Tv, String> product1 = new Product<>();
		
		product1.setKind(new Tv());
		product1.setModel("스마트Tv");
		
		Tv tv = product1.getKind();
		String tvModel = product1.getModel();
		
		Product<Car, String> product2 = new Product<>();
		
		product2.setKind(new Car());
		product2.setModel("SUV자동차");
		
		Car car = product2.getKind();
		String carModel = product2.getModel();
	}

}

 

이번에는 Rentable 인터페이스를 제네릭 타입으로 선언해 보자. 다양한 대상을 렌트하기 위해 rent() 메서드의 리턴 타입을 타입 파라미터로 선언한다.

package ch13;

public interface Rentable<P> {
	P rent();
}
package ch13;

public class Home {
	public void turnOnLight() {
		System.out.println("전등을 켭니다.");
	}
}
package ch13;

public class Car {
	public void run() {
		System.out.println("자동차가 달립니다.");
	}
}
package ch13;

public class HomeAgency implements Rentable<Home> {
	@Override
	public Home rent() {
		return new Home();
	}
}
package ch13;

public class CarAgency implements Rentable<Car>{
	@Override
	public Car rent() {
		return new Car();
	}
}
package ch13;

public class GenericExample3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		HomeAgency homeAgency = new HomeAgency();
		Home home = homeAgency.rent();
		home.turnOnLight();
		
		CarAgency carAgency = new CarAgency();
		Car car = carAgency.rent();
		car.run();
	}

}

 

출력 결과

전등을 켭니다.
자동차가 달립니다.

 

타입 파라미터는 기본적으로 Object 타입으로 간주되므로 Object가 가지고 있는 메서드를 호출할 수 있다. 다음 예제는 Box의 내용물을 비교하기 위해 타입 파라미터로 Object의 equals() 메서드를 호출한다.

package ch13.sec01;

public class Box<T> {
	public T content;
	
	public boolean compare(Box<T> other) {
		boolean result = content.equals(other.content);
		return result;
	}
}
package ch13.sec01;

public class GenericExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Box<String> box1 = new Box<>();
		box1.content = "100";
		
		Box<String> box2 = new Box<>();
		box2.content = "100";
		
		boolean result1 = box1.compare(box2);
		System.out.println("result1: " + result1);
	}

}

 

출력 결과

result1: true

'Language > JAVA' 카테고리의 다른 글

[JAVA] 타입 파라미터  (0) 2024.10.16
[JAVA] 제네릭 메서드  (0) 2024.10.16
[JAVA] 제네릭  (0) 2024.10.16
[JAVA] 어노테이션  (1) 2024.10.16
[JAVA] 리플렉션  (1) 2024.10.16