함수형 인터페이스
- 함수형 인터페이스 : 단 하나의 추상 메서드만 선언된 인터페이스
- 함수형 인터페이스 타입의 참조 변수로 람다식을 참조할 수 있음.
@FunctionalInterface // 함수형 인터페이스는 단 하나의 추상 메서드만 가져야 함.
interface MyFunction {
public abstract int max (int a , int b);
}
@FunctionalInterface 사용하면 메서드 2개 사용 못함, 함수형 인터페이스는 단 하나의 추상 메서드만 가져야 하기 때문.
package lamdaPt;
public class lamda1 {
public static void main(String[] args) {
// Object obj = (a, b) -> a > b ? a : b; // 람다식. 익명 객체
MyFunction f = new MyFunction() {
public int max(int a, int b) {
return a > b ? a : b;
}
};
int value = f.max(3,5); // 함수형 인터페이스
System.out.println(value);
}
}
@FunctionalInterface // 함수형 인터페이스는 단 하나의 추상 메서드만 가져야 함.
interface MyFunction {
public abstract int max (int a , int b);
}
함수형 인터페이스 MyFunction을 이용해서 익명 객체를 만들어 오버라이딩 해서 사용 가능
value = 5가 찍힌 것을 볼 수 있음.
이것을 짧게 만들기 위해서 람다식을 사용해서 바꿔본다 !
package lamdaPt;
public class lamda1 {
public static void main(String[] args) {
// 람다식(익명 객체)을 다루기 위한 참조변수의 타입은 함수형 인터페이스로 한다.
MyFunction f = (a, b) -> a > b ? a : b;
int value = f.max(3,5); // 함수형 인터페이스
System.out.println(value);
}
}
@FunctionalInterface // 함수형 인터페이스는 단 하나의 추상 메서드만 가져야 함.
interface MyFunction {
public abstract int max (int a , int b);
}
람다식 메서드 이름을 지워놨는데, 실제로 호출하려면 이름이 있어야 함.
함수형 인터페이스에 가보면 int max 이름이 있으므로 호출이 가능함.
함수형 인터페이스 - example
- 익명 객체를 람다식으로 대체
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
Collections.sort(list,new Comparator<String>(){
public int compare(String s1, String s2){
return s2.compareTo(s1);
}
});
이것도 너무 길어서 Comparator에 가보면
@FunctionalInterface // 이게 붙어있다. 그래서 람다식 사용 가능 !
interface Comparator<T> {
int compare(T o1, T o2);
}
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
Collections.sort(list,(s1,s2)-> s2.compareTo(s1));
Comparetor가 함수형 인터페이스 이므로 이렇게 바꿀 수 있다.
마지막 정리
package lamdaPt;
@FunctionalInterface
interface MyFunction2{
void run(); // 인터페이스 추상 메서드이므로 public static 생략됨!
}
public class lamda2 {
static void execute(MyFunction2 f) {
f.run();
}
static MyFunction2 getMyFunction() {
return () -> System.out.println("f3.run()");
}
public static void main(String[] args) {
// 람다식으로 MyFunction의 run()을 구현
MyFunction2 f1 = ()-> System.out.println("f1.run()");
MyFunction2 f2 = new MyFunction2() { // 익명클래스로 run()을 구현
public void run() { // public 안붙이면 default가 기본값인데 조상님이 public이므로 붙여줘야 에러가 나지 않습니다 ★
System.out.println("f2.run()");
}
};
MyFunction2 f3 = () -> getMyFunction();
f1.run();
f2.run();
f3.run();
execute(f1);
execute(()-> System.out.println("run()"));
}
}
첫 번째 f1은 람다식으로 MyFunction2 함수형 인터페이스의 run()을 구현한 것.
두 번째 f2는 익명 클래스로 run()을 구현한 것, 오버 라이딩 필수! 접근 제어자 확인!
세 번째 f3는 getMyFunction 메서드를 가지고 오는데 함수형 인터페이스에 접근해서 run을 구현해주는 것
마지막 execute는 람다식을 매개변수로 받아서 , 람다식과 주고받는 방법을 보여주는 것
'Java' 카테고리의 다른 글
Java : JVM 이란? 자바 메모리 구조 (0) | 2021.08.25 |
---|---|
Java : 람다식 java.util.function 패키지 - 기초 (0) | 2021.08.16 |
Java : 람다식 ? - 기초 (0) | 2021.08.16 |
Java : 쓰레드 wait()과 notify() - 기초 (0) | 2021.08.12 |
Java : 쓰레드의 동기화 (synchronization) - 기초 (0) | 2021.08.11 |