JAVA

[Java] 람다식(Lambda)이란

혀내 2023. 7. 6. 14:28
반응형

람다식이란

람다식 또는 람다 함수메서드로 전달할 수 있는 익명 함수를 단순화한 것입니다. 람다식을 이용하면 코드가 간결해지고, Lazy Initialization을 통해 성능을 향상시킬 수 있습니다. 자바에서 함수형 프로그래밍 기법을 위해 제공하는 기능 중 하나로 함수를 일급 객체로 다룰 수 있도록 하여 매개 변수로 함수 자체를 전달할 수 있습니다.

 

 

람다식의 생김새는 다음과 같습니다.

(람다 파라미터) -> { 람다 바디 }

 

 

람다식을 사용하면 함수의 선언을 아래처럼 한 줄로 작성할 수 있습니다.

// 일반적인 메소드 선언
public int add(int a, int b) {
	return a+b;
}

// 람다식
(a, b) -> a + b;

 

 

 

 

람다식의 특징

1. 익명: 보통의 메서드와 달리 이름이 없다.

2. 함수: 메서드처럼 특정 클래스에 종속되지 않고, 파라미터 리스트, 바디, 반환값, 가능한 예외 리스트를 포함한다.

3. 전달: 람다식을 메서드 인수나 변수로 사용할 수 있다.

4. 간결성: 익명 클래스처럼 자질구레한 코드를 구현할 필요가 없다.

 

 

 

 

 

함수형 인터페이스

 오직 하나의 추상 메서드만을 갖고 있는 인터페이스함수형 인터페이스라고 부릅니다. 대표적인 자바 API의 함수형 인터페이스로 Comparator, Runnable 등이 있습니다. 함수형 인터페이스는 하나의 추상 메서드만을 가져야 하며 @FunctionalInterface 어노테이션이 있어야 합니다. 람다식으로 함수형 인터페이스의 추상 메서드 구현을 직접 전달할 수 있어 람다식의 전체 표현식을 함수형 인터페이스의 인스턴스로 취급할 수 있습니다.

 

 

함수형 인터페이스의 예시로 직접 만든 Adder 함수형 인터페이스를 살펴보겠습니다.

@FunctionalInterface
public interface Adder {
    int add(int a, int b);
}

// 사용 방법
(int a, int b) -> Adder.add(a, b);

 

 

 

함수형 프로그래밍과 인터페이스에 대한 보다 자세한 내용은 아래 글을 참고해 주세요.

 

[Java] 함수형 프로그래밍(Functional Programming, FP) 알아보기

함수형 프로그래밍이란함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. - 위키페디아 보통은 프로그래밍

aeliketodo.tistory.com

 

 

 

 

 

 

Java의 기본 함수형 인터페이스 종류

java.util.function 패키지에 자바에서 기본적으로 제공되는 함수형 인터페이스들이 정의되어 있습니다. 가장 기본적인 형태는 아래 4가지입니다.

 

- Supplier<T>

- Consumer<T>

- Function<T, R>

- Predicate<T>

 

 

 

Supplier<T>

매개 변수 없이 반환값만 있는 함수형 인터페이스입니다. T get() 추상 메서드를 가집니다.

@FunctionalInterface
public interface Supplier<T> {
    T get();
}

 

사용 방법

Supplier<String> supplier = () -> "Apple";
System.out.println(supplier.get());

 

 

 

 

 

Consumer<T>

객체 T를 매개변수로 받으며, 반환값이 없는 함수형 인터페이스입니다. T accept(T t) 추상 메서드를 가집니다.

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
    
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

 

사용 방법

Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("Hyeonae");

 

 

 

 

Function<T, R>

 객체 T를 매개변수로 받아 주어진 일을 수행한 다음 R로 반환하는 함수형 인터페이스입니다. R apply(T t) 추상 메서드를 가집니다.

 

@FunctionalInterface
public interface Function<T, R> {

    R apply(T t);
    
    ...
}

 

사용 방법

Function<Integer, Integer> function = i -> i * i;
int square = function.apply(5);

 

 

 

 

Predicate<T>

객체 T를 매개변수로 받아 boolean을 리턴하는 함수형 인터페이스입니다. boolean test(T t)를 추상 메서드로 갖습니다.

 

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
    
    ...
}

 

사용 방법

Predicate<Apple> predicate = (Apple apple) -> { apple.getColor().equals("GREEN") };
predicate.test(new Apple("GREEN"));

 

 

 

람다식의 자유 변수

람다는 인스턴스 변수와 정적 변수를 자유롭게 캡쳐해 자신의 바디 안에서 참조할 수 있습니다. 이 때 지역 변수는 명시적으로 final로 선언되어 있어야 하거나 실질적으로 final로 선언된 변수와 똑같이 사용되어야 합니다. 즉, 람다 표현식은 한 번만 할당할 수 있는 지역 변수만 캡쳐할 수 있습니다.

 

 인스턴스 변수는 힙에 저장되는 반면에 지역 변수는 스택에 위치합니다. 만약 람다가 스레드에서 실행된다면 변수를 할당한 스레드가 사라져 변수 할당이 해제되었는데도 람다를 실행하는 스레드에서는 해당 변수에 접근하려 할 수 있습니다. 그러므로 자바는 원래 변수에 접근하지 않고, 자유 지역 변수의 복사본을 사용하며 따라서 복사본의 값은 바뀌지 않아야만 합니다.

 

 

 

 

 

메서드 참조

메서드 참조를 통해 익명 함수를 더 간결하게 표현할 수 있습니다. 메서드 참조에는 ' :: ' 라는 기호가 사용됩니다. 메서드 참조는 아래의 세 가지 유형으로 구분됩니다.

 

1. 정적 메서드 참조

// 메서드 참조 X
Function<String, Integer> f = String str -> Integer.parseInt(str);

// 메서드 참조 O
Function<String, Integer> f = Integer::parseInt;

 

2. 다양한 형식의 인스턴스 메서드 참조

// 메서드 참조 X
Function<String, Integer> function1 = str -> str.length();

// 메서드 참조 O
Function<String, Integer> function2 = String::length;

 

3. 기존 객체의 인스턴스 메서드 참조

Apple apple = new Apple("GREEN");

// 메서드 참조 X
Supplier<String> s1 = (Apple apple) -> apple.getColor();

// 메서드 참조 O
Supplier<String> s2 = apple::getColor;

 

 

 

생성자 참조

 마치 정적 메서드 참조처럼 클래스 명과 new 키워드를 이용해 기존 생성자의 참조를 만들 수 있습니다.

/// 생성자 참조 X
Supplier<Apple> c1 = () -> new Apple();


// 생성자 참조 O
Supplier<Apple> c2 = Apple::new;
Apple a1 = c2.get();

 

 

 

 

 

 

참고 자료:

https://mangkyu.tistory.com/113

https://hbase.tistory.com/78

 

 

 

모던 자바 인 액션 - YES24

자바 1.0이 나온 이후 18년을 통틀어 가장 큰 변화가 자바 8 이후 이어지고 있다. 자바 8 이후 모던 자바를 이용하면 기존의 자바 코드 모두 그대로 쓸 수 있으며, 새로운 기능과 문법, 디자인 패턴

www.yes24.com

 

반응형