클래스, 인터페이스, 메소드를 정의할 때 타입 매개변수(타입 파라미터)를 선언하고 사용할 수 있음
→ 자바 프로그램의 재사용성을 높이고 오류를 줄이는 방법
접근제어자 class 클래스이름<T1,T2,...> {
... ...
}
Raw 타입타입 매개변수 없이 사용되는 제네릭 타입
Object로 처리함class Data<T> {
private T t;
public Data(T t) {this.t = t;}
public void set(T t) {this.t = t;}
public T get() {return t;}
}
→ Data는 제네릭 타입 Data<T>의 raw 타입
자료형을 매개변수로 가지는 메소드
→ 하나의 메소드 정의로 여러 유형의데이터를 처리할 때 유용함
public <T> void swap(T[] array, int i, int j) {
T temp = array[i];
array[i] = array[j];
array[j] = temp;
}
static 메소드 모두 제네릭 메소드로 정의 가능<T extends Number> // T를 상한으로 정할 수 있음
// T에 주어지는 실제 자료형은 Number의 서브 클래스여야 함

Data<int> d = new Data<>(); //오류
class Data<T> {private T t1 = new T();} //오류
static 데이터 필드를 선언할 수 없음class Data<T> {private static T t2;} //오류
Data<Integer>[] arrayOfData; //오류
인터페이스를 구현하는 익명 클래스의 객체 생성 부분을 수식화한 것
Runnable runnable = new Runnable() {
public void run() {
... }
}
Runnable runnable = () -> {...};
인터페이스 변수 = (매개변수) -> { 실행문 };
| 형태 | 예시 |
|---|---|
| 매개변수 타입 생략 | (a, b) -> a + b |
| 매개변수 1개 → 괄호 생략 | a -> a * 2 |
| 매개변수 없음 | () -> 실행문 |
| 실행문 1개 → 중괄호 생략 | (x) -> System.out.println(x) |
실행문이 return만 있을 때 → return, {}, ; 생략 | (a, b) -> a + b |
// Runnable은 추상 메소드 1개 (run)
Runnable r = () -> System.out.println("my thread");
// 함수형 인터페이스의 계산 메소드
MyFunction f = (a, b) -> a + b;
functional interface1개의 추상 메소드만 가지는 단순한 인터페이스
패키지 java.util.function에서 표준 함수형 인터페이스가 제네릭 인터페이스로 제공
함수형 인터페이스를 구현하는 클래스를 정의할 때, 익명 클래스 정의를 활용할 수 있으나 람다식이 효율적
💡 표준 함수형 인터페이스의 예
Consumer<T>는void accept(T t)를 가짐Supplier<T>는T get()메소드를 가짐Functional<T, R>은R apply(T t)를 가짐
public class Main {
public static void main(String args[]) {
Thread thd = new Thread(() - > System.out.println("hi"));
thd.start();
}
}
import java.util.function.*;
public class Main {
public static void main(String args[]) {
Supplier <Integer> rand = () - > {
Integer r = (int)(Math.random() * 10);
return r;
};
int a = rand.get();
System.out.println(a);
}
}