람다식

화낼거양's avatar
Nov 20, 2024
람다식
 
💡
람다식(람다 표현식)은 자바 8부터 도입된 함수형 프로그래밍 요소로, 익명 함수(이름이 없는 함수)를 표현하는 간결한 방식입니다. 람다식을 사용하면 코드가 더 간결하고 명확해지며, 특히 컬렉션과 스트림 API를 사용할 때 유용합니다.
 

1. 람다는 인터페이스로 만든다.

람다식은 함수형 인터페이스를 구현하기 위해 사용됩니다. 함수형 인터페이스는 하나의 추상 메서드만 가지는 인터페이스로 정의됩니다. 자바 8 이상에서는 이러한 인터페이스를 람다 표현식으로 구현할 수 있습니다.

2. 인터페이스에는 메서드가 하나만 존재해야 한다.

람다 표현식은 하나의 추상 메서드만 가지는 함수형 인터페이스를 구현합니다. 하지만 함수형 인터페이스는 하나의 추상 메서드 외에도 여러 개의 디폴트 메서드나 정적 메서드를 가질 수 있습니다.

3. 메서드가 인터페이스를 매개변수로 받고 있으면, 행위를 달라고 하는 의미

함수형 인터페이스를 매개변수로 받는 메서드는 실제로 특정 동작이나 행위를 전달하는 의미로 사용됩니다. 이는 높은 수준의 추상화를 통해 행위를 메서드에 전달하는 방식입니다.

4. 람다에서는 매개변수에 타입을 생략 가능하다.

람다식에서는 매개변수의 타입을 생략할 수 있습니다. 컴파일러는 람다식의 문맥으로부터 타입을 추론할 수 있습니다.
 
MyConsumer<String> consumer = (data) -> System.out.println(data); // 또는 MyConsumer<String> consumer = data -> System.out.println(data);
 
 
 
 

람다식의 종류

 

MyConsumer<T>

  • 역할: 입력만 받고 출력이 없는 연산을 수행합니다.
// 입력만 받고 출력이 없는 연산을 수행합니다. @FunctionalInterface public interface MyConsumer<T> { void accept(T data); }
 

MySupplier<T>

  • 역할: 입력 없이 값을 반환(return)합니다.
// 입력 없이 값을 반환(return) @FunctionalInterface public interface MySupplier<T> { T get(); }
 

MyFunction<T, R>

  • 역할: 입력을 받아서 결과를 반환합니다.
// 입력을 받아서 결과를 반환 @FunctionalInterface public interface MyFunction<T,R> { R apply(T t); }
 

MyPredicate<T>

  • 역할: 입력을 받아서 논리값을 반환합니다.
    // 입력을 받아서 논리값을 반환 @FunctionalInterface public interface MyPredicate<T> { boolean apply(T t); }
     
     

    @FunctionalInterface의 주된 역할

    • 함수형 인터페이스로 명시: @FunctionalInterface 어노테이션을 사용하면 해당 인터페이스가 함수형 인터페이스임을 명시적으로 선언할 수 있습니다.
    • 컴파일러 체크: 인터페이스에 추상 메서드가 두 개 이상 존재할 경우 컴파일 오류를 발생시켜, 함수형 인터페이스의 규칙을 위반하지 않도록 합니다.
     
     
     

    위의 예제를 활용한 메인 메서드 및 실행 결과

     
    // 1. 람다는 인터페이스로 만든다. // 2. 인터페이스에는 메서드가 하나만 존재해야 한다. // 3. 메서드가 인터페이스를 매개변수로 받고 있으면, 행위를 달라고 하는 의미 // 4. 람다에서는 매개변수에 타입을 생략 가능하다. public class App { public static void main(String[] args) { // 괄호 안은 매개 변수 자리 MyConsumer<Integer> r1 = (data) -> { System.out.println("소비할 데이터 : " + data); }; r1.accept(1); // 출력 문구 = 소비할 데이터 : 1 // good 문자열을 반환하는 람다식 // return과 중괄호를 생략하여도 정상적으로 작동한다. (r2 와 r3는 같다.) MySupplier<String> r2 = () -> { return "good"; }; MySupplier<String> r3 = () -> "good"; System.out.println(r2.get() + "/" + r3.get()); // 출력 문구 = good/good // 받은 문자열의 길이값을 반환하는 람다식 MyFunction<String, Integer> r4 = (String s) -> s.length(); System.out.println("Length of 'hello': " + r4.apply("hello")); // 출력 문구 = Length of 'hello': 5 // 숫자가 짝수인지 확인하는 람다식 MyPredicate<Integer> r5 = (Integer x) -> x % 2 == 0; System.out.println(r5.apply(3)); // 출력 문구 = false } }
     
     
    notion image
     
     
    Share article

    moohyun