[Algorithm/Lamda] 함수형 인터페이스
함수형 인터페이스 - 단 하나의 추상 메서드만 선언된 인터페이스

인터페이스로 구현 객체를 사용하려면 인터페이스 변수를 선언하고, 구현 객체를 대입해야 한다.
즉 인터페이스 변수가 구현 객체의 주소를 참조한다.

일회성의 구현 객체를 생성하기 위해 소스파일을 만들고 클래스를 선언 하는것은 효율적이지 못하다.
그래서 익명 구현 객체를 생성하여 인터페이스를 구현한 익명의 구현 객체를 생성한다.
방법으론
인터페이스 변수 = new 인터페이스(){
인터페이스에서 생성한 추상메서드
};
이렇게 생성된 익명 객체는 컴파일러에 의해 자동으로 클래스가 생성되며 이름에 $가 포함되어 있다.

==> 동일한 것을 다시 해봤다

추가 적인 예를 설명으로 하자면

============================================================================================
리턴 값이 함수형 인터페이스 // 매개변수가 함수형 인터페이스
..음 약간 람다식 자체가 함수형인터페이스의 구현 객체라고 생각하고 진행하면
결국에 인터페이스에서 정의한 메서드를 재구성하여 실행한다라고 생각하고 코드를 보자
Function f1 = () -> System.out.println("f1.run()");
함수형인터페이스 f1은 void run()을 System.out.println("f1.run()"); 구현하였다.
따라서 f1.run()의 경우 f1.run() 으로 실행된다.
Function f2 = new Function() {
@Override
public void run() {
System.out.println("f2.run()");
}
};
f2 또한 익명 객체를 통해서 void run() 을 System.out.println("f2.run()"); 으로 재정의 하였고
f2.run(); 실행시 f2.run()이 실행된다.
Function f3 = getMyFunction(); 의 경우는
getMyFunction() 매서드의 리턴형이 Function 즉 함수형 인터페이스 이고
리턴될 함수형 인터페이스는
Funtion f = () -> System.out.println("f3.run()");
으로 구현된 f를 return 한다
그렇기 떄문에
f3.run(); 의 경우 f3.run() 으로 출력된다.
마지막으로 execute(Function f)의 경우는
매개변수로 함수형 인터페이스를 넣어주는데
() -> System.out.println("f1.run()") 이것 자체가 void run() 의 람다식 형식이므로 람다식은 함수형 인터페이스 이므로
void run() 이 System.out.println("f1.run()") 으로 구현된 함수형 인터페이슬 넣은것과 같으므로
f1.run()이 실행된다

