: 익명 함수를 간결하게 표현하는 방법으로 함수나 메서드를 간단하게 작성하고 전달하는 데 사용된다. 매개변수와 처리 로직을 간결한 문법으로 표현하며, 함수의 객체를 생성하는 역할을 한다.
- 람다는 인터페이스로 만든다.
- 인터페이스에서는 메서드가 하나만 존재해야한다. → 해당 인터페이스에 @FunctionalInterface를 사용하여 두 개이상의 메소드가 있다면 오류가 나게 설정할 수 있다.
- 메서드가 인터페이스를 매개변수로 받고 있다면 “행위”를 달라는 뜻!
- 람다표현식에서는 매개변수에 타입을 생략 가능하다
람다식 장단점
람다식의 장점
1. 코드 간결성: 불필요한 코드를 줄이고 핵심 로직을 강조할 수 있음.
2. 함수 객체 생성: 함수를 일급 객체로 다루는 환경에서 매우 유용.
3. 익명성: 한 번 사용하고 말 함수를 정의할 때 유용.
람다식 사용시 주의점
1. 가독성 : 너무 복잡한 로직을 람다식에 넣으면 오히려 가독성을 해칠 수 있음.
2. 디버깅 어려움: 디버깅 시 익명 함수로 인해 이름이 없어 추적이 어려울 수 있음.
람다식과 람다 표현식
// 람다식()->{}에 return을 넣음 -> 여러줄 코딩해야할 때 사용
MySupplier<String> r2 = () -> {return "good";};
// 람다 표현식 {}를 생략하면 return이 포함되어있음 -> 한 줄에 다 코딩 가능ㅎ
MySupplier<String> r3 = () -> "good";
String data= n <20 ? "good" : ""; //-> 람다 표현식 return이 된다.람다식의 형태 : (매개변수) -> { 처리 로직 }
// 기본 형태
(int a, int b) -> { return a + b; }
// 더 간단한 형태 (return 생략)
(a, b) -> a + b
// 매개변수가 하나인 경우 괄호 생략 가능
x -> x * x4종류의 인터페이스
1. Consumer : 입력만 받고 출력이 없는 연산을 수행한다.
public interface MyConsumer<T> { // 무슨 타입 들어올지 모르니까 제네릭 사용
void accept(T data);
}제네릭(Generics)
Java에서 다양한 데이터 타입을 처리할 수 있도록 도와주는 기능으로 어떤 데이터든지 처리할 수 있는 틀을 만들어주는 것이다.
- 타입 안정성 : 제네릭을 사용하면 컴파일 시점에 타입 체크가 이루어져, 런타임 오류를 줄일 수 있다.
- 재사용성 : 동일한 코드를 여러 데이터 타입에 대해 사용 가능하다.
public <T extends Number> void processNumber(T number) {
// number는 Number 또는 그 하위 클래스인 Integer, Double 등만 적용가능하다.
}public <K, V> void processPair(K key, V value) {
//K와 V처럼 각각 다른 타입으로 정의도 가능하다.
}2. Supplier : 입력 없이 값을 반환
@FunctionalInterface
public interface MySupplier<T> {
T get();
}3. Function : 입력을 받아(매개변수T 존재) 결과를 반환(return R)
public interface MyFunction<T,R> {
R apply(T t);
}4. Predicate : 입력을 받아 논리값을 반환 ( 결과 O )
public interface MyPredicate<T> {
boolean apply(T t);
}람다식 사용 예제
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class LambdaExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// 람다식을 사용하여 리스트의 요소를 출력
Consumer<String> printName = name -> System.out.println(name);
names.forEach(printName); // 각 이름을 출력
}
}
Share article