JAVA

[JAVA] 제네릭 프로그래밍

싱숭셩숭 2023. 6. 13. 13:10
class Box1 { //String 객체만 저장할 수 있는 Box1 클래스

     private String data;

     public void set(String data) {
         this.data = data;
     }

     public String get() {
         return data;
     }

}

class Box2 { //Integer 객체만 저장할 수 있는 Box2 클래스

     private Integer data;

     public void set(Integer data) {
         this.data = data;
     }

     public Integer get() {
         return data;
     }

}

 

▲ Box1과 Box2는 type만 다르고 알고리즘이 같음 (굉장히 유사한 코드)
     코드 유지보수성 향상을 위해서 중복된 코드를 하나로 모은다.
         ex. 메소드 만들기, 상속(부모 클래스에 중복된 코드 넣기), this, super


제네릭 프로그래밍 - 제네릭 클래스

제네릭 : 알고리즘이 같고 type만 다른 코드를 합칠 수 있음.

class Box <T> { //T는 타입을 의미

     private T data;

     public void set(T data) {
         this.data = data;
     }

     public T get() {
         return data;
     }

}

public class Generic {

	public static void main(String[] args) {
    		Box<String> b = new Box<String>(); //클래스 이름인 Box<String>은 띄어쓰기 없이 붙여쓰기
        
       		b.set("Hello World!"); //문자열 저장
        	String s = b.get();
        	System.out.println(s); //Hello World! 출력
	}

}

 

T자리에는 int와 double같은 기본자료유형을 사용할 수 없음, only 참조자료유형
→ wrapper class 사용 (Integer, Double)
 
위의 class Box <T>에서
T에 Integer 대입 → class Box <Integer> 생성  return Integer 객체
T에 String 대입 → class Box <String> 생성 → return String 객체


제네릭 프로그래밍 - 제네릭 메소드

public static Integer getLast(Integer[] a) { //Integer 배열을 매개변수로 받아서 배열의 가장 마지막 원소를 반환하는 메소드
	return a[a.length - 1];
}

public static String getLast(String[] a) { //String 배열을 매개변수로 받아서 배열의 가장 마지막 원소를 반환하는 메소드
	return a[a.length - 1];
}
public class GenericMethod {
	//<T>은 타입 매개변수, 타입 매개변수의 범위는 메소드 내부로 제한된다.
	public static <T> T getLast(T[] a) { //위 두 개의 메소드에 대한 제네릭 메소드 정의
    		return a[a.length - 1];
	}
    
   	public static <T> void printArray(T[] a)  {
    	for (T element : a)
    		System.out.print(element + "\t");
		System.out.println();
    }
    
    public static void main(String[] args) {
    	Integer[] iArray = {1, 2, 3};  
        Double[] dArray = {1.1, 2.1, 3.1};  
        Character[] cArray = {'H', 'C', 'I'};
        
        printArray(iArray);
        printArray(dArray);
        printArray(cArray);
        
        System.out.println(getLast(iArray));
        System.out.println(getLast(dArray));
        System.out.println(getLast(cArray));
   }
}

다중 타입 매개 변수 (Multiple Type Parameters)

class OrderedPair<K, V> {
	private K key;
    private V value;
    
    public OrderedPair(K key, V value) {
    	this.key = key;
        this.value = value;
    }
    
    public K getKey()	{ return key; }
    public V getValue()	{ return value; }
}

public class OrderedPairTest {
	public static void main(String[] args) {
    	OrderedPair<Integer, String> p1 = new OrderedPair<Integer, String>(20221234, "김철수");
        OrderedPair<String, String> p2 = new OrderedPair<String, String>("짱아오빠", "신짱구");
        
        System.out.println(p1.getKey() + ", " + p1.getValue()); //20221234, 김철수 출력
        System.out.println(p2.getKey() + ", " + p2.getValue()); //짱아오빠, 신짱구 출력
    }
}