람다식은 자바에서 함수형 프로그래밍을 지원하기 위해 도입된 기능으로, 익명 함수를 간결하게 표현하는 방법입니다. 람다식은 함수형 인터페이스를 구현하는 객체를 생성하거나 전달할 때 사용됩니다. 여기서 함수형 인터페이스란 딱 하나의 추상 메서드를 갖는 인터페이스를 말합니다.
람다식은 다음과 같은 구조를 갖습니다:
(매개변수 목록) -> {실행 코드 블록}
예를 들어, 정수 두 개를 더하는 간단한 람다식은 다음과 같이 표현할 수 있습니다:
(int a, int b) -> { return a + b; }
위의 람다식은 두 개의 정수를 매개변수로 받아서 그 합을 반환하는 역할을 합니다.
람다식은 함수형 인터페이스를 구현하는 객체를 생성하거나 전달할 때 사용됩니다. 함수형 인터페이스를 구현하는 객체를 생성할 때는 람다식을 사용하여 간결하게 표현할 수 있습니다. 또한, 람다식을 메서드의 매개변수로 전달할 수도 있습니다.
람다식은 코드를 간결하고 가독성 있게 만들어주는 장점이 있으며, 함수형 프로그래밍 스타일을 지원하여 병렬 처리와 같은 작업을 더 쉽게 수행할 수 있도록 도와줍니다.
람다식은 매개변수가 없는 경우와 매개변수가 있는 경우로 구분할 수 있습니다.
예를 들어, 현재 시간을 출력하는 람다식은 다음과 같이 표현될 수 있습니다:
() -> { System.out.println(LocalDateTime.now()); }
예를 들어, 두 개의 정수를 더하는 람다식은 다음과 같이 표현될 수 있습니다:
(int a, int b) -> { return a + b; }
이렇게 매개변수의 유무에 따라 람다식의 형태가 결정되며, 이를 통해 간결하고 가독성 있는 코드를 작성할 수 있습니다.
람다식에서 리턴값이 있는 경우, 중괄호 {} 안에 리턴문이 하나만 있는 경우에는 중괄호와 함께 return 키워드를 생략할 수 있습니다. 이때는 단일 표현식으로 리턴값을 지정할 수 있습니다.
(int a, int b) -> a + b
위의 람다식에서는 중괄호와 return 키워드를 생략하고, 단일 표현식으로 두 정수의 합을 반환하고 있습니다. 이런 경우에는 컴파일러가 자동으로 리턴값을 추론하여 처리합니다.
그러나 중괄호 안에 여러 문장이 있거나 복잡한 로직을 가지고 있다면 return 키워드를 생략할 수 없습니다. 이 경우에는 중괄호와 함께 명시적으로 return 키워드를 사용해야 합니다.
예를 들어, 두 정수를 비교하여 큰 값을 반환하는 람다식은 다음과 같이 표현될 수 있습니다:
(int a, int b) -> {
if (a > b) {
return a;
} else {
return b;
}
}
위의 람다식에서는 중괄호 안에 여러 문장이 있으므로 return 키워드를 생략할 수 없습니다.
메서드 참조(Method Reference)는 람다식을 더 간결하게 표현하기 위한 기능 중 하나입니다. 메서드 참조를 사용하면 메서드를 참조하여 람다식에서 불필요한 매개변수를 제거하고 코드를 더 간결하게 만들 수 있습니다.
메서드 참조는 메서드의 이름 또는 클래스명과 메서드명을 사용하여 표현됩니다.
정적 메서드의 참조: 클래스명과 정적 메서드명을 사용하여 정적 메서드를 참조합니다.
ClassName::staticMethodName
인스턴스 메서드의 참조: 객체 참조와 메서드명을 사용하여 인스턴스 메서드를 참조합니다.
objectName::instanceMethodName
생성자의 참조: 클래스명과 new
키워드를 사용하여 생성자를 참조합니다.
ClassName::new
메서드 참조는 메서드의 매개변수 정보와 리턴 타입을 이용하여 람다식에서 필요한 매개변수를 추론할 수 있습니다. 따라서 메서드 참조를 사용하면 람다식을 더 간결하고 가독성 있게 만들 수 있습니다.
예를 들어, 문자열을 출력하는 메서드를 참조하여 람다식을 간결하게 만들 수 있습니다:
// 람다식
Consumer<String> lambda = (str) -> System.out.println(str);
// 메서드 참조
Consumer<String> methodRef = System.out::println;
메서드 참조를 사용하면 불필요한 매개변수를 제거하고 코드를 더 간결하게 만들 수 있습니다.
람다식에서는 외부 변수를 참조할 수 있고, 이를 이용하여 다른 메소드를 호출할 때 외부 변수를 매개값으로 사용할 수 있습니다. 이러한 경우에는 람다식 내에서 제공되는 매개변수(a)와 외부 변수(b)를 함께 사용하여 다른 메소드를 호출합니다.
int b = 10;
Consumer<Integer> lambda = (a) -> {
someMethod(a, b); // 외부 변수 b를 매개값으로 사용하여 someMethod 호출
};
이러한 기능을 통해 람다식은 외부 변수를 캡처하여 사용할 수 있고, 이를 통해 유연하고 간결한 코드를 작성할 수 있습니다.