[Java] - Lambda Expression은 무엇인가?

Lofo·2021년 4월 29일
0

Java

목록 보기
1/5
post-thumbnail

Functional Interfaces

  • 람다식을 이해하기 전 우리는 functional interface를 알아야합니다. 람다식은 functional interface를 빠르게 구현하기 위한 하나의 방법 중 하나입니다.
  • functional interface는 새로운 개념이 아니라 하나의 abstract method만을 가지고 있는 interface를 칭하는 말입니다.
    - 이렇게 칭하는 이유는 본래 interface의 목적처럼 구현하기 위한 Class의 뼈대나 구성요소를 담아두는 것이 아니라 단지 method를 구현하여 function의 역할만 하기 위해 만들어졌기 때문입니다.

Example

  • interface
interface Comparator<T>
{
	int compare(T o1, To2);
 }
  • Class
class LengthComparator implements Comparator<String>
{
	public int comapre(String first, String second)
    {
    	return first.length() - second.length();
     }
}
...
String[] list = new String[5];
...
Arrays.sort(list, new LengthComparator());
  • 해석
    - Comparator 인터페이스는 원래 정의되어 있는 인터페이스 라이브러리 중 하나입니다. 주로 비교할 때 사용합니다.
    - LengthComparator 클래스는 함수적인 역할만을 위해 정의해 놓은 클래스입니다. 두 개의 문자열을 받아서 서로 비교하고, 그 결과를 int형으로 반환해줍니다.
    - 정의한 클래스는 Arrays.sort()에서 비교할 때 사용하기 위해 하나의 파라미터로 객체를 전달 받습니다.
    - 결론적으로 위 코드에서는 list에 있는 문자열을 문자열의 길이로 정렬하는 기능을 수행합니다.

Function Interface을 이렇게 구현하는 이유

  • 이 예시에서 볼 수 있듯이 LengthComparator클래스는 단지 함수적인 기능을 위해 작성되었음을 알 수 있습니다.
  • 자바에서 이렇게 구현하는 이유는 자바가 함수형 프로그래밍 언어가 아니라 객체지향 프로그래밍 언어이기 때문입니다.
  • 객체지향 언어이기 때문에 파라미터로 단순한 코드 블럭을 넘길 수 없고, 객체의 형태로 전달해야했고, 자바8까지는 이러한 방법으로만 functional interface를 구현해야했다고 합니다.

Lambda Expressions

  • 일반적으로
    - 파라미터와 함께 있는 코드블럭, 즉 이름이 없는 함수입니다.
    - 이 함수는 변수로 저장되거나, 어떤 함수에 파라미터로 전달되거나 실행되기도 합니다.
    • 이러한 역할을 하는 객체를 first-class objects라고 합니다.
  • 자바에서는
    - functional interface의 intance로 됩니다.
    - functional interface를 구현하는 simple한 방법이다.
    - functional interface 객체가 있어야할 곳에는 lambda expression이 사용될 수 있다.

Example

	// 간단한 형태
	Arrays.sort(words, (first, second) -> first.length() - second.length());
    
   	//복잡한 형태
 	(String first, String second) ->
    	{
    		if(first.length() < second.length()) return -1;
        	else if(first.length() > second.length()) return 1;
		else return 0;
        }
	// 파라미터가 없어도 ()은 작성해야한다.
	() -> Toolkit.getDefaultTookit().beep();
    
	// 파라미터 타입을 추론할 수 있으면 생략할 수 있다.
	Comparator<String> comp = (first, second) -> first.legth() - second.length();
    
	// 타입이 추론 가능한 하나의 파라미터는 ()도 생략할 수 있다.
	ActionListener listener = event -> Toolkit.getDefaultToolkit().beep();

Lambda Expressions 실행과정

	Arrays.sort(words, (first, second) -> first.length() - second.length());
  1. 컴파일러는 sort() 메소드에 타입을 추론하면서 매치시킵니다.
	sort(String[] a, Comparator<string> c)
  1. 프로그램을 실행시키게 되면 람다식은 sort()의 Parameter c에 전달됩니다.
  2. Sort()는 String Array인 words의 두 요소를 비교하기 위해 람다식을 실행시킵니다.
	c.compile(a[i], a[j])
    //c에는 람다식으로 작성된 functional interface instance가 전달되고,
    //a는 words가, 두 파라미터에는 words의 두 요소가 들어가게 된다.
profile
Love God, Love People, Love Code.

0개의 댓글