본문 바로가기
Java

[Java] 람다식(Lambda) 개념 및 사용 예제

by 하부루 2024. 10. 16.

람다식이란?

  • 람다식(Lambda Expression)이란 함수를 하나의 식(Expression)으로 표현한 것.
  • 함수를 람다식으로 표현하면 메소드의 이름이 필요 없기 때문에, 람다식은 익명 함수의 한 종류.
  • Java8 버전부터 제공.

 

[익명 함수란?]

  • 이름이 없는 함수.
  • 함수이지만 함수를 따로 만들지 않고, 코드한줄에 함수를 써서 그것을 호출하는 방식

 

[람다식 작성법]

// 람다식 기본 형태
(매개변수) -> {함수 로직}

//기존 함수 정의
public string helloWorld(){
   System.out.println("Hello World!");
}

// 람다 함수 정의
() -> { System.out.println("Hello World!"); }

public static void main(String[] args) {
    int number = 10;  // number는 람다식 내에서 사용되고 있으므로 상수로 간주

    Runnable runnable = () -> {
        System.out.println("Number: " + number);
    };

	number = 15;  // 컴파일 시 에러 발생
		
    runnable.run();
}

 

람다식 특징

  • 람다식은 이름을 가지지 않는 익명 함수이다.
  • 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주된다.
  • 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없다.

[장점]

  • 코드를 간결하게 만들수 있다.
  • 코드에 개발자의 의도가 명확하게 드러나므로 가독성이 향상된다.

[단점]

  • 람다를 사용하여 만든 무명함수는 재사용이 불가능하다.
  • 디버깅이 어렵다.
  • 람다를 막무가내로 사용시 오히려 가독성이 떨어질 수 있다.

 

함수형 인터페이스(Functional Interface)

  • 단 하나의 추상 메소드만을 갖도록 제한하는 인터페이스.
  • @FunctionalInterface 어노테이션 사용(컴파일러가 인터페이스를 함수형 인터페이스로 인식)
  • 함수형 인터페이스에 두 개 이상의 메소드가 선언되면 자바 컴파일러가 오류를 발생시킨다.
//함수형 인터페이스의 선언
@FunctionalInterface
interface Calc {
    public int min(int x, int y);
}

//메소드가 2개이상 선언되어 에러가 발생
@FunctionalInterface
interface Calc {
    public int min(int x, int y);
    public int max(int x, int y);
}

 

함수형 인터페이스 테스트 예제

[Printable.interface]

@FunctionalInterface
public interface Printable {

     void print(String suffix);
     //void MultipleThingError(String suffix); //메소드를 2개이상 선언 불가(에러발생)
}

 

[Cat.class]

public class Cat implements Printable{

    private String name;
    public int age;

    @Override
    public void print(String suffix) {
    }
}

 

[Lambda.class]

public class Lambda {

    public static void main(String[] args) {

        //람다식 적용 전
        Cat cat = new Cat();
        printThing(cat);

        /*
        * 람다식 적용 후
        * 1. 접근제어자, 반환타입, 메소드명 생략 가능
        * 2. 구현하려는 함수가 하나의 표현식일 경우 한줄로 표현가능, 중괄호 생략가능
        */
        printThing((s) -> System.out.println("Lambda Meow"));

        //객체를 생성해서 메소드에 전달하는 방식으로도 사용 가능
        Printable lambdaPrint = (s) -> System.out.println("Lambda Meow2 ::" + s);
        printThing(lambdaPrint);
    }

    static void printThing(Printable thing) {
        thing.print("suffix!!");
    }
}