Languages/Java
[Java] 람다식
조용한고라니
2021. 1. 26. 21:26
반응형
람다식
Programming 언어에서 사용되는 개념으로 익명 함수를 지칭하는 용어이다. 실무적으로 코드의 간결함, 지연 연산을 통한 처리 능력 향상 그리고 기존 순환 관련 코드를 구현하는데 있어 불필요한 부분들을 제거할 수 있다는 점에서 중요하게 다루어진다.
# 장점
- 코드의 간결성
- 효율적인 람다 함수의 사용을 통해 불필요한 루프의 삭제가 가능하고, 함수의 재활용 여지가 커진다.
- 필요한 정보만들 사용하는 방식을 통한 퍼포먼스 향상 - 지연 연산을 지원하는 방식을 통해 효율적 증대를 기대할 수 있다.
# 단점
- 모든 원소를 전부 순회하는 경우 람다식이 좀 더 느리다. (어떤 방법으로 만들어도 최종 출력되는 byte code나 assembly code는 단순 반복문보다 몇 단계를 더 거치게 된다)
- 익명 함수의 특성상 함수 외부의 캡쳐를 위해 캡쳐를 하는 시간제약, 논리제약적인 요소도 고려해야 하며, 디버깅 하시 함수 callstack 추적이 어렵다.
- 람다식을 남용하면 오히려 코드 이해가 어렵다.
# 함수적 프로그래밍
y =f(x) 형태의 함수로 구성된 프로그래밍 기법
- 데이터를 x에 전달하고 결과를 받는 코드로 구성
- 객체지향 프로그래밍 보다는 효율적인 경우
- 대용량 데이터의 처리 시 유리
- 데이터 포장 객체를 생성 후 처리하는 것 보다, 데이터를 바로 처리하는 것이 속도면에서 유리
- 데이터를 병렬 처리하고 취합할 때 객체보다 함수가 유리
- 이벤트 지향 프로그래밍 (이벤트가 발생하면 핸들러 함수 실행)에 적합
- 대용량 데이터의 처리 시 유리
# Java 8부터 함수적 프로그래밍 지원
람다식(Lamda Expressions)을 언어 차원에서 제공
- 람다 계산법에서 사용된 식을 프로그래밍 언어에 접목
- 익명 함수(Anonymous Function)을 생성하기 위한 식
- (타입 매개변수, ...) -> { 실행문; ... }
- f(x) -> y
- 자바에서 람다식을 수용한 이유
- 코드가 간결해지고
- Collection 요소 (대용량 데이터)를 필터링 또는 매핑해서 쉽게 집계 가능
- Java는 람다식을 함수적 인터페이스의 익명 구현 객체로 취급
- 람다식 -> 매개변수를 가진 코드 블록 -> 익명 구현 객체
- 함수적 인터페이스 : 한 개의 메소드를 가지고 있는 인터페이스
- (@FunctionalInterface)
- 이 어노테이션이 달린 인터페이스는 구현해야할 추상 메서드가 하나만 정의된 인터페이스이다.
- 어떤 인터페이스를 구현할지는 대입되는 인터페이스에 달려있다.
Runnable runnable = () -> { ...};
//Runnable 인터페이스는 void run() 메서드 하나만 갖고 있다.
//위 아래 모두 동일한 역할
Runnable runnable = new Runnable() {
public void run() { ...};
};
람다식 기본 문법
# 함수적 스타일의 람다식을 작성하는 방법
(타입 매개변수, ...) -> { 실행문; ...}
(int a) -> { System.out.println(a); }
- 매개 타입은 Runtime시 대입 값에 따라 자동으로 인식하기 때문에 생략 가능
- (a) -> { System.out.println(a); }
- 하나의 매개변수만 있을 경우에는 ( ) 생략 가능
- a -> { System.out.println(a); }
- 하나의 실행문만 있다면 { } 생략 가능
- a -> System.out.println(a)
- 매개변수가 없으면 ()를 써야 함
- () -> { 실행문; ... }
- 반환 값이 있는 경우, return을 사용
- (x, y) -> { return x + y; }
- { }에 return만 있을 경우 { } 생략 가능
- (x, y) -> x + y
@FunctionalInterface
interface Lamda{
int plus(int x, int y);
}
public class LamdaExp {
public static void main(String[] args) {
Lamda lamda = (x, y) -> x + y;
System.out.println(lamda.plus(3, 5));
lamda = (x, y) -> {
x = x * 2;
y = y * 3;
return x + y;
};
System.out.println(lamda.plus(3, 5));
}
}
# References
반응형