학원/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

 

얜 걍 보면 이해 할 수 있을 정도까지만 하쟈..