백엔드

람다 표현식

skgur07 2024. 12. 30. 18:30

람다 표현식은 Java 8에서 도입된 기능으로, 익명 함수를 더욱 간단하게 사용하기 위한 간단한 문법입니다. 람다 표현식을 사용하면 불필요한 코드를 줄이고, 함형 프로그래밍 스타일을 Java에서도 쉽게 활용할 수 있게 됩니다.

 

람다 표현식은

( parameters ) -> { body }

 

이런 식으로 사용됩니다. 

  • parameters : 입력 매개변수 (0개 이상)
  • -> : 람다 연산자
  • body : 실행할 코드

로 분류할 수 있습니다.

 

람다 표현식은 왜 필요할까?

람다 표현식의 가장 큰 장점은 간결함과 가독성이라고 할 수 있는데요. 기존의 Java 코드에서 사용되던 익명 클래스 코드가 길고 복잡하며 불필요한 구문으로 인해 핵심 로직을 파악하기 어려운 문제가 있었는데요 때문에 Java 8 부터는 람다 표현식이 나왔습니다!

Collections.sort(ls, new Comparator<String>() {
    public int compare(String s1, String s2) {
        if (s1.length() == s2.length()) { 
            return s1.compareTo(s2);
        }
        return s1.length() - s2.length();
    }
});

 

위 코도는 제가 1181. 단어 정렬를 풀기 위해 쓴 코드입니다. 이 코드는 제가 Java를 본격적으로 공부하고 얼마 안됐을때 사용했던 코드인데요 때문에 저는 익명 클래스를 사용해 문제를 풀었습니다. 위 코드는 Comparator 인터페이스를 구현하는 익명 내부 클래스를 생성하고 new Comparator<String>()으로 선언을 하고 compare 메서드의 전체를 구현해야 합니다. 으! 으! 말만 해도 복잡하죠? 

 

이 코드를 

Collections.sort(ls, (s1, s2) -> {
    if (s1.length() == s2.length()) {
        return s1.compareTo(s2);
    }
    return s1.length() - s2.length();
});

이런 식으로 만들었습니다. 익명 클래스인 Comparator을 대신해 -> 연산자를 사용해 간단히 표현했습니다.

위에서 말했던거 처럼 매우 간결하고 가독성 높은걸 볼 수 있습니다. 

Collections.sort(ls, (s1, s2) -> s1.length() == s2.length() ? s1.compareTo(s2) : s1.length() - s2.length());

그리고 더 단축해 위 같이 매우 간결하게도 만들 수 있습니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());


        ArrayList<String> ls = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            String s = br.readLine();
            ls.add(s);
        }
		
        // 중복 제거
        ls = ls.stream().distinct().collect(Collectors.toCollection(ArrayList::new));
        
        // 정렬
        Collections.sort(ls, new Comparator<String>() {
            public int compare(String s1, String s2) {

                if (s1.length() == s2.length()) {
                    return s1.compareTo(s2);
                }

                return s1.length() - s2.length();
            }
        });

        for (String str :
                ls) {
            System.out.println(str);
        }
    }
}

 

이러한 전체 코드를 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        List<String> ls = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            ls.add(br.readLine());
        }

        // 중복 제거 및 정렬
        ls = ls.stream()
                .distinct()
                .sorted((s1, s2) -> 
                        s1.length() == s2.length() ? s1.compareTo(s2) : s1.length() - s2.length())
                .collect(Collectors.toList());

        // 출력
        ls.forEach(System.out::println);
    }
}

 

이런 식으로 매우 간결하게 중복 제거와 동시에 정렬을 할 수 있습니다. 

 

람다 표현식 vs 익명 클래스

익명 클래를 사용하면 클래스 파일 내부에 별도의 클래스 인스턴스가 생성되서 메모리를 차기하지만 람다는 클래스 인스턴스를 따로 생성하지 않아 메모리 사용량이 더 적고 익명 클래스 객체를 생성하는데 시간이 걸리지만 람다는 JVM이 바로바로 메서드 참조를 생성하기 때문에 익명 클래스보다 빠릅니다.

 

 

'백엔드' 카테고리의 다른 글

CORS란?  (0) 2025.02.07
서버리스  (0) 2024.12.10
JPA vs Mybatis  (0) 2024.11.25
런타임 데이터 영역  (0) 2024.08.14
JAVA와 JVM  (0) 2024.08.12