본문 바로가기
Web Technologies 🖥️/java

람다(Lambda)란 무엇인가 (feat... 람다식) - JAVA

by dudefromkorea 2024. 1. 21.

"람다(lambda)"

수학과 논리학에서 비롯된 용어로

일반적으로 익명 함수를 의미한다

 

람다의 기본 개념

1. 익명성

람다는 이름이 없고 구현체만 제공하는 함수이다

이로 인해 간결성이 증가되고 단일 사용 목적을

가진 함수를 작성하기에 간편한 이점이 있다

 

주로 간단한 연산이나 다른 함수에

대한 인자 이벤트 헨들러 등에 사용된다

 

2. 클로저

람다는 정의될 때 주변 컨텍스트의 변수를 기억하며

정의된 외부 범위의 변수를 캡처하고

람다가 실행될 때 사용할 수 있는 특성이 존재한다

 

클러저를 통해 더욱 유연하고

표현력이 풍부한 프로그래밍이 가능하다

 

3. 간결한 정의

람다는 함수의 본문을 매우 간결하게 표현하기에

가독성을 향상시키고 복잡한 로직을 간단하게 표현할 수 있다

 

4. 퍼스트 클래스 시민

퍼스트 클래스 시민이란 변수에 할당될 수 있고

다른 함수의 인자나 리턴값으로 사용될 수 있는 엔티티를 의미한다

 

람다는 해당 특성을 바탕으로 함수를 값처럼 취급할 수 있기에

코드의 모듈화와 재사용성이 증가하고 고차 함수의 사용이 가능해진다

 

자바와 람다

JAVA 8부터 도입된 람다식은 간결한

방식으로 익명 함수를 표현할 수 있게 해준다

 

함수형 인터페이스의 인스턴스를 생성하는 표현인 람다식은

주로 스트림 API 와 함께 사용되어 자바의 표현력과 가독성을 크게 향상 시킨다

 

람다식 작성하기

1. 메소드의 이름과 반환 타입 제거

2. 매개변수 선언부와 몸통 {} 사이에 -> 추가

3. return 문을 생략하고 세미콜론 제거

4. 선언된 매개변수 타입 생략

public int returnMax(int a, int b) {
	return a > b ? a : b;
}

		⭣ ⭣ ⭣
             
(int a, int b) -> { a > b ? a : b } 

		⭣ ⭣ ⭣
             
(a, b) -> { a > b ? a : b }

 

 

메소드 -> 람다식 변환 예시

 

 

 

람다식의 예시

매개변수가 없는 람다식

() -> System.out.print("Hello World");

 

한 개의 매개변수를 가진 람다식

(String world) -> System.out.println("Hello " + world);

 

블록을 사용하는 람다식

(String str) -> {
    System.out.println("Start");
    System.out.println(str);
    System.out.println("End");
}

 

쓰레드를 생성하는 람다식

new Thread(() -> System.out.print("Thread started.")).start();

 

리스트의 각 요소를 출력하는 람다식

List<String> items = Arrays.asList("Alpha", "Bravo", "Charlie", "Delta");
items.stream()
     .forEach(item -> System.out.println(item));

 

 

퍼스트 클래스 시민 예시

함수를 변수에 할당하기

// 람다식을 변수에 할당
Function<Integer, Integer, Integer> adder = (a, b) -> a + b;
int sum = adder.apply(10, 20); // 30

 

함수를 다른 함수의 인자로 전달하기

public void processStr(String str, Consumer<String> consumer) {
    consumer.accept(str);
}

MockClass mClass = new MockClass();
mClass.processStr("Hello, World!", s -> System.out.print(s));

 

함수를 다른 함수의 결과로 반환하기

public Supplier<String> getStringSupplier() {
    return () -> "Hello, World!";
}

MockClass mClass = new MockClass();
Supplier<String> supplier = mClass.getStringSupplier();
System.out.print(supplier.get());
728x90
반응형