반응형
12-24 00:25
- Today
- Total
Link
개발하는 고라니
[Java] 람다식 본문
반응형
람다식
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
반응형
'Languages > Java' 카테고리의 다른 글
[Java] 클래스와 객체 (0) | 2021.03.01 |
---|---|
[Java] 우선순위 큐(Priority Queue) (0) | 2021.01.28 |
[Java] StringTokenizer (0) | 2021.01.23 |
[Java] Stream (0) | 2020.12.30 |
[Java] 'Jsoup'을 이용한 Java 크롤링 (0) | 2020.12.14 |
Comments