Skip to content

java lambda #

Find similar titles

2회 업데이트 됨.

Edit
  • 최초 작성자
    ihcho
  • 최근 업데이트
    shlee

Structured data

Category
Programming

Java 8에서는 함수형 프로그래밍을 지원하기 위해 람다 표현식(lambda expression)이라는 새로운 기능을 도입했다. 람다 표현식은 간단하게 말해 익명 함수(anonymous function)를 정의하는 방법으로, 메소드의 매개변수나 변수로 함수를 전달할 수 있다. 이를 통해 코드의 가독성을 높이고, 반복적인 코드를 줄이며, 병렬 처리를 용이하게 할 수 있다.

람다 표현식이란? #

람다 표현식은 함수형 프로그래밍에서 영감을 받아 만들어진 개념으로, 익명 함수를 나타낸다. 간단하게 말하면, 람다 표현식은 한 줄로 작성된 익명 함수이다. 람다 표현식은 메서드로 전달할 수 있고, 메서드의 반환 값으로 사용할 수 있으며, 변수에 할당할 수도 있다. 람다 표현식은 인터페이스를 구현하기 위해 사용된다. 이러한 인터페이스를 함수형 인터페이스라고 한다. 함수형 인터페이스는 딱 한 개의 추상 메서드를 갖고 있어야 한다. 그리고 이 메서드는 람다 표현식을 통해 구현된다.

함수형 인터페이스 #

람다 표현식은 함수형 인터페이스(Functional Interface)를 구현하기 위한 간단한 방법이다. 함수형 인터페이스는 하나의 추상 메소드를 가지고 있는 인터페이스를 의미한다. 이러한 인터페이스는 람다 표현식을 사용하여 인스턴스를 생성할 수 있다.

람다 표현식의 문법 #

람다 표현식은 다음과 같은 문법을 가지고 있다.

(parameter1, parameter2, ..., parameterN) -> { 
    // 메서드 몸체 
}

위 문법에서 parameter1, parameter2, ..., parameterN은 메서드의 매개변수를 나타낸다. ->는 람다 연산자이다. {} 안에는 람다 표현식의 메서드 몸체가 작성된다.

람다 표현식의 활용 #

컬렉션 처리 #

람다 표현식은 컬렉션 처리에서 매우 유용하다. 예를 들어, List 인터페이스의 forEach() 메소드를 사용하여 리스트의 모든 요소를 출력하는 예제 코드는 다음과 같다.

List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
list.forEach(s -> System.out.println(s));

함수형 인터페이스 활용 #

람다 표현식을 사용하면 함수형 인터페이스를 활용하여 코드를 간결하게 작성할 수 있다. 예를 들어, Predicate 인터페이스를 사용하여 리스트에서 조건에 맞는 요소를 검색하는 예제 코드는 다음과 같다.

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Predicate<Integer> condition = n -> n % 2 == 0;
List<Integer> evenList = list.stream().filter(condition).collect(Collectors.toList());

스트림 API와 함께 사용하기 #

람다 표현식은 스트림 API와 함께 사용하면 매우 효율적인 코드를 작성할 수 있다. 예를 들어, 다음과 같은 코드는 1부터 10까지의 수 중에서 짝수만 골라서 출력한다.

IntStream.range(1, 11).filter(n -> n % 2 == 0).forEach(System.out::println);

메소드 레퍼런스(Method Reference) #

정적 메소드 참조 #

메소드 레퍼런스(Method Reference)는 람다 표현식을 더 간결하게 표현하는 방법이다. 정적 메소드 참조는 클래스 이름 또는 인스턴스 이름과 메소드 이름을 사용하여 메소드를 참조한다. 메소드 레퍼런스는 다음과 같이 표현된다. * 정적 메소드 참조: 클래스 이름::메소드 이름 * 인스턴스 메소드 참조: 인스턴스 이름::메소드 이름 * 생성자 참조: 클래스 이름::new

인스턴스 메소드 참조 #

인스턴스 메소드 참조는 인스턴스 이름과 메소드 이름을 사용하여 메소드를 참조한다. 예를 들어, 다음과 같은 코드는 문자열 리스트를 정렬할 때 인스턴스 메소드 참조를 사용한다.

List<String> list = Arrays.asList("apple", "banana", "cherry");
list.sort(String::compareToIgnoreCase);

생성자 참조 #

생성자 참조는 클래스 이름과 new 키워드를 사용하여 생성자를 참조한다. 예를 들어, 다음과 같은 코드는 정수 리스트를 생성할 때 생성자 참조를 사용한다.

List<Integer> list = Stream.of(1, 2, 3, 4, 5).collect(Collectors.toCollection(ArrayList::new));

람다 표현식과 익명 내부 클래스의 차이점 #

람다 표현식과 익명 내부 클래스는 모두 함수형 인터페이스를 구현하기 위한 방법이다. 하지만, 람다 표현식과 익명 내부 클래스는 몇 가지 차이점이 있다.

코드의 간결성 #

람다 표현식은 코드의 간결성을 높여준다. 람다 표현식은 함수형 인터페이스를 구현하는 코드를 간결하게 표현할 수 있다. 예를 들어, 다음과 같은 코드는 Comparator 인터페이스를 구현하는 익명 내부 클래스를 사용한다.

Comparator<String> comparator = new Comparator<String>() {
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);
    }
};

하지만, 람다 표현식을 사용하면 코드를 간결하게 표현할 수 있다.

Comparator<String> comparator = (s1, s2) -> s1.compareToIgnoreCase(s2);

인터페이스 구현 방식 #

람다 표현식은 인터페이스 구현 방식이 익명 내부 클래스와 다르다. 익명 내부 클래스는 클래스를 정의하고 인스턴스를 생성하는 방식으로 인터페이스를 구현한다. 하지만, 람다 표현식은 함수형 인터페이스의 인스턴스를 생성하는 방식으로 인터페이스를 구현한다. 이렇게 인터페이스를 구현하는 방식의 차이로 인해 람다 표현식은 더 적은 메모리를 사용한다.

변수 캡처 #

람다 표현식은 외부 변수를 캡처하여 사용할 수 있다. 하지만, 익명 내부 클래스는 외부 변수를 캡처하지 않는다. 즉, 람다 표현식은 클로저(closure)를 지원하고, 익명 내부 클래스는 클로저를 지원하지 않는다.

예외 처리 #

람다 표현식은 익명 내부 클래스보다 예외 처리가 간편한다. 람다 표현식은 예외 처리를 명시적으로 하지 않아도 된다. 예외 처리는 람다 표현식을 호출하는 코드에서 처리할 수 있다. 하지만, 익명 내부 클래스는 예외 처리를 명시적으로 해야 한다.

사용 가능한 인터페이스 종류 #

람다 표현식은 함수형 인터페이스를 구현하는데 사용할 수 있다. 하지만, 익명 내부 클래스는 함수형 인터페이스뿐 아니라 추상 클래스와 인터페이스 모두를 구현할 수 있다.

자바 버전 #

람다 표현식은 자바 8부터 지원된다. 하지만, 익명 내부 클래스는 자바 1.1부터 지원된다. 따라서, 이전 버전의 자바를 사용해야 하는 경우에는 익명 내부 클래스를 사용해야 한다.

종합적으로, 람다 표현식과 익명 내부 클래스는 모두 함수형 인터페이스를 구현하는 방법이다. 람다 표현식은 코드의 간결성, 메모리 사용량, 성능, 예외 처리, 가독성 등 다양한 면에서 우수한 장점을 가지고 있다. 하지만, 인터페이스 구현 방식, 변수 캡처, 사용 가능한 인터페이스 종류 등에서 익명 내부 클래스와 차이점이 있다. 따라서 어떤 방식을 선택할지는 상황에 따라 다르게 결정해야 한다.

마무리 #

람다 표현식은 함수형 프로그래밍을 지원하고 코드의 간결성을 높여주는 강력한 기능이다. 하지만, 가독성이 떨어지고 성능이 떨어질 수 있는 단점도 있다. 따라서, 개발자는 적절한 상황에서 람다 표현식을 사용하여 코드의 간결성을 높이는 것이 좋다.

참고자료 #

자바 8 공식 문서 "The Java Tutorials" "Java 8 Lambdas" by Richard Warburton, Mario Fusco Oracle의 공식 자바 블로그 Baeldung 웹사이트의 자바 8 람다 표현식 가이드 DZone 웹사이트의 자바 8 람다 표현식 가이드

관련키워드 #

java, 함수형 인터페이스, lambda

0.0.1_20230725_7_v68