알고리즘 코드를 보다보면 람다식을 자주 사용하는 것을 볼 수 있다.
제대로 이해하고 가는 것이 나을 거 같아서 정리하는 글!
람다 함수란?
프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어로 보다 단순하게 표현하는 방법
//기존 방식
public String Method(매개변수){
return "Hello";
}
//람다식
(매개변수) -> "Hello";
람다식 특징
· 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주
· 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없음
람다식 장점
· 코드를 간결하게 만들어 줌
· 개발자의 의도가 명확히 드러나 가독성이 높아짐
· 함수를 만드는 과정이 없어 생산성이 높아짐
· 멀티쓰레드를 활용하여 병렬처리를 사용할 수 있음
람다식 단점
· 호출이 까다로움
· 람다 stream 사용 시 단순 for문 혹은 while문 사용 시 성능이 떨어짐
· 람다를 사용하면서 만든 무명함수는 재사용이 불가능
· 람다식을 남용하면 오히려 가독성이 떨어질 수 있음
· 디버깅이 어려움
함수형 인터페이스 (@FunctionInterface)
· 함수를 1급 객체처럼 다룰 수 있게 해주는 어노테이션
· 인터페이스에 선언하여 단 하나의 추상 메소드만을 갖도록 제한하는 역할
@FunctionalInterface
public interface Math{
public int sum(int a, int b);
}
// 구현해야 할 메소드가 2개이므로 Functional Interface가 아니다.
@FunctionalInterface
public interface Math{
public int sum(int a, int b);
public int sum2(int a, int b);
}
public static void main(String[] arg){
Math LambPlus = (a, b) -> a + b;
System.out.println(LambPlus.sum(2, 5); // 7
}
메소드 참조
함수형 인터페이스를 람다식이 아닌 일반 메소드를 참조시켜 선언하는 방법
일반 메소드 참조
// 기존 람다식
Function<String, Integer> function = (str) -> str.length();
function.apply("Hello World");
// 메소드 참조
Function<String, Integer> function = String::length;
function.apply("Hello World");
생성자 메소드 참조
// 기존 람다식
Function<String, Integer> function = (i) -> new TestClass(i);;
// 생성자 참조
Function<String, Integer> function = TestClass::new;
예제
인자 x, y를 받아 x+y를 리턴하는 람다식
@FunctionalInterface
interface MyFunction {
int calc(int x, int y);
}
public class LambdaEx {
public LambdaEx() {
MyFunction f1 = (x, y) -> {return x+y;};
System.out.println("f1의 결과: " + f1.calc(22, 100));
MyFunction f2 = (x, y) -> {return x-y;};
System.out.println("f2의 결과: " + f2.calc(99, 9));
}
public static void main(String[] args) {
new LambdaEx();
}
}
매개변수가 없는 람다식
@FunctionalInterface
interface MyFunction3 {
void print();
}
public class LambdaEx3 {
public LambdaEx3() {
MyFunction3 fprint = () -> {System.out.println("Yoon's Dev");};
fprint.print();
}
public static void main(String[] args) {
new LambdaEx3();
}
}
숫자 중 큰 수 찾기
import extendsss.main;
public class Ramda3 {
@FunctionalInterface
public interface MyNumber{
int getMax(int num1, int num2);
}
public static void main(String[] args) {
MyNumber max = (x,y)->(x>=y)? x:y; // X가 y보다 크면 X 작으면 y
System.out.println(max.getMax(10, 30));
}
}
Runnable 인스턴스 생성
import extendsss.main;
public class Ramda3 {
@FunctionalInterface
public interface MyNumber{
int getMax(int num1, int num2);
}
public static void main(String[] args) {
MyNumber max = (x,y)->(x>=y)? x:y;
System.out.println(max.getMax(10, 30));
}
}
Thread호출
Thread thread = new Thread( () -> {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
});'Java' 카테고리의 다른 글
| [Java] 파일 읽고/쓰기 (0) | 2022.05.20 |
|---|---|
| [Java] Abstract(추상클래스) (0) | 2022.05.18 |
| [Java] Inheritance(상속)3 (0) | 2022.05.17 |
| [Java] Constructor(생성자) (0) | 2022.05.17 |
| [Java] 학생들의 최고 점수/최저 점수 (0) | 2022.05.17 |
댓글