[JAVA] 람다와 스트림 ( Lambda & Stream ) ②

DongGyu Jung·2022년 4월 26일
0

자바(JAVA)

목록 보기
50/60
post-thumbnail

🏃‍♂️ 들어가기 앞서..

본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 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 () -> {} ;
}

0개의 댓글