2020.10.27 고급자바 수업노트 NonGenericClass vs GenericClass

 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);


}


}





댓글