본문 바로가기

Java/본격 Java 컬렉션

[Java] 제네릭(Generic) 심화

제네릭을 이용하여 매개변수를 받으면 기본적으로 Object클래스의 메소드만을 사용할 수 있으며, 

원래의 메소드를 사용하려면 형변환 후 사용해야합니다.

.

.

interface Simple{
	public void showYourName();
}

class UpperClass{
	public void showYourClass(){
		System.out.println("Upperclass");
	}
}

class Aa extends UpperClass implements Simple{
	public void showYourName(){
		System.out.println("ClassAa");
	}
}
class Bb extends UpperClass implements Simple{
	public void showYourName(){
		System.out.println("ClassBb");
	}
}

class BoundedParam{
	public static void main(String[] args){
		Aa a = new Aa();
		Bb b = new Bb();
		showInstClass(a);
		showInstName(a);
		showInstClass(b);
		showInstName(b);
	}
	public static <T> void showInstClass(T param){
		((Simple)param).showYourName();
		// 제네릭을 이용하여 매개변수를 받으면 기본적으로 Object클래스의 메소드만을 사용할 수 있으며, 
		// 원래의 메소드를 사용하려면 형변환 후 사용해야함
	}
	public static <T> void showInstName(T param){
		((UpperClass)param).showYourClass();
	}
}

.

.

이런 경우에 형변환하지 않고도 매개변수를 사용할 수 있습니다.

.

.

interface Simple{
	public void showYourName();
}

class UpperClass{
	public void showYourClass(){
		System.out.println("Upperclass");
	}
}

class Aa extends UpperClass implements Simple{
	public void showYourName(){
		System.out.println("ClassAa");
	}
}
class Bb extends UpperClass implements Simple{
	public void showYourName(){
		System.out.println("ClassBb");
	}
}

class BoundedParam2{
	public static void main(String[] args){
		Aa a = new Aa();
		Bb b = new Bb();
		showInstClass(a);
		showInstName(a);
		showInstClass(b);
		showInstName(b);
	}
	public static <T extends Simple> void showInstClass(T param){
		// 제네릭의 자료형 제한에서는 클래스와 인터페이스를 구분하지 않아서 두 경우 모두 extends를 사용함
		param.showYourName();
	}
	public static <T extends UpperClass> void showInstName(T param){
		// <T extends UpperClass> : 제네릭으로 자료형 지정시 반드시 Upperclass클래스를 상속받는 자료형으로 지정하라는 의미
		param.showYourClass();
		// 받아온 매개변수가 무조건 UpperClass의 하위클래스이므로 자동으로 UpperClass형으로 작업하는 것
	}
}

.

.

대신에 <>선언해줄 대 extends로 통해 형변환을 생략할 수 있다.

728x90
반응형

'Java > 본격 Java 컬렉션' 카테고리의 다른 글

[Java] LinkedList  (0) 2020.07.03
[Java] ArrayList  (0) 2020.07.03
[Java] 컬렉션 프레임워크(Collection Framework)  (0) 2020.07.03
[Java] 제네릭 메소드  (0) 2020.07.03
[Java] 제네릭 클래스 - 과일상자 실습  (0) 2020.07.03