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()); //짱아오빠, 신짱구 출력
}
}