1. 함수형 인터페이스와 람다 표현식 소개


함수형 인터페이스(Functional Interface)

@FunctionalInterface
public interface RunSomething {
    void doIt();
		//void doItAgain(); 

		static void printName(){
        System.out.println("catsbi");
    }
    
    default void printAge(){
        System.out.println("33");
    }
}

⇒ 위 코드를 보면 printName()과 printAge 메소드도 있는데 함수형 인터페이스가 아닐까요? 답은 함수형 인터페이스(Functional Interface)가 맞다 입니다. 중요한건 static 메소드와 default메소드가 있는게아니라 추상 메소드 가 1개만 있어야 한다는 것입니다.

@FunctionalInterface 함수형 인터페이스를 정의할일이 있을때는 인터페이스에 이 어노테이션을 붙혀주면 더 명시적으로 구분할 수 있고 함수형 인터페이스 규칙을 위반하면 컴파일시 에러가 발생하게 됩니다.

어노테이션의 원리는 이 링크를 통해 자세히 알 수 있습니다.

그렇다면 이 함수형 인터페이스를 어떻게 구현하여 사용할까요?

기존의 방법

: 익명 내부 클래스를 만들어 사용.

public class Foo {
    public static void main(String[] args) {
        //익명 내부 클래스(anonymous inner class)
        RunSomething runSomething = new RunSomething() {
            @Override
            public void doIt() {...}
        };
    }
}

자바 8 이후의 방법

람다표현식(Lambda Expressions)을 이용하여 간략하게 구현

public class Foo {
    public static void main(String[] args) {
        RunSomething runSomething = () -> System.out.println("Hello");
    }
}