JAVA/정리한 것

[ JAVA ] 제너릭( Generic )

따갓 2022. 5. 16. 01:20

제너릭( Generic )

 

class Bank{
	Object t = null;
}
class Bank2 {
	String t = null;
}
public class Main{
	public static void main(String[] args){
		Bank b = new Bank();
		b.t = "HelloWorld";
		// String b2 = b.t  ; << 에러
		String b2 = (String)b.t;
		
		Bank2 c = new Bank2();
		c.t = "HelloWorld";
		String c2 = c.t;
	}		
}

Bank는 어떤 인스턴스이든 멤버변수로 가리킬 수 있지만, 원래대로 꺼낼 때는 반드시 캐스팅 해야한다.
Bank2는 String 만 멤버변수를 이용하여 가리킬 수 있지만, 원래대로 꺼낼 때 캐스팅 필요 없다.

잠시 맡겼다가 꺼낼 때 양쪽이 확연히 장점이 갈린다. "양쪽의 장점을 결합할 수는 없을까? 동적으로 선택할 수 있으면 하나의 클래스로 딱인데"

class Bank <X>{  //extends Object는 생략가능
	X t = null;
}
public class Main{
	public static void main(String[] args){
		Bank<Object> bank = new Bank<Object>();  // Object t = null;
		bank.t = "HelloWorld";
		String t2 = (String)bank.t;
		
		Bank<String> bank2 = new Bank<String>();
		bank2.t = "HelloWorld";
		String t3 = bank2.t;
		
		Bank<Integer> bank3 = new Bank<Integer>();
		bank3.t = 100;		//오토박싱 ( Integer t = new Integer( 100 ); )
		int j = bank3.t;	// 언박싱  ( int j = t.intValue() )
	}
}
  • 클래스 안에서 언급되는 변수의 타입을 <> 안에 지정되는 타입으로 동적으로 결정할 수 있다.
    >> 이를 제너릭( Generic ) 이라고 부른다. 
  • 자바에서 제네릭(generic)이란 데이터의 타입을 일반화한다는 것을 의미한다.
  • 제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다.

제너릭을 사용했을 때의 장점은 다음과 같다.

  •  클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다.
  •  반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.

[ 인터페이스에 제너릭을 활용한 예 ]

interface ITemp <X> {
	public X getData();
}
class Temp implements ITemp<String>{
	public String getData(){ return "HelloWorld" ;}  // 오버라이딩
}
class Temp2 implements ITemp<Integer>{
	public Integer getData(){ return 100; }  // 오버라이딩 발생, 100이 오토박싱되어 new Integer( 100 ) 이 반환된다.
}

public class Main{
	public static void main(String[] args){
		ITemp<String> it = new Temp();
		String l = it.getData();
		System.out.println( l );	// 결과 : HelloWorld
		
		ITemp<Integer> it2 = new Temp2();
		int i = it2.getData();			// 언박싱
		System.out.println( i );  // 결과 : 100
	}		
}