본문 바로가기
  • 비둘기다
  • 비둘기다
  • 비둘기다
코딩/JAVA Basics

[자바 JAVA] 자바의 람다식

by parzival56 2022. 12. 6.

자바에서의 람다식이란 일반적인 람다식(lambda calculus)에서 유래한 것이죠.

람다식이란, 수학의 함수를 단순하게 표현하는 하나의 방법입니다. 

예를 들어 f(x, y) = x + y라는 식이 있을 때 이를 수학의 람다식으로 바꾸면 (x, y)->x + y가 됩니다.

여기서 f가 사라졌기 때문에 이는 이름 없는 함수가 되는 것이죠. 여기에 숫자를 대입한다면

((x,y) -> x + y) (2, 3) = 2 + 3 = 5와 같이 됩니다.

 

위가 자바에서의 람다식의 구조입니다. 애로우 토큰은 매개변수 리스트와 함수를 분리하는 역할을 합니다. 

함수의 바디는 중괄호 {}로 둘러쌉니다. 한 문장밖에 안 되는 경우는 생략해도 무관하지만 되도록이면 그냥 넣으시는 걸 추천합니다. 

함수 바디 부분은 말그대로 '함수'이기 때문에 출력문이 와도 되고, 반환문 등 뭐가 와도 상관없습니다.

// 람다식 안 쓰는 경우
int x;
int y;
System.out.println(x + y);

// 람다식 쓰는 경우
(int x, int y) -> {System.out.println(x + y);}
(x, y) -> {return x + y;}
(x, y) -> x + y;	// 이거 가능합니다
	// 함수 바디 안에 return이 들어가게 되면 무조건 중괄호를 써줘야함

람다식은 수식을 좀 더 간편하게 쓰기 위해 사용하는 건 맞지만 꼭 수식을 정리하기 위해 사용해야만 하는 것은 아닙니다. 

예를 들어 그냥 막연하게 출력만 하고 싶을 때는 매개변수 없이 함수 바디에 출력문만 써서 컴파일하셔도 됩니다. 

매개변수의 다양한 경우를 예제 코드로 살펴보겠습니다.

// 기본적인 람다식 만들고 호출하기
interface MyFunction { // 함수형 인터페이스
    int calc(int x, int y); // 추상 메소드
}

public class LambdaEx1 {
    public static void main(String[] args) {
        MyFunction add = (x, y) -> {return x+y; }; // 람다식
        MyFunction minus = (x, y) -> x – y; // 람다식. {}와 return 생략
        System.out.println(add.calc(1, 2)); 
        System.out.println(minus.calc(1, 2));
    }
} 

// 매개변수가 없는 람다식 만들기
interface MyFunction { // 함수형 인터페이스
    void print(); // 람다식으로 구현할 추상메소드
}
public class LambdaEx3 {
    public static void main(String[] args) {
        MyFunction f = () -> {
            System.out.println(“Hello”);
        };
        f.print(); // 람다식 호출
      f = () -> System.out.println(“안녕”); 
        f.print(); // 람다식 호출
    }
}

// 람다식이 매개변수 일 때
interface MyFunction { // 함수형 인터페이스
    int calc(int x, int y); // 람다식으로 구현할 추상메소드
}
public final class LambdaEx4 {
    public static void main(String[] args) {
        printMultiply(3, 4, (x, y)->x*y) //람다식 (x,y)->x*y를 매개변수로 전달
    }
    static void printMultiply(int x, int y, MyFunction f)
        System.out.println(f.calc(x, y));
    }
}

제네릭 함수형 인터페이스

@FunctionalInterface
interface MyFunction<T> { // 제네릭 타입 T를 가진 함수형 인터페이스
    void print(T x); // 람다식으로 구현할 추상 메소드
}
public class void main(String[] args) {
    public static void main(String[] args) {
        MyFunction<String> f1 = (x) -> System.out.println(x.toString());
        f1.print(“ABC”); // String 객체를 람다식에 넘겨주기
        MyFunction<Integer> f2 = (x) -> System.out.println(x.toString());
        f2.print(Integer.valueOf(100)); // Integer 객체를 람다식에 넘겨주기
    }
}

가장 윗 줄의 어노테이션 같은 경우에는 함수형 인터페이스를 작성할 때 컴파일러에게 더욱 인식하기 쉽게 도와주는 주석문입니다. 

 

이상 자바에서의 람다식의 기초적인 부분을 알아봤습니다.

댓글