람다식

수호천사임다·2024년 10월 16일

자바

목록 보기
11/15

람다식이란 ?

  • 람다식은 메서드를 하나의 식(expression)으로 표현한 것
    • 객체 지향 언어보다는 함수 지향 언어에 가깝다.
    • 메서드를 간략하면서도 명확한 식으로 표현할 수 있도록 해준다.
    • 메소드를 람다식으로 표현하면 메서드의 이름 및 반환 값이 없어지므로 익명 함수 라고도 한다.
    • 람다식의 형태는 매개변수를 가진 코드 블록이지만 런타임 시에는 익명 구현 객체를 생성한다.
  • 하나의 추상 메소드를 가진 인터페이스는 람다식 사용이 가능하다.
Runnable t = new Runnable() {
	public void run() {
    	// 코드
    }
}

위 코드를 람다식으로 표현하면

Runnable t = () -> { //코드 "};

람다식 작성 형식

(타입 매개변수 [, ...]) -> { 실행문; ...};

  • 반환 값이 있는 메서드의 경우 return 대신 하나의 식(expression)으로 대신할 수 있다.
    (a, b) -> { return a+b;}; 처럼 return만 존재하는 경우
    (a, b) -> a + b;로 표현 가능
  • 람다식에 선언된 매개변수 타입은 추론이 가능한 경우 생략 가능.(대부분 생략가능)
  • 매개변수가 하나인 경우 ()를 생략할 수 있다.
  • 매개변수가 없거나 두개 이상인 경우에는 ()를 생략할 수 없다.
  • {} 안 문장이 하나인 경우 {}를 생략할 수 있다.

람다식 작성을 위한 규칙

  1. 인터페이스
  2. 인터페이스 안에 메서드 하나만 존재해야 람다식 가능
  • @FunctionalInterface을 사용해서 람다식을 위한 함수형 인터페이스를 지정한다. 메서드가 두개 이상 되면 컴파일 오류 발생.

람다는 익명클래스처럼 Ex02_Lambda$1.class 클래스가 만들어지지 않는다.

@FunctionalInterface // 람다 표현식이 불가능하면 에러 발생
interface User3 {
  void disp(int a);
}

주요 함수적 인터페이스

Consumer

  • 컨수머는 매개 변수 값이 있고, 리턴 값이 없는 추상 메소드를 가진 인터페이스
  • void accept()

Supplier

  • 서플라이어는 매개 변수 값은 없고, 리턴 값이 있는 추상 메소드를 가진 인터페이스
  • T get()

Function<T, R>

  • 매개 변수 값이 있고, 리턴 값도 있는 추상 메소드를 가진 인터페이스
  • R apply(T t)

IntBinaryOperator,LongBinaryOperator, DoubleBinaryOperator, ...

  • 매개 변수 값이 있고, 리턴 값도 있는 추상 메서드를 가진 인터페이스. 주로 매개 변수 값을 연산하고 결과를 리턴
  • T apply()

Predicate

  • 프레더케이트는 매개 변수 값이 있고, 리턴 타입은 boolean인 추상 메소드를 가진 인터페이스
  • boolean test
package ch17.unit01;

import java.util.function.*;

public class Ex07 {

  public static void main(String[] args) {
    // 표준 API로 제공하는 함수적 인터페이스

    // 매개변수가 있고, 리턴 값이 없는 추상 메서드
    Consumer<Long> c =  t -> System.out.println(t);
    c.accept(100L);


    // 매개변수가 없고, 리턴값이 존재하는 추상 메서드
    IntSupplier i = () -> (int) (Math.random() * 10) + 1;
    System.out.println(i.getAsInt());

    Supplier<Integer> i1 =  () -> (int) (Math.random() * 10) + 1;
    System.out.println(i1.get());

    // 매개변수가 두개인 경우
    BiConsumer<String, String> b = (t, u) -> System.out.println(t + " : " + u);
    b.accept("서울", "대한");

    // Function<T, R> 매개변수(T)가 있고, 리턴값(R)이 있는 추상 메서드
    Function<String, Integer> f = (s) -> Integer.parseInt(s);
    System.out.println((int) f.apply("100"));
  }
}

메서드 참조

  • 메서드를 간결하게 지칭할 수 있는 방법으로 람다식이 하나의 메서드만 호출하는 경우 메서드 참조를 이용하여 람다식을 간략히 할 수 있다.
  • 이미 존재하는 이름을 가진 메서드를 람다로써 사용할 수 있도록 참조하는(가리키는) 역할을 한다.
  • 메서드 참조는 메서드를 참조해서 매개 변수의 정보 및 리턴 타입을 알아내어, 람다식에서 불필요한 매개 변수를 제거하는 것이 목적이다.
  • 메서드 참조는 메서드명 앞에 구분자(::)를 붙이는 방식으로 사용

정적 메서드 참조

클래스명::메서드명

인스턴스 메서드 참조

객체명::메서드명

  • 메서드 참조를 사용할 때는 반드시 함수형 인터페이스 사용.
  • 인터페이스는 메서드 시그니처를 명시
package ch17.unit02;

import java.util.function.BiFunction;

public class MethodReference {

  public static void main(String[] args) {
    String s;

    s = String.valueOf(100);
    System.out.println(s + "n");

    // 람다식
    Test1 t1 =  (num) -> String.valueOf(num);
    s = t1.convert(150);
    System.out.println(s + "\n");

    // 메서드참조
    Test1 t2 = String::valueOf;
    s = t2.convert(150);
    System.out.println(s + "\n");
  }
}

interface Test1 {
  String convert(Integer num);
}

0개의 댓글