TIL) Java - 람다식(Lambda Expression)

oatraspberry·2022년 12월 22일
post-thumbnail

람다식

  • 익명의 함수(이름이 없는 함수)를 지칭하는 용어

  • 자바에서 함수적 프로그래밍 지원 기법

  • 코드의 간결화 및 병렬처리에 강함 (Collection API 성능 효과적 개선(Stream))

  • 자바의 함수적 프로그래밍(람다식) 함수(=기능) 사용
    -> 함수형 인터페이스의 메서드만 람다식 표현 가능

기본 용어

  • 함수(function): 기능, 동작을 정의
  • 메서드(method): 클래스 또는 인터페이스 내부에서 정의된 함수
  • 함수형 인터페이스(funtional Interface): 내부에 단 1개의 추상메서드만 존재하는 인터페이스
interface A {
	public abstract void abc();
}

자바는 객체지향프로그램으로서 모든 함수는 클래스/인터페이스 내부에만 존재 가능. (클래스 내부의 함수=메서드)

장점

  1. 코드의 간결성 - 람다를 사용하면 불필요한 반복문의 삭제가 가능하고 복잡한 식을 단순하게 표현할 수 있다.
  2. 자연연산 수행 - 람다는 지연연상을 수행함으로써 불필요한 연산을 최소화 할 수 있다.
  3. 병렬처리 가능 - 멀티쓰레드를 활용하여 병렬처리를 사용할 수 있다.

단점

  1. 람다식의 호출이 어렵다.
  2. 람다 stream 사용시, 단순 for문 혹은 while문 사용시 성능이 떨어진다.
  3. 불필요하게 너무 사용하게 되면 오히려 가독성이 떨어질 수 있다.

메서드(함수) -> 람다식 변환 방법

인터페이스의 구현 메서드

// 메서드(함수)
리턴타입 메서드 이름(입력매개변수) {
	// 메서드 내용
}

// 람다식
(입력매개변수) -> { // -> : 람다식 기호
	// 메서드 내용 
}

람다식의 약식표현

A a = () -> {System.out.rpintln("테스트");};
// 익명이너클래스 표현과 람다식의 경우에만 중괄호{} 다음에 세미콜론(;)이 옴.
A a = () -> System.out.println("테스트");
// 실행문이 하나인 경우 중괄호 생략 가능

람다식 활용 3가지

  1. 익명이너클래스 내 구현 메서드의 약식(람다식) 표현(함수형 인터페이스만 가능) -> 추상 메소드 구현하기
// 함수형 인터페이스
interface A {
	void method1();
}

// 익명 이너클래스 활용
A a = new A() {
	public void method1() {
    	...
   	}
}

// 람다식 활용
A a = () -> { ... };
// 함수형 인터페이스
interface A {
	double method4(int a, int b);
}

// 익명 이너클래스 활용
A a = new A() {
	public double method4(int a, double b) {
    	return ...
    }
};

// 람다식 활용
A a = (int a, double b) -> { return ... };
  1. 인스턴스 메서드 참조 Type1 -> 이미 정의된 인스턴스 메서드 참조
    인스턴스 메서드 참조1 - 클래스 객체::인스턴스메서드 이름
    TIP) 인스턴스 메서드 참조 Type1을 위해서는 리턴타입과 매개변수가 동일하여야 함
A a = new A() {
	public void abc() {
    B b = new B();
    b.bcd(); // abc()메서드 = B객체의 bcd()메서드
    }
};

A a = () -> {
	B b = new B();
    b.bcd(); // abc()메서드 = B객체의 bcd()메서드
};

B b = new B();
A a = b::bcd;
  1. 배열 생성자 참조 -> 배열의 new 생성자를 참조하는 경우 -> interface 메서드의 리턴타입=배열객체
    배열타입::new
    TIP) 배열 생성자 참조를 위해서는 인터페이스 메서드의 매개변수로 배열의 길이를 전달한다.

클래스 생성자 참조 -> 클래스의 new 생성자를 참조하는 경우 -> interface 메서드의 리턴타입=클래스객체
클래스이름::new
TIP) 클래스 생성자 참조를 위해서는 인터페이스 메서드의 매개변수에 따라 생성자 선택

profile
개발자가 될테야

0개의 댓글