학원/JDBC
10/25 28-5 Generic 코딩으로 알아보기
도원결의
2022. 10. 25. 19:38
코딩을 치면 좀 알게될 까?
public class MyGeneric<T> {
private T field;
// public static T staticField; // 정적 필드에는 타입파라미터 안된다!!!
public T getField() {
return field;
}
public void setField(T field) {
this.field = field;
}
// public static T staticMethod() {return field;} 안돼용 정적메소드는 타입 파라미터 불가! 단 제너릭 메소드에는 static 사용가능
// public static void saticMethod(T field) {} 타입파라 노노
//제너릭메소드(정적).인스턴스화 없이 클래스명으로 접근
public static <T> T getEndValue1(T...t) {
for(int i=0 ; i < t.length ; i++) System.out.println(t[i]);
return t[t.length-1];
}
//제너릭메소드(인스턴스화).인스턴스화 해서 변수로 접근
public <T> T getEndValue2(T...t) {
return t[t.length-1];
// return field; 메소드의 T가 저 맨 위(MYGENERIC)의 T가아님!!
}
//[타입제한하기]
// 일반 메소드로 메소드 파라미터의 타입제한 <? extends Number> ==숫자로 제한한다!!
// 요소의 모든합을 구하는 메소드
public static void nonGenericMethod( List<? extends Number> numbers) {
int total = 0;
for(Number number : numbers ) {
total += number.intValue();
}
System.out.println("컬렉션에 저장 된 요소의 총합:"+total);
}/////////nonGenericMethod
//위 메소드를 제너릭 메소드로 변환!!!!! list<T>의 는 맨 위(MYGENERIC)의 T임
// public static <? extends Number> void GenericMethod(List<T> numbers) {}
//list<T>의 는 맨 위(MYGENERIC)의 T임
//?를 T로 해야 맨 위(MYGENERIC)의 T가 아닌 <T>반환타입형태의 T로 컴파일
public static <T extends Number> void GenericMethod(List<T> numbers) {
int total = 0;
for(Number number : numbers ) {
total += number.intValue();
}
System.out.println("컬렉션에 저장 된 요소의 총합:"+total);
}//////////GenericMethod
}
얘는 클래스와 메소드
public class GenericApp {
public static void main(String[] args) {
System.out.println("[타입 파라미터 미지정]");
MyGeneric generic1 = new MyGeneric();
generic1.setField("NON TYPE-PARAMETER"); // OBJECT
String value = (String)generic1.getField();
System.out.println("저장된 문자열의 길이:"+value.length());
System.out.println("[타입 파라미터 지정]");
MyGeneric<Student> generic2 = new MyGeneric<>();
// generic2.setField("TYPE-PARAMETER"); 컴파일시 타입체크 Student 만 가능
generic2.setField(new Student("가길동",20,"2022학번"));///setField(Student)
generic2.getField().print();
System.out.println("[제너릭 메소드 호출: 정적메소드 - 타입 파라미터 지정]");
// 클래스명.<integer>메소드명()- 인자로 integer 타입 배열만 가능
//반환타입 무조건 integer
System.out.println( MyGeneric.<Integer>getEndValue1(1,2,3,4,5));
// System.out.println( MyGeneric.<Integer>getEndValue1(1,2,3,4.5,5));
System.out.println("[제너릭 메소드 호출: 정적메소드 - 타입 파라미터 미지정]");
System.out.println( MyGeneric.getEndValue1(1,2,3,4.5,5));
System.out.println( MyGeneric.getEndValue1(new String[] {"한라산","덕유산","소백산"}));
System.out.println("[제너릭 메소드 호출: 인스턴스 메소드 - 타입 파라미터 지정]");
System.out.println(generic2.<String>getEndValue2("도봉산","북한산","관악산"));
System.out.println("[제너릭 메소드 호출: 인스턴스 메소드 - 타입 파라미터 미지정]");
System.out.println(generic2.getEndValue2(1,2,3,4.5,5));
System.out.println("[타입 파라미터 제한하기:non 제너릭 메소드]");
List<Character> list1 = Arrays.asList('가','나','다','라');
// MyGeneric.nonGenericMethod(list1); 타입체크가 됨 number만 들어가야지....
MyGeneric.nonGenericMethod(Arrays.asList(1,2,3.14,4));
System.out.println("[타입 파라미터 제한하기:제너릭 메소드]");
// MyGeneric.GenericMethod(list1); 타입체크함
MyGeneric.GenericMethod(Arrays.asList(1,2,3.14,4));
}////m
}///////////c
얜 걍 보면 이해 할 수 있을 정도까지만 하쟈..