함수형 인터페이스 (2)
함수형 인터페이스 타입의 매개변수와 반환타입
함수형 인터페이스 MyFunction이 아래와 같이 정의되어 있을 때,
@FunctionalInterface
interface MyFunction {
void myMethod(); //추상메서드
}
메서드의 매개변수가 MyFunction타입이면, 이 메서드를 호출할 때 람다식을 참조하는 참조변수를 매개변수로 지정해야한다는 뜻이다.
void aMethod(MyFunction f) { //매개변수의 타입이 함수형 인터페이스
f.myMethod(); //MyFunction에 정의된 메서드 호출
}
...
MyFunction f = () -> System.out.println("myMethod()");
aMethod(f);
또는 참조변수 없이 아래와 같이 직접 람다식을 매개변수로 지정하는 것도 가능하다.
aMethod(() -> System.out.println("myMethod()")); // 람다식을 매개변수로 지정
그리고 메서드의 반환타입이 함수형 인터페이스타입이라면, 이 함수형 인터페이스의 추상메서드와 동등한 람다식을 가리키는 참조변수를 반환하거나 람다식을 직접 반환할 수 있다.
MyFunction myMethod() {
MyFunction f = () -> {};
return f; //이 줄과 윗 줄을 한 줄로 줄이면, return () -> {};
}
람다식을 참조변수로 다룰 수 있다는 것은, 메서드를 통해 람다식을 주고받을 수 있다는 것을 의미한다. 즉, 변수처럼 메서드를 주고받는 것이 가능해진 것이다.
람다식의 타입과 형변환
함수형 인터페이스로 람다식을 참조할 수 있는 것일 뿐, 람다식의 타입이 함수형 인터페이스의 타입과 일치하는 것은 아니다. 람다식은 익명 객체이고 익명 객체는 타입이 없다.
정확히는 타입은 있지만 컴파일러가 임의로 이름을 정하기 때문에 알 수 없음.
MyFunction f = (MyFunction)(() -> {}); //양변의 타입이 다르므로 형변환 필요
->이 형변환은 생략가능하다.
람다식은 이름이 없을 뿐 분명히 객체인데도 Object타입으로 형변환이 불가능함
오직 함수형 인터페이스로만 형변환이 가능하다. 굳이 하려면 이중으로...
(Object)(MyFunction)
Author And Source
이 문제에 관하여(함수형 인터페이스 (2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@parkheajin39/함수형-인터페이스-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)