제네릭 클래스를 만드는 방법
형식)
class 클래스명 <제네릭타입글자>{
//<제네릭타입글자>: 영문자 한글자로 주로 사용
제네릭타입글자 변수명; //변수 선언에 제네릭을 사용한 경우
...
제네릭타입글자 메서드명(메개변수들...){
//메서드의 반환값에 있는 메서드에 제네릭을 사용한 경우
...
return 값;
}
}
반환값타입 메서드명(제네릭타입글자 변수명){
//메서드의 매개변수에 제네릭을 사용한 경우
...
return 값;
}
package kr.or.didt.basic.generic;
class MyGeneric<T>{
//<T,V,E>제네릭 여러개 넣기 가능 ,하지만 객체 생성시 갯수도 맞춰 줘야함
private T val;
public void setVal(T val){//메서드의 매개변수에 제네릭 사용
this.val = val;
}
public T getVal(){//메서드 변수명에 사용
return val;
}
}
class NonGeneric{
//아무 객체나 저장하고 싶은 클래스를 만들고시퍼
private Object val;
public void setVal(Object val){
//(부모)가나다라 문자열이 들어감
this.val = val;
}
public Object getVal(){
return val;
}
}
public class GenericTest {
//제네릭: 컬렉션 객체를 생성할때 컬랙션에 저장할 데이터의 객체를 생성하는 것
//데이터를 보관할 목적으로 사용됨
public static void main(String[] args) {
//(자식): 자식이 부모에게 들어갈때는 형변환 없음
NonGeneric ng1 = new NonGeneric();
ng1.setVal("가나다라");//문자 저장 가능
NonGeneric ng2 = new NonGeneric();
ng2.setVal(100);//숫자 저장 가능
//기본 자료형이 레퍼 클래스로 바뀔때는 오토박싱되고 위에서 저장이됨
//문자열 꺼내서 저장하기
String rtnNg1 = (String)ng1.getVal();
//부모를 자식에 넣을려면 형변환 해야함
System.out.println("문자열 반환값 : "+rtnNg1);
Integer rtnNg2 = (Integer)ng2.getVal();
//인티저(자식)에 부모를 넣어야 되서 형변환해야함
//Integer말고 Int라고 작성가능 // 박싱되어 있는것을 언박싱 하는 작업
System.out.println("정수형 반환값 : "+ rtnNg2);
System.out.println();
/*
NonGeneric ng3 = new NonGeneric();
ng3.setVal("홍길동");
Integer rtnNg3 = (Integer)ng3.getVal();
System.out.println("ng3 ==>"+rtnNg3);
//문자를 넣었는데 데이터를 꺼내온 데이터와 다른 문자형인것을 체크 하지 못함
//문자열로 넣었지만 non은 object라서 다른 객체로 형변환해서 집어 넣을수 있다.
//하지만 실행을 해보면 오류가 뜸(컴파일은 에러 안뜸)*/
System.out.println("-----------------------------");
MyGeneric<String> mg1 = new MyGeneric<>();
//T자리의 값을 String변수로 치환해서 반환하는 것
MyGeneric<Integer> mg2 = new MyGeneric<>();
mg1.setVal("우리나라");
mg2.setVal(500);
String rtnMg1 = mg1.getVal(); // 형변환 없이 사용
System.out.println("제네릭 문자열 반환값 : " + rtnMg1 );
int rtnMg2 = mg2.getVal();
System.out.println("제네릭 정수형 반환값 : " + rtnMg2);
// int test = mg1.getVal();
// 에러: 잘못쓴 내용을 빨리 찾을 수 있음
}
}
오토박싱 : int 라는 기본형을 래퍼클래스의 integer 형으로 자동으로 바꿔주는것
반대는 언박싱 이라고 한다.