자바 람다식(Lamda) | 자바 입문강좌 52

자바 람다식(Lamda)

람다식(Lambda Expression)은 자바에서 함수형 프로그래밍을 지원하는 기능입니다. 변수에 어떤 값이 들어있는 것은 식별자로 변수의 메모리 주소에 접근할 수 있다는 뜻입니다. 배열과 객체에서는 이 뜻이 좀더 확장되죠.

그렇다면 함수는 어떨까요? 함수에도 메모리 주소가 할당되있습니다. 람다식은 함수(실행코드)의 주소를 사용하여 C언어 같은 함수 스타일의 프로그래밍을 작성할 수 있습니다.

람다식을 잘 사용하면 간결한 코드를 만들 수 있습니다.

아래의 코드는 람다식 예제입니다.

비교를 위해 static 메소드를 구현했습니다. 인스턴스가 필요없는 static 의 성질도 함수와 비슷해 보입니다만, 당연히 함수형 람다식과는 다릅니다.

람다식을 구현하기 위해서 우선 함수형 인터페이스를 만들어 줍니다. 그 다음 추상 메소드를 만들어 주고 main 함수에서 람다식을 정의합니다. 함수형 인터페이스에서는 메소드가 하나만 허용됩니다.

람다식은 매개변수만 사용하여 만드는 함수이기 때문에 사용법이 직관적입니다. 처음에는 ‘엥? 이게 뭐지’ 라는 생각이 들지만 사용할 수록 이해가 됩니다.

public class Main {
    public static void main(String[] args) {
        System.out.println("-- square(5): " + square(5));
//        define lamda
        MyLamda sqr = (x -> x*x);
        System.out.println("-- lamda expression: " + sqr.mySquare(7));
    }
    static int square(int x){
        return x*x;
    }
}
@FunctionalInterface
interface MyLamda{
    int mySquare(int x);
//    메소드는 하나만 허용됨
//    int add(int x, int y);
}
-- square(5): 25
-- lamda expression: 49

매개변수가 없는 람다식도 만들 수 있습니다.

() -> 에서 ( ) 는 함수의 ( ) 매개변수가 들어가는 자리입니다. ( ) 를 비워두면 매개변수도 없는 것 입니다.

// main 함수에서
        
ALambda myLam = () -> { System.out.println("Lambda Test"); };
myLam.show();

// 인터페이스 정의

interface ALambda{
    void show();
}

다음 예제는 문자열 예제입니다. 매개변수를 두개 받아서 사용합니다.

public class Main {
    public static void main(String[] args) {

        String str1 = "My String";
        String str2 = "plus String";
        StringCon con1 = (a, b) -> System.out.println("(" + a + "), (" + b + ")");
        con1.myString(str1, str2);
    }
}
interface StringCon{
    void myString(String str1, String str2);
}
(My String), (plus String)

다음 방식은 함수형 인터페이스를 static 메소드에 매개변수로 넘겨줍니다. 람다식을 응용하여 좀더 복잡한 함수를 만들 수 있습니다.

public class Main {
    public static void main(String[] args) {
        ShowSomething myLamda = str -> System.out.println(str);
        myLamda.showSomething("-- test string");
        showSomething(myLamda);
    }
    static void showSomething(ShowSomething ss){
        ss.showSomething("-- interface parameter");
    }
}
interface ShowSomething{
    void showSomething(String str1);
}
-- test string
-- interface parameter

다음의 예제에서는 static 함수에 람다식을 구현합니다. 마치 인스턴스를 생성하는 것 처럼 사용할 수 있습니다.

public class Main {
    public static void main(String[] args) {
        myPrint m1 = returnStr();
        m1.showSomething("Hello my friend! ");
    }
    static myPrint returnStr(){
        return str -> System.out.println(str + "plus something");
    }
}
interface myPrint{
    void showSomething(String str);
}
Hello my friend! plus something

요약

함수형 인터페이스 자바 람다식에 대하여 알아봤습니다.

객체지향 프로그래밍으로 시작한 사람들에겐 혼동을 줄 수도 있는데요. 복잡하게 생각하지 말고 코드적으로 간결하게 매개변수만 가지고 프로그래밍 한다고 생각하면 됩니다.

객체가 필요없는 프로그래밍에 사용하기 좋습니다. 사실 객체 지향프로그래밍은 2000년대 초반에는 소프트웨어 기술의 미래였다가 최근들어서는 날카로운 비판도 많이 받고 있습니다. 어떤 프로그래머는 구글에 문서를 상위랭크 시켜놓고 객체지향 프로그래밍을 하지 말아야 하는 이유에 대해 역설하기도 했습니다.

파이썬은 함수형 방식만으로도 프로그램을 완성할 수 있습니다. 함수만으로 프로그램을 만들면 약간 옛날 C느낌도 나는데요. 이 세상 모든 프로그램을 굳이 객체로 만들지 않아도 되는 경우가 많습니다. 오히려 아주 간단한 문제를 객체로 풀려고 하면 더 어려워집니다. 객체를 생성해야 하니까 시스템의 리소스도 많이 차지하죠. IOT 같은 사물인터넷은 컴퓨터 자원이 넉넉하지 않기 때문에 더 효율적인 C를 사용하는 경우도 있습니다.

자바 교재중에는 람다(Lambda) 테크닉만 다루는 책이 있을 정도로 내용이 있는 주제입니다. 이 포스팅에서는 쓰윽하고 훑고 지나가지만 언젠가 람다 기술이 필요한 시점이 오면 관련 기술을 깊이 파보는 것도 좋은 방법입니다.

참고로 소프트웨어 분야에서 람다라는 단어가 여러가지 의미로 사용되기 때문에 혼동 하지 않도록 주의합니다. (AWS 람다 서비스 – 같은 것도 유명하다. 자바 프로그래밍의 람다와는 다르다)

외부참고문서는 Oracle 의 문서부터 람다를 설명하는 좋은 문서들이 많습니다. 내용도 별로 길지 않기 때문에 읽는 것 만으로도 큰 도움이 됩니다.

외부참고문서

Lambda Expressions in Java 8 – GeeksforGeeks

Lambda Expressions and Functional Interfaces: Tips and Best Practices | Baeldung

Java Lambda Expressions Tutorial with examples (beginnersbook.com)

Java Lambda Expressions (jenkov.com)

Lambda Expressions(자바 람다식 – 오라클) (oracle.com)

Java Lambda Expressions (w3schools.com)

Java Lambda Expressions – javatpoint

Leave a Comment