🔥 Vamos/Java
1114 | 자바의 정석 기초편 :: ch14-5~14-6
unikue
2022. 11. 14. 21:45
함수형 인터페이스
: 단 하나의 추상메서드만 선언된 인터페이스
: 람다식을 다루기 위해서 사용
👉 (익명객체인) 람다식의 참조변수를 어떻게 만들어줄 것인가?
1. 함수형 인터페이스 선언
2. 함수형 인터페이스 타입의 참조변수를 가지고 람다식을 다루면 됨
@FunctionalInterface // @애너테이션 붙여주면 검사해줌
interface MyFunction{ // 함수형 인터페이스(단 하나의 추상메서드만 가짐)
public abstract int max (int a, int b); // 인터페이스의 모든 메서드는 public abstract
// new 조상이름/클래스/인터페이스{멤버} Object대신에 함수형 인터페이스 MyFunction사용
//익명클래스. 클래스의 선언, 객체생성을 동시에
MyFunction f = new MyFunction(){
public int max (int a, int b){ // 오버라이딩규칙 - 접근 제어자는 좁게 못바꾼다 public 꼭 써줘야함
return a>b ? a: b;}
};
// 원래 Object형에는 max가 없어서 에러지만, 현재 함수형 인터페이스의 MyFuction에는 max()가 있어서 가능
int value = f.max(3,5);
--------------------------------------------------------------
// ** pulic int max()~대신에 함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있음 (익명클래스 내용 대신에 람다식 사용가능)
(*단, 함수형 인터페이스의 메서드와 람다식의 매개변수 개수, 반환타입이 일치해야 함)
MyFunction f = (a, b) -> a > b ? a: b;
int value = f.max(3,5); // 실제로는 람다식(익명함수)이 호출됨. 인터페이스에 있는 max와 맞아야 함
* 람다식을 다루기 위한 참조변수의 타입은 함수형 인터페이스로 한다.
: 람다식은 메서드. 사용하려면 이름이 있어야 하는데 호출하려고 보니 이름을 다지워놨음.
사용하려면 이름이 필요하긴해서, 인터페이스의 추상메서드를 참조변수를 가지고 람다식에 붙여준다고 보면 됨.(추상메서드를 통해서 람다식을 호출)
👉매개변수로 함수형 인터페이스 사용 가능
👉반환타입으로 함수형 인터페이스 사용 가능
👉 즉 람다식을 참조변수로 다룰 수 있다는 것은, 메서드를 통해 람다식을 주고받을 수 있다는 뜻. 변수처럼 메서드 주고받기가 가능해짐.
@FunctionalInterface
interface MyFunction{
void run(); // public abstract void run(); 과 동일
}
class Lamda1{
static void excute (MyFunction f){ // 매개변수 타입이 MyFunction인 메서드
f.run(); }
saatic MyFunction getMyFunction(){ // 반환타입이 MyFunction인 메서드
MyFunction f = () -> System.out.println("f3.run()");
retufn f; }
public static void main (String args[]){
//람다식으로 MyFuinction의 run()구현
MyFunction f1 = ()-> System.out.println("f1.run()");
MyFunction f2 = new MyFunction () { // 익명클래스로 run()구현
public void run() { // public 반드시 붙여야 함
System.out.println("f2.run()");
}
};
MyFunction f3 = getmyFunction();
f1.run();
f2.run();
f3.run();
excute(f1);
excute( ()-> System.out.println("run()") ); }
}