자바에서의 람다식이란 일반적인 람다식(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 객체를 람다식에 넘겨주기
}
}
가장 윗 줄의 어노테이션 같은 경우에는 함수형 인터페이스를 작성할 때 컴파일러에게 더욱 인식하기 쉽게 도와주는 주석문입니다.
이상 자바에서의 람다식의 기초적인 부분을 알아봤습니다.
'코딩 > JAVA Basics' 카테고리의 다른 글
[자바 JAVA] 제네릭과 컬렉션 프레임워크 (2) | 2022.12.07 |
---|---|
[자바 JAVA] 예외처리 (0) | 2022.12.06 |
[자바 JAVA] 중첩 클래스 (0) | 2022.12.06 |
[자바 JAVA] 추상클래스와 인터페이스 (0) | 2022.12.06 |
[자바 JAVA] 다형성 (0) | 2022.12.05 |
댓글