구현부가 아닌, 구현 코드를 호출하고 실행하는 부분 = 호스트 코드
호스트 코드 쪽으로 모든 결정을 미뤄라.
dafault
키워드로 interface가 구현 메소드를 가질 수 있게 한다.@FunctionalInterface
public interface Runnable {
void run(); // 추상 메소드, 함수
static void printHi() {
System.out.println("Hi");
}
default void printBye() {
System.out.println("Bye");
}
}
() -> {구현부};
로는 메소드 하나만 구현 가능하기 때문.// 여기서 Runnable은 Functional Interface
// 1. 익명 클래스
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("run run~");
}
};
runnable1.run();
// 2. 익명 메소드를 사용해서 표현하는 방법: 람다 표현식
// 익명 클래스 부분에서 뻔한 부분을 지운다.
Runnable runnable2 = () -> System.out.println("run run~");
runnable2.run();
new ~()
: interface type이 명시되어있고 이 타입으로 인스턴스 만들것.@Override
: interface이기 때문에 override해주는 것은 당연함.public void run
: functional interface이기 때문에 추상 메소드가 하나이다. 어떤 메소드인지 이미 알고 있다.()
: 메소드의 인자 부분{~};
: 구현부->
: 선언 부분과 {메소드 구현 부분}을 구분오늘도 모르는 내용 투성이였다. 새로 안 내용들을 TIL에 적기에는 너무 많을 것 같아서 따로 정리를 또 해야겠다.