자바-제네릭
Integer 배열, String 배열 또는 정렬을 지원하는 모든 유형의 배열에서 요소를 정렬 할 수있는 단일 정렬 메서드를 작성할 수 있다면 좋을 것입니다.
자바 Generic 메서드 및 제네릭 클래스를 사용하면 프로그래머는 단일 메서드 선언, 관련 메서드 집합 또는 단일 클래스 선언을 사용하여 관련 형식 집합을 각각 지정할 수 있습니다.
제네릭은 또한 프로그래머가 컴파일 타임에 유효하지 않은 형식을 포착 할 수 있도록 컴파일 타임 형식 안전성을 제공합니다.
Java Generic 개념을 사용하여 객체 배열을 정렬하는 일반 메소드를 작성한 다음 Integer 배열, Double 배열, String 배열 등으로 일반 메소드를 호출하여 배열 요소를 정렬 할 수 있습니다.
일반 방법
다른 유형의 인수로 호출 할 수있는 단일 제네릭 메서드 선언을 작성할 수 있습니다. 제네릭 메서드에 전달 된 인수 유형에 따라 컴파일러는 각 메서드 호출을 적절하게 처리합니다. 다음은 일반 방법을 정의하는 규칙입니다-
모든 제네릭 메서드 선언에는 메서드의 반환 형식 앞에 꺾쇠 괄호 (<및>)로 구분 된 형식 매개 변수 섹션이 있습니다 (다음 예제에서는 <E>).
각 유형 매개 변수 섹션에는 쉼표로 구분 된 하나 이상의 유형 매개 변수가 있습니다. 유형 변수라고도하는 유형 매개 변수는 일반 유형 이름을 지정하는 식별자입니다.
형식 매개 변수를 사용하여 반환 형식을 선언하고 실제 형식 인수라고하는 제네릭 메서드에 전달 된 인수 형식에 대한 자리 표시 자 역할을 할 수 있습니다.
일반 메서드의 본문은 다른 메서드의 본문과 같이 선언됩니다. 유형 매개 변수는 기본 유형 (예 : int, double 및 char)이 아닌 참조 유형 만 나타낼 수 있습니다.
예
다음 예제는 단일 Generic 메서드를 사용하여 다른 유형의 배열을 인쇄하는 방법을 보여줍니다.
public class GenericMethodTest {
// generic method printArray
public static < E > void printArray( E[] inputArray ) {
// Display array elements
for(E element : inputArray) {
System.out.printf("%s ", element);
}
System.out.println();
}
public static void main(String args[]) {
// Create arrays of Integer, Double and Character
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
System.out.println("Array integerArray contains:");
printArray(intArray); // pass an Integer array
System.out.println("\nArray doubleArray contains:");
printArray(doubleArray); // pass a Double array
System.out.println("\nArray characterArray contains:");
printArray(charArray); // pass a Character array
}
}
이것은 다음 결과를 생성합니다-
산출
Array integerArray contains:
1 2 3 4 5
Array doubleArray contains:
1.1 2.2 3.3 4.4
Array characterArray contains:
H E L L O
경계 유형 매개 변수
유형 매개 변수에 전달할 수있는 유형의 종류를 제한하려는 경우가있을 수 있습니다. 예를 들어, 숫자에 대해 작동하는 메서드는 Number 또는 해당 하위 클래스의 인스턴스 만 허용하려고 할 수 있습니다. 이것이 경계 유형 매개 변수의 용도입니다.
경계 유형 매개 변수를 선언하려면 유형 매개 변수의 이름, extends 키워드, 상위 경계를 차례로 나열하십시오.
예
다음 예제는 "extends"(클래스에서와 같이) 또는 "implements"(인터페이스에서와 같이)를 의미하는 일반적인 의미에서 extends가 사용되는 방법을 보여줍니다. 이 예제는 세 개의 Comparable 객체 중 가장 큰 것을 반환하는 Generic 메서드입니다.
public class MaximumTest {
// determines the largest of three Comparable objects
public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
T max = x; // assume x is initially the largest
if(y.compareTo(max) > 0) {
max = y; // y is the largest so far
}
if(z.compareTo(max) > 0) {
max = z; // z is the largest now
}
return max; // returns the largest object
}
public static void main(String args[]) {
System.out.printf("Max of %d, %d and %d is %d\n\n",
3, 4, 5, maximum( 3, 4, 5 ));
System.out.printf("Max of %.1f,%.1f and %.1f is %.1f\n\n",
6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ));
System.out.printf("Max of %s, %s and %s is %s\n","pear",
"apple", "orange", maximum("pear", "apple", "orange"));
}
}
이것은 다음 결과를 생성합니다-
산출
Max of 3, 4 and 5 is 5
Max of 6.6,8.8 and 7.7 is 8.8
Max of pear, apple and orange is pear
일반 클래스
제네릭 클래스 선언은 클래스 이름 뒤에 형식 매개 변수 섹션이 오는 것을 제외하고는 제네릭이 아닌 클래스 선언과 비슷합니다.
제네릭 메서드와 마찬가지로 제네릭 클래스의 형식 매개 변수 섹션에는 쉼표로 구분 된 하나 이상의 형식 매개 변수가있을 수 있습니다. 이러한 클래스는 하나 이상의 매개 변수를 허용하므로 매개 변수가있는 클래스 또는 매개 변수가있는 형식이라고합니다.
예
다음 예제는 일반 클래스를 정의하는 방법을 보여줍니다.
public class Box<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
Box<String> stringBox = new Box<String>();
integerBox.add(new Integer(10));
stringBox.add(new String("Hello World"));
System.out.printf("Integer Value :%d\n\n", integerBox.get());
System.out.printf("String Value :%s\n", stringBox.get());
}
}
이것은 다음 결과를 생성합니다-
산출
Integer Value :10
String Value :Hello World