- ex) Comparator인터페이스의 추상메소드는 int compare(T o1, To2); 하나
*-> 앞뒤에 습관적으로 띄어쓰기나 return등 작성하지 말것 절대*
함수형 인터페이스의 종류
- R : 반환시킨다는 의미
- BI : 파라미터 2개라는 의미
Predicate<T> 파라미터 하나를 전달받아, boolean을 반환
BiPredicate<L, R> 파라미터 L과 R을 전달받아 boolean을 반환
Consumer<T>파라미터 하나를 전달받아, void를 반환
BiConsumer<T, U> 파라미터 T와 U를 전달받아 void를 반환
Function<T,R> 파라미터T를 전달받아 R을 반환
BiFunction<T,U,R> 파라미터 T와 U를 전달받아 R을 반환
- BiPredicate<L, R>에서의 R : 파라미터
- Function<T, R>에서의 R : 반환값
Computable 인터페이스를 사용하는 람다 예제
public interface Computable {
public int add(int num1, int num2);
// public void printMessage(); //이렇게되면 추상메소드 2개가 되기때문에 Computable 클래스를 람다로 표현할 수 없게됨
default public void printMessage() {
System.out.println("기본 메시지입니다.");
}
}
추상메소드가 반드시 '1개' 만 존재해야 람다로 쓸 수 있으므로 만약 추상메소드가 2개가 된다면 람다로 쓸 수 없음
하지만,
default 키워드를 가장 앞에 붙이면 (;로 끝나면 안되고, 중괄호{}반드시 넣어줘야됨(중괄호 안 내용은 안써도 됨))
-> 인터페이스도 기능을 구현할 수 있음
-> implementable class에서 overriding 가능 (overriding을 해주지 않으면 기본코드가 동작됨)
public class Main {
//nested class -> private, public, default, protected 모두 가능함
public static class SubMain{
}
public static void main(String[] args) {
Main main = new Main();
System.out.println(main); //fp_java.ch01anonymousclass.Main@49097b5d
SubMain subMain = new SubMain();
System.out.println(subMain); //fp_java.ch01anonymousclass.Main$SubMain@37a71e93
//($ 붙음 -> Main 이라는 클래스의 SubMain의 인스턴스이다)
// 익명클래스를 인터페이스로 바로 만들기
Computable computer = new Computable() { // (인터페이스는(추상메소드) 바로 인스턴스로 만들 수 없다)
@Override
public int add(int num1, int num2) {
return num1 + num2;
}
};
System.out.println(computer); //fp_java.ch01anonymousclass.Main$1@7106e68e (익명클래스로 만든 객체 : $ 붙음)
Computable computer2 = new Computable() {
@Override
public int add(int num1, int num2) {
return num1 + num2;
}
};
System.out.println(computer2); // fp_java.ch01anonymousclass.Main$2@6576fe71 -> $2 : 2번째로 만든 익명클래스
Computable computer3 = new Computable() {
@Override
public int add(int num1, int num2) {
return num1 + num2;
}
};
System.out.println(computer3); //fp_java.ch01anonymousclass.Main$3@300ffa5d -> $3 : 3번째로 만든 익명클래스
// 클래스안의 클래스로 만든 인터페이스라는 의미 = $
}
}