본문 바로가기

자바/컬렉션

제너릭 (Box)

예제1)


// 제너릭 : 멤버변수나 멤버함수를 자료형별로 구할 필욕없이 하나만 구현해서 사용 가능하도록 하는 기능. 뾰족괄호

public class Test3 {

public static void main(String[] args) {

Box<Integer> b1=new Box<Integer>(); //class Box<T>의 뾰족괄호안에 Integer이 들어가서 T는 모두 Integer이 대입된다.

b1.set(new Integer(10));

Integer ii=b1.get();

System.out.println(ii);

b1.write();

System.out.println();

Box<String> b2=new Box<String>();

b2.set("테스트");

String ss=b2.get();

System.out.println(ss);

b2.write();

System.out.println();

Box b3=new Box(); //  경고 나옴 // 뾰족괄호 없이 객체생성함. 이럴때는 반드시 캐스팅이 필요하다.

b3.set(new Integer(3));

Integer aa=(Integer)b3.get(); //  반드시 캐스팅 필요

b3.write();

b2.print(new Float(10.0f));

b2.print(new String("서울"));

b2.test(new Integer(20));

// b2.test(new String("서울")); //오류 : String은 number의 하위 클래스가 아니므로

}

}


// ↓↓↓↓↓클래스에 적용된 제너릭↓↓↓↓↓

class Box<T>{ // 뾰족괄호 안에 문자는 아무거나 써도 상관없지만 일반적으로 Type의 T를 쓴다.

private T tt;

public void set(T tt){

this.tt=tt;

}

public T get() {

return tt;

}

public void write() {

System.out.println(tt.getClass());

}

public <U> void print(U u) { //  메소드에 적용된 제너릭

System.out.println(u.getClass().getName());

}

public <U extends Number> void test(U u) { // //메소드에 적용한 제너릭을 상속한 제너릭

System.out.println(u.getClass().getName());

}

}


예제1 결과)

10
class java.lang.Integer

테스트
class java.lang.String

class java.lang.Integer
java.lang.Float
java.lang.String
java.lang.Integer

=====================================================================================================================

예제2)

//제너릭은 형이 엄격하다
public class Test4 {
public static void main(String[] args) {
Demo4<Integer> oo=new Demo4<Integer>();
oo.set(new Integer(10));
oo.write();
// Demo4<Object> bb=oo; // 업캐스팅 형식으로 가능 할 수도 있을것 같지만 에러.
Demo4<?> bb=oo; //모두 가능
Integer aa=oo.get();
System.out.println(aa);
// Integer ii=bb.get(); // 에러.(Object 이므로)
Integer ii=(Integer)bb.get();
System.out.println(ii);
// bb.set(new Integer(100)); //에러 ? 이므로
((Demo4<Integer>)bb).set(new Integer(100)); //경고
Demo4<? extends Number> cc=oo; // Number 하위만 가능.  oo는 제너릭이 Integer이므로 가능
}
}

class Demo4<T>{
private T tt;
public void set(T tt) {
this.tt=tt;
}
public T get() {
return tt;
}
public void write() {
System.out.println(tt);
System.out.println(tt.getClass());
}
}

예제2 결과)

10
class java.lang.Integer

테스트
class java.lang.String

class java.lang.Integer
java.lang.Float
java.lang.String
java.lang.Integer

'자바 > 컬렉션' 카테고리의 다른 글

Stack  (0) 2013.05.24
TreeSet  (0) 2013.05.24
map  (0) 2013.05.24
set  (0) 2013.05.24
Vector, ArrayList class  (0) 2013.05.21