본문 바로가기
Learning-log/JAVA

[Java] 람다식(Lamda) 개념 및 사용 정리

by why제곱 2023. 6. 20.

1. 람다함수 개념


1) 익명함수를 지칭하는 용어(메소드의 이름 필요 없음)

2) 수학에서 사용하는 함수를 보다 단순하게 표현, 함수를 하나의 식으로 표현

3) 함수형 인터페이스의 인스턴스를 생성하여, 함수를 변수처럼 선언

4) 1급 객체 -> Stream API의 매개변수로 전달 가능

 

2. 람다의 특징


- 람다식 내의 지역변수는 final을 붙이지 않아도 상수로 간주

- 람다식으로 선언된 변수명은 다른 변수명과 중복 불가

- 람다식으로 생성된 순수 함수는 함수형 인터페이스로만 선언 가능

 

 

3. 람다의 장단점


1) 장점

- 코드 간결해짐

- 개발자의 의도가 식에 드러나게 되어 가독성이 높아짐

- 함수를 만드는 과정 없이 한번에 처리해 생산성 높아짐

- 병렬 프로그래밍 용이

 

 

2) 단점

- 람다를 사용하여 만든 무명함수 재사용 불가

- 디버깅 어려움

- 비슷한 함수 중복 생성되어 코드 지저분해질 가능성

- 재귀로 만들 경우 부적합

 

 

 

 

4. 람다 사용법 및 활용


1) 함수 선언

- 괄호와 화살표를 이용해 함수 선언

(매개변수 , ....) -> {실행문 }

 

2) PriorityQueue 에 람다식 활용하기

PriorityQueue<Integer> pq = new PriorityQueue<>((o1,o2) -> {
	int abs1 = Math.abs(o1);
    int abs2 = Math.abs(o2);
    
    if(abs1 == abs2) return o1>o2 ? 1:-1;
    return abs1 - abs2 ;
    
  });

5. 함수형 인터페이스 


람다식은 순수함수이며, Java는 객체 지향 언어이므로 순수함수와 일반 함수를 다르게 취급함. 이를 구분하기 위해 함수형 인터페이스 등장. 

1) 함수형 인터페이스 : 함수를 1급 객체처럼 다룰 수 있게 해주는 어노테이션, 인터페이스에 선언하여 단 하나의 추상 메소드만을 갖도록 제한하는 역할

 

2) 함수형 인터페이스를 사용하는 이유 : Java의 람다식이 함수형 인터페이스를 반환하기 때문

 

3) 함수형 인터페이스 등장으로 함수를 변수처럼 선언할 수 있게 되었고, 코드도 간결하게 작성할 수 있게 됨.

 

4) 함수형 인터페이스의 구현 : 인터페이스 개발, 내부에 1개 뿐인 abstract 함수 선언, @FunctionalInterface 어노테이션 붙이면 됨.

 

5) Java에서 제공하는 함수형 인터페이스

  • Supplier<T>
    • 매개변수 없이 반환값 만을 갖는 함수형 인터페이스
    • T get() 을 추상 메소드로 가짐
  • Consumer<T> 
    • 객체 T를 매개변수로 받아서 사용, 반환값이 없는 함수형 인터페이스
    • void accept(T t) 를 추상 메서드로 가짐
    • andThen 메서드 제공 : 하나의 함수가 끝난 다음 Consumer를 연쇄적으로 이용 가능.
  • Function<T,R>
    • 객체 T를 매개변수로 받아서 처리 후, R로 반환
    • R apply(T t)를 추상메서드로 가짐
    • Consumer와 같이, andThen 제공
    • compose 제공 : 첫번째 함수 실행 이전에 먼저 함수를 실행하여 연쇄적으로 연결
    • identity 함수 : 자기 자신을 반환하는 static 함수
  • Predicate<T> 
    • 객체 T를 매개변수로 받아 처리 후, Boolean으로 반환
    • Boolean test(T t)를 메서드로 가짐

6) 메서드 참조

- 함수형 인터페이스를 람다식이 아닌 일반 메서드를 참조시켜 선언하는 방법

- 일반 메서드를 참조하기 위해서는 아래 3가지 조건 만족 필요

  • 함수형 인터페이스의 매개변수 타입 = 메서드의 매개변수 타입
  • 함수형 인터페이스의 매개변수 개수 = 메서드의 매개변수 개수
  • 함수형 인터페이스의 반환형 = 메서드의 반환형

 

 

 


참고 블로그 

- https://mangkyu.tistory.com/113

- https://khj93.tistory.com/entry/JAVA-%EB%9E%8C%EB%8B%A4%EC%8B%9DRambda%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95