람다식이란?
프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions) 를 지칭하는 용어이다. 클래스를 생성하지 않고 매개변수와 함수형 인터페이스로 함수형 프로그래밍 을 구현하는 방식이다.
함수형 프로그래밍이란?
- 순수 함수를 구현하고 호출
- 매개변수만을 사용하도록 만든 함수로 외부 자료에 부수적인 영향이 발생하지 않음
- 입력 받은 자료 기반으로 수행하고 외부에 영향을 미치지 않으므로 병렬처리 등에 안정적인 확장성 있는 프로그래밍 방식
람다식의 특징
- 코드가 간결 - 불필요한 루프문을 사용하지 않으며 동일한 함수를 재활용
- 외부변수를 사용하지 않고 매개변수만으로 구현되기 때문에 다른 외부 변수에 영향을 주지않음
- 클래스를 생성하지 않고 매개변와 함수 구현만으로 수행할 수 있는 기능을 제공
- 내부적으로 익명의 객체가 생성이 됨
람다식의 문법
- 매개 변수 하나인 경우 괄호 생략 가능( 두 개인 경우는 괄호 생략 불가 )
- str -> {System.out.println(str);}
- 중괄호 안의 구현부가 한 문장인 경우 중괄호 생략 가능
- str -> System.out.println(str);
- 중괄호 안의 구현부가 한 문장이라도 return 문은 중괄호 생략 불가
- str -> return str.length(); //오류
- 중괄호 안의 구현부가 반환문 하나라면 return과 중괄호를 모두 생략 가능
- (x, y) -> x+y // 두 값을 더하여 반환
- str -> str.length() // 문자열 길이를 반환
람다식 예제
- Function Interface
package lambda;
@FunctionalInterface // 함수형 인터페이스라는 것을 지정하며 두 개 이상의 함수를 구현할 수 없음
public interface MyMaxNumber {
int getMaxNumber(int x, int Y);
}
- Class
package lambda;
public class TestMyNumber {
public static void main(String[] args) {
MyMaxNumber max = (x, y)-> (x >= y)?x : y; // 리턴 값이 하나여서 return , { 동시 생략
System.out.println(max.getMaxNumber(10, 20)); // 20
}
}
람다식 구조
package lambda;
public class TestStringConcat {
public static void main(String[] args) {
// Interface를 구현하여 함수 사용
StringConImpl impl = new StringConImpl();
impl.makeString("hello", "world");
//람다식
StringConcat concat = (s, v)->System.out.println(s+ "," +v);
concat.makeString("hello", "world");
//람다식 내부 클래스
StringConcat concat2 = new StringConcat() {
@Override
public void makeString(String s1, String s2) {
System.out.println(s1+ "," +s2);
}
};
concat2.makeString("hello", "world");
}
}
람다식을 변수로 사용
package lambda;
interface PrintString{
void showString(String str);
}
public class TestLambda {
public static void main(String[] args) {
PrintString lambdaStr = s->System.out.println(s);
// 람다식을 매개변수로 전달
showMyString(lambdaStr); // Test2
// 람다식을 반환
PrintString test = returnString();
test.showString("Test3"); // Test3!!!
}
public static void showMyString(PrintString p) {
p.showString("Test2");
}
public static PrintString returnString() {
return s->System.out.println(s + "!!!");
}
}
'Programming > Java' 카테고리의 다른 글
[Java] 스트림(Stream) (0) | 2021.01.13 |
---|