메서드의 필수요소는 다음과 같다.
메서드 요소 : 파라미터, 반환값, 자료형, 로직, 이름
그리고 람다와 메서드참조는, 이 요소들 중 빠진 부분만 채워주는 것일 뿐임을 길게 설명해보겠다.
인터페이스의 종류로는 JDK의 인터페이스, 내가 만든 인터페이스가 있다.
JDK가 제공하는 인터페이스는 Function, Suplier, Predicate, Consumer 등등이 있다. 해당 인터페이스들은 파라미터, 반환값의 유무, 그리고 자료형이 무엇인지 모두 나와있다.
직접 만든 인터페이스는 함수형 인터페이스를 말한다.
@FunctionalInterface 이게 달린 함수형 인터페이스는 메서드를 오직 하나만 가지며, 그 메서드엔 역시 파라미터,반환값, 자료형, 이름이 모두 나와있다.
인터페이스에 5개 중 4개가 나타나있으니, 이제 필요한게 무엇인가? 로직이다.
class A {
// 람다
MyFunction lambda_plus = (a,b) -> a + b;
MyFunction lambda_minus = (a,b) -> a - b;
}
// 함수형 인터페이스
@FunctionalInterface
interface MyFunction {
int calculate(int a, int b);
// 파라미터, 반환값, 자료형, 이름 총 4개가 나타나있다.
}
이제 람다식이 로직만으로 이루어져도 괜찮은 이유를 이해할 수 있다.
인터페이스에 메서드 요소 5개 중 4개가 나와있으니, 남은 로직만 구현해준 것이다.
다음은 메서드참조다.
매서드 참조는 로직도 없고, 그냥 알파벳 나열 뿐이다. 그리고 로직이 없다는건 뭘 의미하는걸까? 로직도 이미 알고있음을 의미한다.
class A {
int cal_plus(int a, int b) {
return a + b;
}
int cal_minus(int a, int b) {
return a - b;
}
}
class B {
A a = new A();
// 메서드 참조
MyFunction reference_plus = a::cal_plus;
MyFunction reference_minus = a::cal_minus;
}
@FunctionalInterface
interface MyFunction {
int calculate(int a, int b);
}
메서드 요소 5개 중, 4개는 인터페이스에 나와있다. 남은 로직은 어디에 있을까? 바로 클래스에 나와있다.
그렇기에 람다에선 직접 적어줬다면,
메서드 참조에서는 이를 "~ 클래스의 ~ 메서드에 나와있습니다" 라고 적어둔 것.
메서드의 요소 : 파라미터, 반환값, 자료형, 이름, 로직