람다식 - (1)

10788 단어 JavaJava

함수형 프로그래밍

장점

대용량 데이터 처리 시 유리

데이터 포장 객체를 생성하여 처리하는 것보다, 바로 처리하는 것이 유리하다.

이벤트 지향 프로그래밍에 적합

반복적인 이벤트 처리의 경우 핸들러 객체보다는 핸들러 함수가 적합하다.

람다식(Lambda Expression)

람다 계산법에서 사용된 식을 프로그래밍 언어에 접목한 것으로, 익명 함수(anonymous function)를 생성하기 위한 식이다. Java는 JDK 1.8부터 람다식을 언어 차원에서 지원한다.

장점

코드가 간결해진다.

메서드가 하나밖에 없는 인터페이스를 메서드의 매개변수로 넣어야 하는 경우 이를 람다식으로 대체하면 코드가 상당히 간결해진다.

데이터 처리가 쉬워짐

컬렉션 요소(대용량 데이터)를 필터링또는 매핑해서 쉽게 집계할 수 있다.

처리 방법

Java의 경우 람다식을 람다식 -> 매개변수를 가진 코드 블록 -> 인터페이스의 익명 구현 객체 순으로 변환하여 취급한다. 어떤 인터페이스를 구현하느냐는 대입되는 인터페이스에 달려있다.

InterfaceA a = (매개변수) -> {
    // 추상 메서드 구현 블록
}; // Runnable 객체 구현

Runnable runnable = () -> {
    // run 메서드는 매개변수가 없으므로 빈 괄호로 처리
    // 블록 안은 run 메서드를 구현하는 코드
};

작성법

기본적인 작성법은 다음과 같다.
(타입 매개변수, ...) -> {실행문}

약식 표현

매개변수의 타입은 런타임 시에 대입값에 따라 자동으로 인식되므로 생략 가능하다.

(a) -> { System.out.println(a); }

매개변수가 딱 하나일 때에는 괄호를 생략할 수 있다. 매개변수가 없으면 생략할 수 없다.

a -> { System.out.println(a); }
() -> { 실행문; }

실행문이 단 하나만 있다면 중괄호를 생략할 수 있다.

a -> System.out.println(a);

중괄호를 생략한 경우 해당 실행문이 반환값으로 처리된다.

(x, y) -> x + y;

반환값이 있는 경우 메서드처럼 return문이 필요하다. 중괄호를 사용하지 않는 경우에는 생략이 가능하다.

(x, y) -> { return x + y; }
(x, y) -> x + y;

함수적 인터페이스(Functional Interface)

딱 하나의 추상 메서드를 가지는 인터페이스를 말한다. 람다식은 함수적 인터페이스에만 대입할 수 있다.

타겟 타입

람다식이 대입되는 변수의 인터페이스 타입을 의미한다. 람다식이 대입되면 익명 구현 객체가 된다.

Runnable runnable = () -> {};

위 예시의 경우 Runnable이 타겟 타입이 된다.

@FunctionalInterface

함수적 인터페이스임을 나타내주는 Annotation으로, JDK 1.8에 추가되었다. 인터페이스가 단 하나의 추상 메서드를 가지는지를 컴파일러가 체크한다. 메서드 개수가 하나가 아니라면 컴파일 오류가 발생한다.

클래스 멤버 사용

클래스 안에서 사용되는 함수형 인터페이스의 경우 람다식 본문에서 클래스 멤버를 사용할 수 있다. 람다식 본문에서의 this 키워드는 인터페이스를 사용하는 객체의 참조이다.

@FunctionalInterface
public interface MyFunctionalInterface {
    public int method();
}

public class ThisExample{
    public int outterField = 10;
    
    class Inner{
        int innerField = 20;
        
        void method(){
            MyFunctionalInterface fi = () -> {
                System.out.println(ThisExample.this.outterField); // 10
                // 외부 객체의 참조를 얻으려면 (클래스명).this를 사용한다.
                System.out.println(this.innerField); // 20
            };
            fi.method();
        }
    }
}

표준 API에서의 사용

Runnable과 같이 표준 API에서 제공하는 함수형 인터페이스가 있다. 이 경우에도 함수형 인터페이스이므로 람다식을 사용할 수 있다. 스레드에서 람다식을 사용하는 경우는 다음 두가지 예시가 있다.

// 예시 1
Runnable runnable = () -> {...};
Thread thread = new Thread(runnable);
thread.start();
 
// 예시 2
Thread thread = new Thread(() -> {...});
thread.start();

좋은 웹페이지 즐겨찾기