java 제네릭

さようなら。冬·2020년 12월 10일
0

틀린 부분 있으면 댓글이나 지적 환영
https://namjackson.tistory.com/18 참조 하면서 만들었어요

그냥 대충 만든 코드 제네릭이 뭔지 알기위한 그런 코드니 참고용으로만 봐주세요

1 . 제네릭 class

 
public class GenericSource<T> {
	private T t;

	public T getT() {
		return t;
	}

	public void setT(T t) {
		this.t = t;
	}

}
 


public class GenericSource2<T> {

	private int test2;
	private int test3;

	public int getTest2() {
		return test2;
	}

	public void setTest2(int test2) {
		this.test2 = test2;
	}

	public int getTest3() {
		return test3;
	}

	public void setTest3(int test3) {
		this.test3 = test3;
	}

	@Override
	public String toString() {
		return "GenericSource2 [test2=" + test2 + ", test3=" + test3 + "]";
	}

}
  1. 인터페이스의 경우
 interface InterFaceExample <T1,T2>{
    T1 testMethod12(T2 t);
    T2 testMethod13(T1 t);
}
public class TestInterface implements InterFaceExample<String, Integer>{

	@Override
	public String testMethod12(Integer t) {
		return String형태;
	}

	@Override
	public Integer testMethod13(String t) {
		return Integer형태;
	}
} 

3.메소드를 사용할시에

//메소드의 파라미터 T 이 선언되어 있다면, 리턴타입 바로앞에 제너릭 타입을 선언해주어야한다.

public class TestGenericMethod {

 public static <T> List<T> methodEx(List<T> list,T item)
 {
	 list.add(item);
	 return list;
 }

-->T를 String 클래스 타입으로 바꿔봐도 OK

 public static <String> List<String> methodEx12(List<String> list,String item)
 {
	 list.add(item);
	 return list;
 }
 public static <Integer> List<Integer> methodEx12(List<Integer> list,String item)
 {
	 list.add(item);
	 return list;
 } 

//parameter에서 형태의 List가 들어가니 리턴도 그걸로 해주겠다라는거 같다

}

  1. Main함수나 실행 클래스에서 제네릭 클래스 테스를 해봤다
public class GenericMain {
	public static void main(String args[]) {

  		GenericSource<Integer> test = new GenericSource<Integer>();
		GenericSource<String> test1 = new GenericSource<String>();
		test.setT(10);
		
  
  		test.setT("test123"); error[test에는 문자열이 들어올수없다 위에 이미 선언을 해놔서]
 		
		test.setT(123);// integer으로 했을떄 정상
 
		test1.setT(123); error[test1 변수는 String 클래스만 들어오게 설정해놔서 int형은 들어올수 없다]
        // String 으로 했을 경우는 정상 
		test1.setT("test123"); 
		
		String paramStr = "1";
		Integer paramint =0;

		List<String> strList = new ArrayList<String>();
		List<Integer> intList = new ArrayList<Integer>();
		
		TestMethod.methodEx(strList, paramStr);(O);
		TestMethod.methodEx(strList, paramint);(X);
	}
}

5.다음으로 WildCard라는게 있다

1. Generic 타입에는 <?>도 존재한다.
2.?는 알수없는 타입이며, 사용법으로는 아래와같다
3.<?> : 모든 객체 자료형, 내부적으로는 Object로 인식
4.<? super 객체형> : 명시된 객체자료형의 상위 객체, 내부적으로는 Object로 인식
5.<? extends 객체자료형> : 명시된 객체자료형을 상속한 하위객체, 내부적으로는 명시된 객체 자료형으로 인식

0개의 댓글