반응형
11-08 05:45
Today
Total
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
관리 메뉴

개발하는 고라니

[Java] 람다식 본문

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

히진쓰님의 서버 사이드 기술 블로그

한빛 미디어 - 이것이 자바다.Youtube

반응형

'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