Language/Java

람다식(Lambda)과 함수형 인터페이스(fuctional interface)

지팡구 2022. 1. 23. 23:55

1) 람다 표현식(lambda expression)

메소드를 하나의 식으로 표현한 것으로 익명 함수(anouymous fuctions)를 지칭하는 용어이다. 일반적으로 사용하는 함수를 단순하게 표현하는 방법이다.

 

2)람다의 특징

람다식은 익명 함수의 특징으로 이름을 가질 필요가 없다

두 개 이상의 입력이 있는 함수는 최종적으로 1개의 입력만 받는 람다식으로 단순화 가능하다. 람다식으로 선언된 함수는 1급 객체이기 때문에 Stream API의 매개변수로 전달이 가능해진다. 

 

3) 람다의 장점과 단점

장점 단점
1. 코드의 간결함 및 가독성 증가.
람다를 통해 불필요한 코드를 삭제할 수 있으며 이로 인해 단순하게 코드를 표현할 수 있음.

2. 지연연산 수행
람다는 지연연산을 수행 함으로써 불필요한 연산을 최소화 할 수 있음.

3. 병렬처리 가능
멀티 쓰레드를 활용해 병렬처리가 가능.

4. 생산성 향상
함수를 만드는 과정 없이 한 번에 처리가 가능함
1. 람다식의 호출이 까다로움

2. 람다 스트림 사용 시 단순 for문, while문의 사용 시 성능이 떨어짐

3. 불필요한 사용으로 가독성의 저하
(비슷한 함수가 중복생성 되 코드가 지저분해질 수 있음.)

4. 람다를 사용하면서 만든 무명함수는 재사용이 불가능함.

5. 재귀로 만들경우 부적합.

 

1) 기존 방식의 함수 선언 및 람다식으로 변환
<기존 방식>
public String food(){
	return "hungry";
}

<람다 방식>
(매개변수,)->(실행문)

()->"hungry"

4) 람다식을 작성할 때 주의할 점

1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있습니다.

2. 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있습니다.

3. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있습니다.

(이때 세미콜론(;)은 붙이지 않음)

4. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없습니다.

5. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 됩니다. 

(이때 세미콜론(;)은 붙이지 않음)

 

1. 함수형 인터페이스

함수형 인터페이스람다식을 하나의 변수에 대입할 때 참조하는 참조 변수의 타입을 말한다. 자바에서는 일반 함수와 순수 함수를 다르게 취급한다. 때문에 함수를 1급 객체처럼 다룰 수 있게 해주는 어노테이션(@)으로 인터페이스에 선언해 단 하나의 추상 메서드만을 갖도록 제한하는 역할을 하는데, Java의 람다식이 함수형 인터페이스를 반환하기에 사용한다.

 

여기서 1급 객체란 무엇일까?

1급 객체는 변수나 데이터 구조 안에 담을 수 있으며, 파라미터로 전달할 수 있다. 또한 반환값으로 사용할 수 있으며 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.

 

 

@FuctionalInterface 어노테이션을 사용한다.

해당 어노테이션을 인터페이스의 선언 앞에 붙이면, 컴파일러는 해당 인터페이스를 함수형 인터페이스로 인식한다.

이렇게 명시된 함수형 인터페이스에 두 개 이상의 메서드가 선언되면 오류가 발생한다.

 

1) 함수형 인터페이스의 선언
@FunctionalInterface
public interface Log {
    int min(int x, int y);
}


public class Main {
     public static void main(String[]args){
          Log kim = (x,y)->x<y? x:y;
          System.out.println(kim.min(4,5));
     }
}

 

함수형 인터페이스와 람다식 그리고 스트림API에 대해 더 알아볼 필요가 있다