람다식이란?
- 람다식(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!!");
}
}
'Java' 카테고리의 다른 글
[Java] 멀티쓰레드 Callable, Executor, ExecutorService 알아보기 (0) | 2024.11.30 |
---|---|
[Java] Thread와 Runnable의 개념 및 사용법 (1) | 2024.11.28 |
[Java] 스트림(Stream) 특징, 사용 예제 (0) | 2024.10.11 |
[Java] 자료구조 HashMap의 특징 및 핵심 원리 (0) | 2024.09.18 |
[Java] 자바 접근제어자(public, protected, default, private) (1) | 2024.09.16 |