범용함수
- template의 사용
- interface필요
범용 클래스
- 유지하는 값의 타입을 제한없음
- 모든 타입으로 유지
- 범용 클래스 내의 T 타입 객체를 new 불가
- 필요한 객체를 외부에서 생성하여 전달함
- 배열은 Object 배열,template을이용하는 자료구조
- interface필요없음
public class Box<T> {
private T value;
public Box(T value) {
this.value = value;
}
}
범용 객체 생성
List<String> files = new ArrayList<String>();
List<String> files = new ArrayList<>();//타입지정생략
var files = new ArrayList<String>();
T<U> files = new V<>();
범용메소드
- 타입 매개변수를 가지는 메소드
- 다양한 타입을 처리할 수 있는 메소드
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
- 타입 추론
printArray(intArray); //타입 자동으로 추론
// getMiddle 호출 시 명시적으로 타입을 지정
String name = Class1.<String>getname(names); // 타입을 명시적으로 지정
- 타입 매개변수 T 제한
//T가 Comparable<T>를 구현해야만 호출 가능
public static <T extends Comparable<T>> T min(T[] a, int size) {
//
}
//T가 Comparable<? super T>를 구현해야만 호출 가능
//Comparable<? super T>은 T가 자신과 상위타입 비교를 보장
//? super T은 T또는 T의 부모 타입
public static <T extends Comparable<? super T>> Pair<T> minmax(T[] a) {
//
}
Wildcard
? extends T
(상한 경계)- T와 하위클래스
- T 타입의 값을 제공하는 형태
? super T
(하한 경계)- T와 부모클래스
- T 타입의 값을 사용하는 형태
?
(무제한 경계)- 모든타입허용
public static void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
타입 매개변수 전달
static일때
- 외부 클래스의 인스턴스에 의존하지 않고 독립적으로 존재
static
메소드에서의 타입 매개변수는 메소드 선언 시 명시적으로 정의
public class A<T> {
private static class B<T> {
// B 클래스는 자체적인 타입 매개변수 T를 가짐
}
}
static아닐때
- 메소드에서의 타입 매개변수는 클래스 타입의 제네릭을 자동으로 상속
public class A<T> {
private class B<T> {
// B 클래스는 A의 T를 가짐
}
}
'Language > JAVA' 카테고리의 다른 글
[Java] 람다 (0) | 2024.12.03 |
---|---|
[Java] Object 클래스 (0) | 2024.12.03 |
[Java]쓰레드, 레코드 (0) | 2024.12.03 |