본문 바로가기
언어(Language)/Java

[Java] 람다식

by 송기동 2025. 5. 3.
728x90

람다식

- Java 8 부터 도입된 함수형 프로그래밍 스타일의 문법

- 인터페이스를 구현하는 객체 생성 코드를 수식 형태로 단순화

- 1개의 추상 메소드만 가진 인터페이스에서만 사용 가능

  → 이런 인터페이스를 함수형 인터페이스라 하며, @FunctionalInterface 어노테이션으로 선언 가능

- 람다식 = 메서드를 간단한 식으로 표현한 것

 

# 람다식 문법

- 매개변수 자료형은 인터페이스 정의에서 알 수 있으므로 자료형을 생략하고 변수 이름만 사용 가능

- 매개변수가 1개면 괄호 생략 가능

- 매개변수를 가지지 않으면 괄호만 남음

- 실행할 코드에서 실행문이 1개이면 중괄호 생략 가능

- 단, 실행문이 return문 뿐이라면 return과 세미콜론, 중괄호를 생략하고 1개의 수식만 적어야 함 

인터페이스 객체변수 = (매개변수) -> {실행할 코드};

// 매개변수: 함수에 들어오는 값
// -> : "람다"의 핵심
// 실행할 코드: 함수처럼 실행될 내용

 

# 람다의 축약형 - 메서드 참조( : : )

List<String> names = List.of("홍길동", "김철수", "이영희");

// 람다식
names.forEach(name -> System.out.println(name));

// 메서드 참조
names.forEach(System.out::println);

 

# 함수형 인터페이스 종류와 활용

인터페이스 형태 설명
Runnable () -> {} 스레드 실행 등
Consumer<T> T -> void 값을 소비 (forEach 등)
Function<T,R> T -> R 값 변환
Predicate<T> T -> boolean 조건 판단 (filter 등)
Comparator<T> (T, T) -> int 정렬 기준

 

# 람다식 활용 예제

 

- 스레드 실행: Runnable

// 전통 방식
Runnable task = new Runnable() {
    @Override
    public void run() {
        System.out.println("스레드 실행 중");
    }
};
new Thread(task).start();

// 람다식
Runnable task2 = () -> System.out.println("스레드 실행 중");
new Thread(task2).start();

 

- 정렬 기준 지정: Comparator

List<String> names = Arrays.asList("홍길동", "김철수", "이영희");

// 전통 방식
Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return a.length() - b.length(); // 글자 길이 순
    }
});

// 람다식
names.sort((a, b) -> a.length() - b.length());

 

 

- 컬렉션 반복 처리: forEach, map, filter 등 (Java Stream API)

 

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 전통 방식 (짝수만 출력)
for (int n : numbers) {
    if (n % 2 == 0) {
        System.out.println(n);
    }
}

// 람다식 forEach 예시(전체 출력)
numbers.forEach(n -> System.out.println("숫자: " + n));

// 람다식 (Stream + filter)
numbers.stream()
       .filter(n -> n % 2 == 0)
       .forEach(System.out::println);

// 값에 10 더해서 출력 (map)
numbers.stream()
       .map(n -> n + 10)
       .forEach(System.out::println);
728x90

'언어(Language) > Java' 카테고리의 다른 글

[Java] Object 클래스  (1) 2025.06.08
[Java] 패키지  (1) 2025.05.09
[Java] 제네릭  (0) 2025.05.03
[Java] Scanner 클래스  (1) 2025.04.24
[Java] Lombok 어노테이션  (28) 2024.02.24