람다식 (lambda expression)

  • 자바에서 함수형 프로그래밍 (functional programming)을 구현하는 방식
  • 자바 8부터 지원
  • 클래스를 생성하지 않고 함수의 호출만으로 기능을 수행

함수형 프로그래밍

  • 순수 함수를 구현하고 호출함으로써 외부 자료에 부수적인 영향을 주지 않고 매개 변수만을 사용하도록 만든 함수
  • 함수를 기반으로 구현
  • 입력 받은 자료를 기반으로 수행되고 외부에 영향을 미치지 않으므로 병렬처리 등에 가능
  • 안정적인 확장성 있는 프로그래밍 방식
  • 동일한 매개변수가 들어왔을 때 동일한 반환값을 리턴함 ( 외부자료를 건드리지 않아 병렬처리를 하더라도 사이드 이펙트가 없음 )

람다식 구현하기

  • 익명 함수 만들기
  • 매개 변수와 매개 변수를 활용한 실행문으로 구현
  • (매개변수) -> {실행문;}
  • 두 수를 입력받아 더하는 add() 함수
int add(int x, int y) {
   return x+y;
}

(int x, int y) -> {return x+y;}
  • 함수 이름 반환 형을 없애고 -> 를 사용
  • {} 까지 실행문을 의미한다.

람다식 문법

  • 매개변수 ( 하나인 경우 ) 자료형과 괄호 생략
str -> {System.out.Println(str);}
  • 매개 변수가 두 개인 경우 괄호를 생략할 수 없음
x, y -> {System.out.Println(x+y);} // 잘못된 형식
  • 중괄호 안의 구현부가 한 문장인 경우 중괄호 생략
str -> System.out.println(str);
  • 중괄호 안의 구현부가 한 문장이라도 return문은 중괄호를 생략할 수 없음
str -> return str.length(); // 잘못된 형식
  • 중괄호 안의 구현부가 반환문 하나라면 return과 중괄호 모두 생략
(x, y) -> x + y // 두 값을 더하여 반환
str -> str.length() // 문자열의 길이 반환

람다식 사용 예제

인터페이스 생성
lambdaTest와 lambdaTest1 은 같은 기능의 메소드를 호출함


람다식을 선언한 인터페이스 ( 함수형 인터페이스 )에 여러 메소드가 있으면 어떻게 될까?

  • 함수형 인터페이스에는 한 메소드만 들어갈 수 있다.
  • @FunctionalInterface 어노테이션 선언
  • 다른 메소드를 선언할 경우 에러 발생

함수형 인터페이스

  • 람다식을 선언하기 위한 인터페이스
  • 익명 함수와 매개 변수만 구현되므로 단 하나의 메서드만을 가져야 한다.
  • 두 개 이상의 메서드인 경우 어떤 메서드의 호출인지 모호해짐
  • @FunctionalInterface 애노테이션
  • 함수형 인터페이스라는 의미, 여러 개의 메서드 선언 시 에러
  • 실제적으로는 객체에 대한 익명 내부 클래스가 생성되며 함수형 인터페이스의 메소드를 구현하는 것임

 


익명 객체를 생성하는 람다식

  • 자바는 객체 지향 언어로 객체를 생성해야 메소드가 호출 됨
  • 람다식으로 메서드를 구현하고 호출하면 내부에서 익명 클래스가 생성됨
  • 람다식에서 외부 메서드의 지역변수는 상수로 처리됨 ( 지역 내부 클래스와 동일 원리 )
StringConcat concat1 = new StringConcat() {
   @Override
   public void makeString(String s1, String s2) {
     System.out.Println(s1+","+s2);
   }
};

인터페이스 구현 / 람다식 사용 / 익명 내부 클래스 사용 3가지 방법이 있음


함수를 변수처럼 사용하는 람다식

프로그램에서 변수를 사용하는 경우

  • 특정 자료형으로 변수 선언 후 값 대입하여 사용 int a = 10;
  • 매개 변수로 전달 int add(int x, int y);
  • 메서드의 반환 값으로 반환 return num;

인터페이스형 변수에 람다식 대입

interface PrintString {
  void showString(String s);
}

s-> System.out.Println(s)
PrintString printString = s -> System.out.Println(s);
printString.showString("hello lambda");

람다식 - 특정 자료형으로 변수 선언 후 값 대입하여 사용하기


람다식 - 매개 변수로 전달


람다식 - 리턴 값으로 반환

'Back-end > java' 카테고리의 다른 글

예외 처리  (0) 2021.06.24
스트림  (0) 2021.06.23
내부클래스  (0) 2021.06.23
컬렉션 프레임워크  (0) 2021.06.22
제네릭 프로그래밍  (0) 2021.06.22

+ Recent posts