@FunctionalInterface
public interface Run {
void doIt();
static void printName() {
System.out.println("batman");
}
default void printAge(){
System.out.println("20");
}
}
👏🏻 주로 오해 하는 점이 있다.
위에서 말한 추상 메소드를 딱 하나만 들고 있는 인터페이스 라는 것이다.
위의 코드에서는 메소드가 총 세개가 있다. 하지만 나머지 두개인
static 메소드와 default 메소드는 추상 메소드가 아니기 때문에
위의 interface는 추상메소드가 하나 이다!
🐥 @FunctionalInterface 라는 어노테이션을 붙여주게되면
함수형 인터페이스를 정의할 일이 있을 때는 인터페이스에 이 어노테이션을
붙혀주게 되면 더 명시적으로 구분이 되고 규칙을 위반하게 되면 컴파일시에 에러가 난다.
: 익명 내부 클래스를 만들어서 사용을 했다.
public class Test {
public static void main(String[] args) {
Run run = new Run() {
@Override
public void doIt() {
....
};
}
}
}
: 람다 표현식을 이용해서 간략하게 구현이 가능해졌다.
public class Test{
public static void main(String[] args) {
Run run = () -> System.out.println("Hello World!");
// 예를 들어 여러가지의 행동을 해야 할 경우는
Run run = () -> {
System.out.println("Hello");
System.out.println("World");
};
// 위와 같이 중괄호로 범위를 지정해주면 가능하다.
}
}
일급 객체 : 간단하게 말하자면 함수를 일반 객체 처럼 운용이 가능하다라는 것이다.
변수에 할당하거나 매개변수로 준다거나 함수의 매개변수에 인자로 들어갈 수 있다는 것이다.
이렇기 때문에 람다가 return 의 값이 될 수도 있고 변수에 담아서 사용도 가능하다.
고차 함수(Higher-Order Function)
- 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수 있다. (일급 객체이기 때문에 가능)
순수 함수 : 입력받은 값이 동일한 값일 때 결과가 항시 같아야 한다.
- 사이드 이펙트가 없다.(함수 밖에 있는 값을 변경하지는 않는다)
자바에서는 함수형 프로그래밍을 할 수 있도록 제공되어진 함수형 인터페이스와 람다 표현식이 있고
굳이 함수형 프로그래밍을 안하더라도 사용을 할 수 있지만 이 두가지를 사용하게 되면
순수 함수, 불변성에 대한 고려해야할 것이 있습니다.