package kr.or.ddit.basic;
- 제네릭을 지정하지 않으면 Object 로 지정된다. 대신 꺼내올때 형변환을 해주어야 한다.
-제네릭을 쓰게 되면 제네릭 타입만을 쓸 수 있고 꺼내올때 형변환을 해줄 필요가 없다.
//일반클래스 (지금까지 해왔던 )
class NonGenericClass{
private Object val;
public void setVal(Object val) {
this.val = val;
}
public Object getVal() {
return val;
}
}
/*
* 제네릭을 사용하는 클래스를 만드는 방법
*
* class 클래스명<제네릭타입글자> {
* 제네릭타입글자 변수명; // 변수 선언에 제네릭을 사용할 경우
*
*
* 제네릭타입글자 메서드명 (매개변수들...) { //메서드의 반환값으로 제네릭을 사용할 경우
* 실행문
* return 값;
*
* }
*
*
* 반환값타입 메서드명 (제네릭타입글자 변수명 ) { //메서드의 매개변수에 제네릭을 사용할 경우
* 실행문들.....
*
*
* return 값;
*
* }
*
* }
*
* 참고 : 제네릭 타입 글자로 사용하는 것들 : 영문자 대문자 1글자를 쓴다.
*
* T ==> Type
* k ==> key
* V ==> Value
* E ==> Element
*
*
*
*/
class GenericClass<T /*, A*/>{ //T가 제네릭 타입 글자
private T val; //Object 타입 대신 T를 쓴거얌...
//private A val2; //도 추가할 수 있다.
/* private T val3; */
public void setVal(T val) {
this.val = val;
}
public T getVal() {
return val;
}
}
public class GenericTest {
public static void main(String[] args) {
NonGenericClass ng1 = new NonGenericClass();
ng1.setVal("가나다라");
NonGenericClass ng2 = new NonGenericClass();
ng2.setVal(100);
String str1 = (String)ng1.getVal(); //형변환을 반드시 해주어야 한다.
System.out.println("문자열 반환값 str1 : " + str1);
Integer num1 = (Integer)ng2.getVal(); //형변환을 반드시 해주어야 한다. :
System.out.println("정수형 반환값 num1 : " + num1 );
//제네릭 타입
GenericClass<String> gc = new GenericClass();
// 여기서 <String> 을 써줬으니까 밑에 제네릭 사용하는 class 에 T 부분을 전부 String 으로 자동으로 변환해준다.
GenericClass<Integer> gc1 = new GenericClass();
gc.setVal("만두");
// 오류 : 타입이 달라서 gc1.setVal("100");
gc1.setVal(200);
//만약에 String num1 = (String)gc1.getVal(); 은 문법상으로 애러는 안됬지만 실행을 하면 에러가 나온다.
//왜냐하면 지금 gc1 은 Object 타입전체이지만 사실은 안에 Integer 타입인데 그것을 String 으로 해주려고 하니까 에러
String str2 = gc.getVal(); //형변환을 안해줘도 된다.
int num2 = gc1.getVal();
System.out.println("제네릭 문자열 반환값 str2 = " + str2);
System.out.println("제네릭 정수형 반환값 num2 = " + num2);
}
}
댓글
댓글 쓰기