🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕
*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.
Functional Interface
)" 단 하나의 추상 메서드 "만 선언된 인터페이스
※
@FunctionalInterface
애너테이션 :
해당 인터페이스는 단 하나의 추상 메서드 선언만 가능한 "함수형 인터페이스"이기 때문에
두 개 이상의 추상메서드가 선언되진 않았는지 컴파일러가 확인해 준다.
정리했다시피
단 하나의 추상 메서드만을 선언한 인터페이스로
해당 람다 섹션에서는
이름이 없는 익명 객체 람다식의
" 이름의 역할 "을 하기 위해 만들어지는 인터페이스라고 생각하면 된다.
// 전에 인터페이스 섹션에서 알아봤듯이
// public abstract 는 생략 가능하다.
@FunctionalInterface
interface MyFunction {
public abstract int max(int a, int b);
}
기존에 알아봤던 대로
한 메서드를 구현한다고 가정했을 때,
위와 같은 인터페이스를
아래와 같이 구현하면 된다.
My function f = new MyFunction() {
public int max(int a, int b) {
return a > b ? a : b ;
}
};
int mx = f.max(10, 15) ;
이 구현을 그대로 람다식 방식으로 바꿔본다면
My function f = (int a, int b) -> a > b ? a : b ; // 이 세미콜론(;)은 참조변수 대입을 하기 때문에 적어야 한다.
int mx = f.max(10, 15) ;
어차피 함수형 인터페이스에는
단 하나의 추상 메서드만 있기 때문에
위처럼 이름없이 람다식으로
이렇게 간단하고 간결하게 사용할 수 있게 된다.
단, 메서드의 선언부가 일치해서 대체할 수 있다.
( 선언부[ 매개변수 타입 / 개수 ] 뿐만 아니라 반환값도 일치한다. )
《 Example 》
@Functionalinterface interface Comparator<T> { int compare(T o1, T o2) ; } ... List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa") ; // 익명 객체 생성 Collections.sort(list, new Comparator<String>() { public int compare(String s1, String s2) { return s2.compareTo(s1) ; } }); // 람다식으로 변환 Collections.sort(list, (s1, s2) -> s2.compareTo(s1));
이름이 없는 람다식을 이제 참조변수를 통해 사용할 수 있는 방법을 알아보았고
더 나아가
메서드의 매개변수의 타입으로 함수형 인터페이스를 활용할 수 있다.
매개변수로
함수형 인터페이스 타입 객체가 들어와
해당 함수 내에서
" 들어온 객체 "의 식
즉, 람다식을 쓰는 방법이다.
@FunctionalInterface
interface MyFunction {
void myMethod() ;
}
...
void aMethod(MyFunction f) {
f.myMethod();
}
...
Myfunction f = () -> System.out.println("람다식을 이용한 myMEthod()");
aMethod(f);
이렇게 되면
매개변수로 들어갈 참조변수에 " 람다식을 구현 "하고
함수형 인터페이스 타입 객체를 매개변수로 받는
일반적인 메서드의 인자로
위 참조변수만 적어주면 람다식을 통해 처리된 결과가 출력되는 것이다.
이 마저도 길다 느껴진다면
아래와 같이 참조변수 없이도 가능하다.
aMethod(() -> System.out.println("람다식을 이용한 myMEthod()"));
이번엔
메서드의 반환타입을 함수형 인터페이스 타입으로 지정하는 활용법이다.
MyFunction myMethod() {
MyFunction f = () -> {} ;
return f ;
}
...
바로 위와 같이 말이다.
return값으로
내부에서 생성한 함수형 인터페이스 타입 참조변수를 반환하는 것을 볼 수 있다.
이 경우 또한 길다 느껴진다면
참조변수 없이 가능하다.
MyFunction myMethod() {
return () -> {} ;
}