익명 함수와 람다에 대해 설명해주세요

김상욱·2024년 11월 18일

익명 함수와 람다에 대해 설명해주세요

익명함수(Anonymous Function)은 이름이 없는 함수로 일반적으로 일회성으로 사용되며, 코드 내에서 재사용할 필요가 없는 간단한 작업을 처리하기 위해 사용.

  • 클래스나 인터페이스를 즉성에서 구현하면서 인스턴스를 생성. 이름이 없기 때문에 재사용이 어려움
  • 함수형 인터페이스를 구현하는데 자주 사용.
public class Main {
    public static void main(String[] args) {
        // 익명 클래스를 사용한 Runnable 구현
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("익명 클래스에서 실행");
            }
        };

        // 쓰레드 실행
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

람다 표현식(Lambda Expression)은 함수형 프로그래밍 스타일을 Java에 도입한 기능으로, 익명 함수의 간결한 표현 방식.
함수형 인터페이스를 구현할 때 사용. 함수형 인터페이스란 하나의 추상 메서드만 가지는 인터페이스.

(매개변수) -> { 메서드 본문 }
public class Main {
    public static void main(String[] args) {
        // 람다 표현식으로 Runnable 구현
        Runnable runnable = () -> System.out.println("람다에서 실행");

        // 쓰레드 실행
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

ex)
함수형 인터페이스

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "cherry");

        // 익명 클래스를 사용한 정렬
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return s1.compareTo(s2);
            }
        });

        System.out.println(list);  // 출력: [apple, banana, cherry]
    }
}

람다 표현식

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "cherry");

        // 람다 표현식을 사용한 정렬
        Collections.sort(list, (s1, s2) -> s1.compareTo(s2));

        System.out.println(list);  // 출력: [apple, banana, cherry]
    }
}

람다 표현식의 Stream API 활용

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 람다를 사용한 Stream 처리
        numbers.stream()
               .filter(n -> n % 2 == 0)  // 짝수만 필터링
               .forEach(n -> System.out.println(n));  // 출력: 2, 4
    }
}

실습 아이디어

1. 간단한 Comparator를 작성

  • 사용자 리스트를 이름 순, 나이 순으로 정렬하는 코드를 작성.
  • 익명 클래스와 람다 표현식을 각각 사용.

2. Stream API와 함께 연습

  • 사용자 리스트에서 특정 조건(예: 나이가 30 이상)을 만족하는 사용자만 필터링.
  • 필터링된 결과를 정렬하여 출력.

3. Spring에서 람다를 활용한 간단한 프로젝트

  1. 목표: GET /tasks 요청 시 완료된 Task만 반환.

  2. Task 클래스:

    public class Task {
        private String name;
        private boolean completed;
    
        // 생성자, Getter/Setter
    }
  3. 서비스 클래스:

    @Service
    public class TaskService {
        public List<Task> getAllTasks() {
            return List.of(
                new Task("Study Java", true),
                new Task("Learn Spring", false),
                new Task("Practice Coding", true)
            );
        }
    }
  4. 컨트롤러 클래스:

    @RestController
    @RequestMapping("/tasks")
    public class TaskController {
        @Autowired
        private TaskService taskService;
    
        @GetMapping
        public List<Task> getCompletedTasks() {
            return taskService.getAllTasks()
                              .stream()
                              .filter(Task::isCompleted) // 완료된 Task만 필터링
                              .collect(Collectors.toList());
        }
    }

실습 목표

  1. Comparator 연습: 익명 클래스와 람다 표현식 차이를 체험.
  2. Stream API 익숙해지기: 데이터를 필터링, 매핑, 정렬하는 다양한 실습.
  3. Spring에서 실용적 활용: 람다를 사용해 비즈니스 로직을 간결히 작성.

궁금한 점이나 추가로 필요한 예제가 있으면 말씀해주세요! 😊

0개의 댓글