람다 함수

박지윤·2022년 9월 27일
0

Backend

목록 보기
11/12

람다함수란?

람다함수란 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어.
간단히 말하자면 수학에서 사용하는 함수를 보다 단순하게 표현하는 방법이다.

람다의 특징

익명 함수 (Anonymous functions) - 람다 대수는 이름을 가질 필요가 없다.
파라미터가 있는 함수는 괄호 안에 지정하여 사용한다.

람다의 장점

  • 코드 라인 수가 줄어든다.
    ➡ 메소드로 표현된 코드에 비해 확연히 라인 수가 줄어든다.
  • 병렬 프로그래밍이 가능하다.
    ➡ iteration 방식은 반복 대상을 일일히 루프에서 지정하는 반면에, 함수형 프로그래밍에서는 반복 대상을 사용자 코드에서 직접 지정하지 않는다.
  • 람다식으로 바로 실행문을 전달할 수 있다.
    ➡ 자바 메소드로 값이나 객체를 생성하여 전달하던 방식과 달리 람다식에서는 실행문 자체를 람다식으로 전달하여 구현
  • 의도의 명확성
    ➡ 가독성이 높다.

람다의 단점

  • 람다식은 재사용이 불가
    ➡ 일회용 함수 정의가 목적
  • 불필요하게 많이 사용하면 가독성이 떨어진다.
    ➡ 같은 기능의 함수를 여러 번 정의하는 상황이 발생할 수 있다.

람다식의 표현

(매개변수) -> {함수 구현부}
() -> {함수 구현}
  1. 람다식은 화살표(->)를 사용한다.
  2. 매개변수가 하나일 경우 매개변수를 생략할 수 있고,
    작성할 실행문이 단일일 경우 괄호({})를 생략할 수 있다.
  3. 단, return 식의 단일 실행문의 경우 괄호를 생략할 수 없다.

📚 예시

//정상적인 유형
() -> {}
() -> 1
() -> {return 1;}

(int x) -> x+1
(x) -> x+1
(int x) -> {return x+1;}
x -> {return x+11}

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

//잘못된 유형
//선언된 type과 선언되지 않은 type을 같이 사용할 수 없다.
(x, int y) -> x+y
(x, final y) -> x+y

🏃‍♀️ 기존 자바 문법

new Thread(new Runnable() {
	@Override
    public void run() {
    	System.out.println("Welcome!!");
    }
}).start();

🏃‍♀️ 람다식 문법

new Thread(() -> {
	System.out.println("Welcome!!");
}).start();

함수형 인터페이스

@FunctionalInterface
Functional Interface는 일반적으로 '구현해야 할 추상 메소드가 하나만 정의된 인터페이스'를 가리킨다.

//구현해야 할 메소드가 한 개이므로 Functional Interface.
@FunctionalInterface
public interface Math {
	public int plus(int first, int seconde);
}

//구현해야 할 메소드가 두 개이므로 Fucntional Interface가 아님.
@FunctionalInterface
public interface Math {
	public int plus(int first, int second);
    public int minus(int first, int secode);
}

📚 함수형 인터페이스 람다 사용 예제

🏃‍♀️ 함수형 Interface 선언

@FunctionalInterface
Interface Math {
	public int Calc(int first, int second);
}

🏃‍♀️ 추상 메소드 구현 및 함수형 인터페이스 사용

public static void main(String[] args) {
	 Math plusLambda = (first, second) -> first + second;
     System.out.println(plusLambda.Calc(4,2));
     
     Math minusLambda = (first, second) -> first - second;
     System.out.println(minusLambda.Calc(4,2));
}

🏃‍♀️ 실행결과

6
2

Java에서 지원하는 java.util.function 인터페이스

IntFunction<>R
int 값의 인수를 받아들이고 결과를 생성하는 함수를 나타낸다.

🏃‍♀️ 사용 예제

IntFunction intSum = (x) -> x+1;
System.out.println(intSum.apply(1));

🏃‍♀️ 실행결과

2

BinaryOperator<>T
동일한 유형의 두 피연산자에 대한 연산을 나타내며, 피연산자와 동일한 유형의 결과를 생성한다.

🏃‍♀️ 사용 예제

BinaryOperator stringSum(x,y) -> x+" "+y
System.out.println(stringSum.apply("Welcome", "Hello"));

🏃‍♀️ 실행결과

Welcome Hello

Stream API

📌 Stream 이란?
다양한 데이터를 표준화된 방법으로 다루기 위한 라이브러리이다.

exmaple.stream().filter(x->x<2).count

stream() : 스트림 생성
filter : 중간 연산(스트림 변환), 연속 사용 가능
count : 최종 연산(스트림 사용), 마지막에 단 한번만 사용 가능

✔ Stream의 특징

  • 데이터를 변경하지 않는다
  • 일회용이다
  • 지연 연산을 수행한다
  • 병렬 실행이 가능하다

0개의 댓글