람다식이란?
람다식은 자바8부터 추가된 기능으로, 자바안에서 함수형 프로그래밍을 가능하게 하기위해 추가된 기능이다.
람다식을 사용하면 보다 간결하게 코딩을할 수 있다.
람다식 인터페이스
package lamda;
@FunctionalInterface
public interface MyNumber {
int getMax(int num1, int num2);
}
- 람다식을 사용하기 위해서는 반드시 이름이 있는 메서드가 있는 추상메서드가 선언되어 있어야한다.
- @FunctionalInterface 어노테이션은 없어도 되지만, 람다인터페이스에는 하나의 메서드만 존재해야하므로 어노테이션을 선언하면 오류방지를 줄여준다.
람다식 구현
package lamda;
public class TestMyNumber {
public static void main(String[] args) {
MyNumber max = (x, y) -> (x >= y) ? x : y;
System.out.println(max.getMax(30, 20));
}
}
- 원래 자바에서 메소드를 사용하려면 객체생성 없이는 불가능하다.
- 람다식(함수명이 없음) 으로 getMax 의 구현부를 만들었다.
- 하지만 람다식을 활용하면 객체생성없이도 바로 메서드 사용이 가능하다.
- 사실 내부적으로 익명 내부 클래스가 선언되어 가능한 것.
기존방식과 람다식 비교
문자열 2개를 인자로 받아 첫번째, 두번째 를 연결시켜주는 함수를 만들어 기존 방식과 람다식의 차이점을 알아보자.
함수정의 인터페이스
package lamda;
@FunctionalInterface
public interface StringConcat {
public void makeString(String s1, String s2);
}
인터페이스 구현
package lamda;
public class StringConCatImpl implements StringConcat {
@Override
public void makeString(String s1, String s2) {
System.out.println(s1 + ", " + s2);
}
}
테스트
package lamda;
public class TestStringConcat {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "World";
// 인터페이스를 따로 클래스에서 구현해서 사용하는 일반적인 방법.
StringConCatImpl concat1 = new StringConCatImpl();
concat1.makeString(s1, s2);
// 람다식으로 바로 구현해서 사용하는 방법. -> 간결함.
StringConcat scc = (x, y) -> System.out.println(x + ", " + y);
scc.makeString(s1, s2);
}
}
- 결과는 같다. 하지만 구현방식이 람다식을 활용하는 것이 훨씬간결하다.
매개변수로 람다식 / 람다식 리턴하기.
package lamda;
interface PrintString {
void showString(String str);
}
public class TestLamda {
public static void main(String[] args) {
PrintString lamdaStr = s -> System.out.println(s);
lamdaStr.showString("hello lamda_1");
showMyString(lamdaStr);
PrintString reStr = returnString();
reStr.showString("헬로 ");
}
// 매개변수 전달
public static void showMyString(PrintString p) {
p.showString("hello lamda_2");
}
// 함수리턴
public static PrintString returnString() {
PrintString str = s -> System.out.println(s + "world");
return str;
}
}
- 매개변수로 함수를 전달하여 사용할 수 있다.
- 함수 자체를 리턴할 수 있다.
출처: do it 자바프로그래밍