java - Lambda

이유석·2022년 11월 29일
0
post-thumbnail

Lambda 식

Lambda 란?

Lambda 함수

  • Lambda 함수란 프로그래밍 언어에서 사용되는 개념으로 익명 함수를 지칭하는 용어입니다.

Lambda의 특징

  • 익명 함수 (Anonymous functions) : Lambda 함수는 이름을 갖고있을 필요가 없다.
  • 커링 (Currying) : 2개 이상의 입력이 있는 함수는 최종적으로 1개의 입력만 받는 Lambda 함수로 단순화 될 수 있다. 즉, 일부 인자만 취할 수 있다.

커링 예제

  • 먼저, Lambda 식에서 사용할 2개의 숫자를 입력으로 받고, 해당 숫자를 더해주는 함수를 생성해준다.
class Function {
    public int add_numbers(int x, int y) {
        return x + y;
    }
}
  • 이후, Lambda 식을 통해 구현할 함수형 인터페이스 선언해줍니다.

    함수형 인터페이스 : 구현해야할 메서드가 하나만 있는 인터페이스

@FunctionalInterface // 구현해야할 추상 메서드가 하나만 정의된 인터페이스
public interface Math {

    public int Calc(int first);

}
  • main 메서드에서 Lambda 식을 이용해 추상 메서드를 구현하고, 해당 함수형 인터페이스를 사용해보겠습니다.
public class main {

    public static void main(String[] args) {

        Function function = new Function();

        Math add_4= (first) -> function.add_numbers(first, 4);

        System.out.println(add_4.Calc(4));

    }

}
  • 최종적으로, 하나의 변수만 인자로 받아 4를 더해주는 새로운 함수 add_4 를 Lambda 함수를 사용해 단순화 시켰습니다.

Lambda 장•단점

장점

  • 코드의 간결성 : 불필요한 반복문의 삭제가 가능하며, 복잡한 식을 단순하게 표현할 수 있습니다.
  • 지연 연산 수행 : 지연 연산을 수행하여, 불필요한 연산을 최소화 할 수 있습니다.

    지연 연산 (Lazy Evaluation) : 결과값이 필요할 때 까지 연산을 늦추는 기법

  • 병렬 처리 가능 : 멀티 쓰레드를 활용하여 병렬처리를 사용할 수 있습니다.

단점

  • Lambda 식의 호출이 까다롭습니다.
  • 너무 많이 사용하게 될 경우, 가독성이 떨어질 수 있습니다.

Thread - Runnable 의 run 추상 메서드 예제

Runnable 을 이용하여 Thread를 만들어 실행해보겠습니다.

public class LambdaExam1 {

    public static void main(String[] args) {
        new Thread(new Runnable(){public void run(){
            for(int i = 0; i < 10; i++){
                System.out.println("hello");
            }
        }}).start();
    }   
}
  • Java 는 메서드만 매개변수로 전달할 방법이 없다. 인스턴스만 전달 할 수 있다.
  • 그렇기 때문에, run() 메서드를 가지고 있는 Runnable 객체를 생성하여 전달한다.

메서드만 전달할 수 있다면, 더 편하게 프로그래밍을 할 수 있다.
Lambda 식을 활용해 이를 해결한 코드

public class LambdaExam1 {  
    public static void main(String[] args) {
        new Thread(()->{
            for(int i = 0; i < 10; i++){
                System.out.println("hello");
            }
        }).start();
    }   
}
  • () -> {...} 부분이 Lambda 식이다. 즉, 익명 메서드 이다.
  • JVM 은 Thread 의 생성자를 보고 () -> {} 이 무엇인지 대상을 추론한다.

  • Thread 생성자 api를 보면 Runnable 인터페이스를 받아들이는 것을 알 수 있다.

Lambda 식 기본 문법

  • (매개변수 목록) -> {실행 문} 이 기본 문법이다.

2개의 값을 매개변수로 받아, 비교하여 어떤 값이 더 큰지 구하는 인터페이스

// 함수형 인터페이스 : 구현해야할 메서드가 하나만 있는 인터페이스
@FunctionalInterface
public interface Compare {
	public int compareTo(int value1, int value2);
}

Compare 인터페이스를 사용하는 클래스

  • Compare 인터페이스를 매개변수로 하는 exec 메서드
  • main 메서드에서 Lambda 식 을 활용하여 compareTo 메서드를 구현
public class CompareExam {
	public static void exec(Compare compare) {
    	int k = 10;
        int m = 20;
        int value = compare.compareTo(k, m);
		
        if (value < 0) {
        	System.out.println("m 이 더 큽니다.")
        } else {
        	System.out.println("k 가 더 큽니다.")
        }
    }
    
    public static void main(String[] args) {
    	exec((i, j) -> {
        	return i - j;
        })
    }
}

출력

m이 더 큽니다.
profile
https://github.com/yuseogi0218

0개의 댓글