본문으로 바로가기

[Java] 람다식 (lambda)

category Programming/Java 2021. 1. 13. 13:21

람다식이란?

프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions) 를 지칭하는 용어이다. 클래스를 생성하지 않고 매개변수와 함수형 인터페이스로 함수형 프로그래밍 을 구현하는 방식이다.

함수형 프로그래밍이란?

  1. 순수 함수를 구현하고 호출
  2. 매개변수만을 사용하도록 만든 함수로 외부 자료에 부수적인 영향이 발생하지 않음
  3. 입력 받은 자료 기반으로 수행하고 외부에 영향을 미치지 않으므로 병렬처리 등에 안정적인 확장성 있는 프로그래밍 방식

람다식의 특징

  1. 코드가 간결 - 불필요한 루프문을 사용하지 않으며 동일한 함수를 재활용
  2. 외부변수를 사용하지 않고 매개변수만으로 구현되기 때문에 다른 외부 변수에 영향을 주지않음
  3. 클래스를 생성하지 않고 매개변와 함수 구현만으로 수행할 수 있는 기능을 제공
  4. 내부적으로 익명의 객체가 생성이 됨

람다식의 문법

  1. 매개 변수 하나인 경우 괄호 생략 가능( 두 개인 경우는 괄호 생략 불가 )
  • str -> {System.out.println(str);}
  1. 중괄호 안의 구현부가 한 문장인 경우 중괄호 생략 가능
  • str -> System.out.println(str);
  1. 중괄호 안의 구현부가 한 문장이라도 return 문은 중괄호 생략 불가
  • str -> return str.length(); //오류
  1. 중괄호 안의 구현부가 반환문 하나라면 return과 중괄호를 모두 생략 가능
  • (x, y) -> x+y // 두 값을 더하여 반환
  • str -> str.length() // 문자열 길이를 반환

람다식 예제

  • Function Interface
package lambda;

@FunctionalInterface // 함수형 인터페이스라는 것을 지정하며 두 개 이상의 함수를 구현할 수 없음  
public interface MyMaxNumber {  
    int getMaxNumber(int x, int Y);  
}
  • Class
package lambda;

public class TestMyNumber {

    public static void main(String[] args) {
        MyMaxNumber max = (x, y)-> (x >= y)?x : y;    // 리턴 값이 하나여서 return , { 동시 생략
        System.out.println(max.getMaxNumber(10, 20)); // 20
    }
}  

람다식 구조

package lambda;

public class TestStringConcat {

    public static void main(String[] args) {

        // Interface를 구현하여 함수 사용
        StringConImpl impl = new StringConImpl();
        impl.makeString("hello", "world");

        //람다식
        StringConcat concat = (s, v)->System.out.println(s+ "," +v);
        concat.makeString("hello", "world");

        //람다식 내부 클래스
        StringConcat concat2 = new StringConcat() {

            @Override
            public void makeString(String s1, String s2) {
                System.out.println(s1+ "," +s2);
            }
        };
        concat2.makeString("hello", "world");
    }
}

람다식을 변수로 사용

package lambda;

interface PrintString{
    void showString(String str);
}

public class TestLambda {

    public static void main(String[] args) {

        PrintString lambdaStr = s->System.out.println(s);
        // 람다식을 매개변수로 전달
        showMyString(lambdaStr); // Test2

        // 람다식을 반환
        PrintString test = returnString();
        test.showString("Test3"); // Test3!!!
    }

    public static void showMyString(PrintString p) {
        p.showString("Test2");
    }

    public static PrintString returnString() {
        return s->System.out.println(s + "!!!");
    }
}

'Programming > Java' 카테고리의 다른 글

[Java] 스트림(Stream)  (0) 2021.01.13