티스토리 뷰

▶자바의 람다식(Lambda Expression)

이번 글에서는 JDK8에서 람다식(Lambda Expression)이 지원되면서 자바는 완전히 새로운 언어처럼 보이기 시작했는데요.

람다식의 등장으로 자바는 객체지향 언어의 특징과 함께 함수형 언어의 특성을 갖추게 되었습니다.

 

🔎 람다식 ?


람다식을 이용하면 코드가 간견해지고, 지연 연산 등을 통해서 성능 향상을 도모할 수 있는데요.

반면에 모든 엘리먼트를 순회하는 경우에는 성능이 떨어지고, 코드를 분석하기 어려워 질 수 있다는 단점도 존재합니다.

 

📌 람다식 형태

(매개변수, ...) -> { 실행문 }

화살표(->)를 기준으로 왼쪽에는 람다식을 실행하기 위한 매개변수가 위치하고, 오른쪽에는 매개변수를 이용한 실행 코드 혹은 실행 코드 블럭이 옵니다.

 

📌 람다식 쉬운 예시

우선 람디식을 사용하지 않았을 때 두 숫자가 주어졌을 때 이를 더해주는 메소드를 하나 선언해 보겠습니다.

public int sum(int a, int b) {
    return a + b;
}

위 함수를 람다식으로 표현해 보면 다음과 같이 작성할 수 있습니다.

(a, b) -> a + b;

두 정수 a, b를 입력받아 두 값을 더하는 하나의 식이다.

한줄로 의도하는 동작을 명확하게 정의할 수 있었는데요.

메소드의 리턴 타입도 없고, 메소드의 이름도 없습니다.

 

이 때문에 람다식을 익명함수(Anonymous Function) 라고 부르기도 합니다.

 

📌 함수형 인터페이스 + 람다식 예시

람다식은 굉장히 간결해서 여러 부분에서도 빠르고 쉽게 사용이 가능한데요.

이번에는 지난 글에서 알아보았던 인터페이스 안에 오직 한 개의 추상 메소드를 가지는 함수형 인터페이스와 함께 람다식을 사용해 보는 예시를 살펴보려고 합니다.

 

우선 함수형 인터페이스 하나를 선언해 주겠습니다.

아래 함수는 매개변수로 number가 주어졌을 때 그 수가 10의 배수인지 아닌지 boolean값으로 리턴해주는 함수를 의도로 추상 메소드를 하나 선언해 주었습니다.

@FunctionalInterface
public interface LmbdaInter {
    public static boolean checkMultipleOf10(int number);
}

이제는 위 함수형 인터페이스를 구현하여 사용하는 부분 코드를 보겠습니다.

public class LambdaTest {
    public static void main(String[] args) {
        LambdaInter lambdaInter = n -> n % 10 == 0;
        System.out.println(lambdaInter.checkMultipleOf10(20)); // true
    }
}

위 코드에 자세히 봐야 할 부분은 인터페이스를 구현하는 부분인데요.

LambdaInter lambdaInter = n -> n % 10 == 0;

우리는 LamdaInter라는 인터페이스에서 선언만 해두었던 단 하나의 메소드 checkMultipleOf10가 있었습니다.

이제 우리가 아는 대로라면 이 선언만 되어있던 추상 메소드를 상속을 받아 구현을 해야하는데요.

바로 자식 클래스에서 선언을 하고 구현을 하는 부분이라고 이해하면 됩니다.

 

➕ 람다식 기초 실습

PrintName이라는  함수형 인터페이스를 선언하여 성과 이름을 전달받는 getFullName이라는 추상 메소드를 선언합니다.

그 후에는 PrintNameTest이라는 클래스를 선언하여 인터페이스에서 선언만 해두었던 추상 메소드를 구현합니다.

package lambdaTask;

@FunctionalInterface
public interface PrintName {
    public abstract String getFullName(string lastName, String firstName);
}
package lambdaTask;

public class PrintNameTest {
    public static void printFullName(PrintName printName, String lastName, String firstName) {
        System.out.println(printName.getFullName(lastName, firstName));
    }
    
    public static void main(String[] args) {
        PrintNameTest.printFullName((lastName, firstName) -> lastName + firstName, "김", "도은");
    }
}

위 코드에서 PrintNameTest 클래스에서 printFullName이라는 메소드를 정의했는데요.

처음에 보았을 때는 "아니 뭐야...구현을 안 했는데 어떻게 사용하겠다는 거지..?" 할 수 있는데

해당 클래스에서의 printFullName 함수도 구현만 해놓고 사용은 main에서 사용하는 것입니다.

 

main 메소드에서 (lastName, firstName) -> lastName + firstName 자체가 printName이 되는 것입니다.

PrintName 인터페이스가 함수형 인터페이스이기 떄문에 가능했는데요.

 

따라서 printFullName 메소드에서 printName, 성, 이름으로 매개변수를 지정했으므로

main 메소드에서도 값을 그렇게 넘겨줬던 것입니다.

728x90
LIST
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함