이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것입니다.
위 사진처럼 abstract가 생략가능한 것을 알 수 있다.
인터페이스 내부임에도 불구하고 static 메서드는 바디가 존재한 채로 정의할 수 있다.
즉, 위의 static이나 default는 같이 있어도 된다. 그리고 인터페이스 위에는 @FunctionalInterface를 붙인다. (스탠다드 라이브러리에 들어있음)
@FunctionalInterface
public interface RunAnything {
void runIt();
static void printName() {
System.out.println("bruce");
}
default void printAge() {
System.out.println("26");
}
}
java.lang에 있는 @FunctionalInterface를 붙이면 함수형 인터페이스라는 걸 명시하는 것이고, 이는 추상메서드 개수에 대해 실수하지 않을 수 있다.
4줄 차지하던 코드를 1줄로 표현할 수 있다.
public class RunAnythingImpl {
public static void main(String[] args) {
RunAnything runAnything = new RunAnything() {
@Override
public void runIt() {
System.out.println("코드 2줄부터는");
System.out.println("아까처럼 1줄로 못 줄입니다");
}
}
}
}
public class RunAnythingImpl {
public static void main(String[] args) {
RunAnything runAnything = () -> {
System.out.println("코드 2줄부터는");
System.out.println("이렇게 줄일 수 있습니다.");
}
};
}
이런 인터페이스가 있고, 이를 구현했다고 하자.
생성한 Object에 매개변수로 1을 넣으면 아래 사진처럼 11이 나와야 한다.
아래 사진처럼 이를 보장해주지 못하는 상황이 발생하거나 그럴 가능성이 있으면 함수형 프로그래밍이라고 보기 어렵다.
자바는 객체지향 언어이기 때문에 runAnything
을 메서드의 파라미터로 전달하거나 return 타입으로 반환하거나, 혹은 변수로 만들어서 사용할 수도 있다.
이런 형태는
일급객체(First class object)
로 사용할 수 있다.
다시 말해서, 자바에서 함수는 특수한 Object이다. Object를 리턴 타입으로 쓰거나 파라미터로 쓰는 게 당연하기 때문에 고차함수도 역시 일급객체가 된다면 가능하다.
고차함수는
함수가 함수를 매개변수로 받을 수 있고, 함수를 반환할 수도 있다.
순수함수란
1.사이드 이펙트, 함수 밖에 있는 값을 변경하지 않고
2.상태가 없다, 함수 밖에 있는 값을 사용하지 않는다.
함수형 인터페이스 (Functional Interface)
람다 표현식 (Lambda Expressions)
여기까지는 함수형 프로그래밍을 하지 않더라도 쓸 수 있는 개념이며, 문법적으로 허용됨
함수형 프로그래밍을 한다면
더 자바, Java 8 - 백기선 강사님 강의를 토대로 정리했습니다.