[기술정리] Lamda - 익명함수의 간결 표현

silver's avatar
Jan 05, 2025
[기술정리] Lamda - 익명함수의 간결 표현
: 익명 함수를 간결하게 표현하는 방법으로 함수나 메서드를 간단하게 작성하고 전달하는 데 사용된다. 매개변수와 처리 로직을 간결한 문법으로 표현하며, 함수의 객체를 생성하는 역할을 한다.
 
  1. 람다는 인터페이스로 만든다.
  1. 인터페이스에서는 메서드가 하나만 존재해야한다. → 해당 인터페이스에 @FunctionalInterface를 사용하여 두 개이상의 메소드가 있다면 오류가 나게 설정할 수 있다.
  1. 메서드가 인터페이스를 매개변수로 받고 있다면 “행위”를 달라는 뜻!
  1. 람다표현식에서는 매개변수에 타입을 생략 가능하다
람다식 장단점
람다식의 장점 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 * x
 

4종류의 인터페이스

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

silver