개요
자바에서 람다(Lambda)는 익명 함수(anonymous function)를 간단하게 표현할 수 있는 방법이다.
람다는 함수형 인터페이스(functional interface)를 구현하는데 사용된다.
함수형 인터페이스란 하나의 추상 메서드만 가지는 인터페이스를 말한다.
람다 표현식의 기본 문법
람다 표현식은 매개변수 -> 실행 코드 형태로 작성된다.
- (매개변수1, 매개변수2, ...) -> { 실행 코드 }
// 기존의 인터페이스 방식
interface MathOperation {
int operate(int a, int b);
}
public class Main {
public static void main(String[] args) {
// 람다 표현식을 사용한 구현
MathOperation addition = (a, b) -> a + b; // 덧셈
System.out.println(addition.operate(5, 3)); // 8
}
}
위 예시에서 MathOperation 인터페이스는 operate 메서드를 가지고 있는데, 람다 표현식 (a, b) -> a + b를 사용하여 덧셈을 구현한다.
람다 표현식은 자바에서 함수형 프로그래밍을 지원하며, 간결하고 직관적인 코드 작성을 가능하게 한다.
주로 컬렉션 처리나 메서드 참조 등에서 사용되며, Comparator, Stream API와 결합하여 강력한 기능을 제공한다.
람다 표현식
1. 매개변수가 하나인 경우
// 매개변수가 하나인 람다
interface Greeting {
void greet(String name);
}
public class Main {
public static void main(String[] args) {
Greeting greeting = (name) -> System.out.println("Hello, " + name);
greeting.greet("Alice");
}
}
2. 매개변수가 없을 때
interface SayHello {
void say();
}
public class Main {
public static void main(String[] args) {
SayHello hello = () -> System.out.println("Hello, World!");
hello.say();
}
}
람다 활용
1. 컬렉션에서 forEach 사용
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
2. 정렬에 사용
List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9);
Collections.sort(numbers, (a, b) -> b - a); // 내림차순 정렬
System.out.println(numbers); // [9, 5, 4, 3, 1, 1]
3. Comparator에서 람다 사용
List<String> names = Arrays.asList("Bob", "Alice", "Charlie");
names.sort((a, b) -> a.compareTo(b)); // 오름차순 정렬
System.out.println(names); // [Alice, Bob, Charlie]
함수형 인터페이스
함수형 인터페이스는 하나의 추상 메서드만 가진 인터페이스를 의미한다. 이를 람다로 구현할 수 있다.
@FunctionalInterface
interface MyFunction {
void apply(); // 추상 메서드 1개만 있음
// Java 8부터 인터페이스에 default 메서드와 static 메서드도 추가할 수 있다.
default void defaultMethod() {
System.out.println("This is a default method.");
}
}
public class Main {
public static void main(String[] args) {
MyFunction function = () -> System.out.println("Hello from Lambda!");
function.apply(); // "Hello from Lambda!"
function.defaultMethod(); // "This is a default method."
}
}
메서드 참조
메서드 참조(Method Reference)는 람다의 한 형태로, 기존 메서드를 재사용하는 방법이다.
메서드 참조는 코드가 짧고, 명확하게 된다.
// 기존 메서드
public class Main {
public static void printMessage(String message) {
System.out.println(message);
}
public static void main(String[] args) {
// 람다 대신 메서드 참조 사용
Consumer<String> printer = Main::printMessage;
printer.accept("Hello, Method Reference!"); // 메서드 참조를 사용
}
}
생성자 참조
생성자 참조(Constructor Reference)는 자바 8에서 도입된 기능으로, 람다 표현식을 더 간결하게 작성할 수 있도록 도와준다.
생성자 참조는 특정 클래스의 생성자를 메서드처럼 참조하여 객체를 생성할 수 있게 해주는 기능이다.
이는 람다 표현식의 축약형으로 볼 수 있다.
1. 생성자 참조의 문법
생성자 참조는 클래스 이름 뒤에 ::new를 붙여 사용한다.
ClassName::new
2. 기본 생성자 참조
기본 생성자 참조 생성자 참조는 기본 생성자를 참조할 수 있다.
예를 들어, 다음과 같이 Person 객체를 생성하는 람다를 생성자 참조로 바꿀 수 있다.
// 일반적인 람다 표현식
interface PersonFactory {
Person create(String name, int age);
}
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
// 람다 표현식
PersonFactory personFactory = (name, age) -> new Person(name, age);
// 생성자 참조로 변경
PersonFactory personFactoryRef = Person::new;
Person person = personFactoryRef.create("Alice", 25);
System.out.println(person.name); // Alice
}
}
위 예제에서, Person::new는 Person 클래스의 생성자를 참조하며, 이를 통해 create 메서드가 객체를 생성한다.
3. 매개변수가 있는 생성자 참조
생성자 참조는 매개변수가 있는 생성자도 참조할 수 있다.
이때 람다 표현식에서 매개변수의 타입과 수에 맞는 생성자가 참조된다.
interface GreetFactory {
Greet create(String greeting);
}
class Greet {
String message;
public Greet(String message) {
this.message = message;
}
public void greet() {
System.out.println(message);
}
}
public class Main {
public static void main(String[] args) {
// 람다 표현식
GreetFactory greetFactory = (message) -> new Greet(message);
// 생성자 참조로 변경
GreetFactory greetFactoryRef = Greet::new;
Greet greet = greetFactoryRef.create("Hello, World!");
greet.greet(); // Hello, World!
}
}
'웹(WEB) > 자바(Java)' 카테고리의 다른 글
[Java] 자바 Stream API (1) | 2024.12.31 |
---|---|
[Java] 자바 자료구조, Collection (0) | 2024.12.31 |
[Java] 자바 annotation (0) | 2024.12.31 |
[Java] 자바 Enum (0) | 2024.12.31 |
[Java] 자바 Generics (0) | 2024.12.30 |