Hyunebee

람다식 본문

Java/Java의 정석

람다식

Hyunebee 2022. 3. 17. 10:21

람다식

쉽게 말해서 메서드를 하나의 식으로 표현한 것이다.

Arrays.setAll(arr, (i) -> (int)(Math.random() * 5)+1);

이런식으로 보다 간단하게 사용할 수 있다. 

 

람다식의 작성은

 

기존

반환타입 메서드이름(매개변수 선언){

-------------------내용-----------------

}

 

람다식

반환타입 메서드이름(매개변수 선언){

-------------------내용-----------------

}

 

함수형 인터페이스

자바에서 모든 메소드는 클래스 내에 포함되어야 하는데 람다식은 어떤 클래스에 포함될까?? 

사실 람다식은 메소드가 아니라 익명 클래스 객체이다.  우리는 이 익명객체를 참조변수에 대입할 수 있다. 

대신 조건이 있다. 참조형이니 클래스와 인터페이스가 가능하고 람다식과 동등한 메서드가 정의되어 있어야 한다. 

 

하나의 메소드가 선언된 인터페이스를 정의해서 람다식을 다루는 것은 기존의 자바의 규칙들을 어기지 않으면서도 자연스럽다. 그래서 인터페이스를 통해서 람다식을 다루기로 햇으며 람다식을 다루기 위한 인터페이스를 함수형 인터페이스라고 부른다. 단 여기서도 조건이 있다,. 함수형 인터페이스의 메소드와 람다식은 항상 1:1을 이루어야 한다.  

자바에서는 위의 조건을 확인하는 어노테이션인 @Functionalinterface를 지원하고 있다. 

 

람다식의 형변환 

위에서 말했듯이 우리는 함수형 인터페이스로 람다식을 참조할 수 있다. 하지만 람다식의 타입이 함수형 인터페이스의 타입과 일치함을 보장하지는 않는다. 

 

람다식의 외부참조

@FunctionalInterface
interface MyFunction {
    void myMethod();
}

class Outer {
    int val=10;    // Outer.this.val

    class Inner {
        int val=20;    // this.val

        void method(int i) {  //   void method(final int i) {
            int val=30; // final int val=30; 람다식 내에서 참조하는 지역변수는 상수로 간주
//       i = 10;      // 에러. 상수의 값을 변경할 수 없음.

            MyFunction f = () -> {
                System.out.println("             i :" + i);
                System.out.println("           val :" + val);
                System.out.println("      this.val :" + ++this.val);
                System.out.println("Outer.this.val :" + ++Outer.this.val);
            };

            f.myMethod();
        }
    } // Inner클래스의 끝
} // Outer클래스의 끝

class LambdaEx3 {
    public static void main(String args[]) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.method(100);
    }
}

 

java.util.function package

함수형 인터페이스 메서드 설명
Supplier<T> T get() -> T 매개변수는 없고, 반환값만 있다. 
Consumer<T> void accept(T t) 매개변수만 있고 반환값이 없음
Function<T> R apply(T t) 하나의 매개변수를 받아서 결과를 반환
Predicate<T> boolean test(T t) 하나의 매개변수와 boolean의 반환 

자주 사용하는 4가지 함수형 인터페이스이고 이것들을 파생한 인터페이스들이 존재한다. 

'Java > Java의 정석' 카테고리의 다른 글

Lambda  (0) 2022.03.30
쓰레드의 실행과 제어  (0) 2022.03.15
싱글 쓰레드 멀티 쓰레드  (0) 2022.03.15
Thread  (0) 2022.03.13
Enum  (0) 2022.03.12