본문 바로가기
Java

[Java]람다식(Lambda)

by 엘딘 2022. 7. 14.

알고리즘 코드를 보다보면 람다식을 자주 사용하는 것을 볼 수 있다. 

제대로 이해하고 가는 것이 나을 거 같아서 정리하는 글!

 

람다 함수란?

프로그래밍 언어에서 사용되는 개념으로 익명 함수(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

댓글