- 서론
편의성 때문에 자주 사용하는 문법 중 하나가 람다식이다. 어느날 신입 개발자가 람다식에 대해서 물어보았다.
사용 방법과 덫붙여, 작성한 코드를 람다식으로 바꿔보면서 설명해 주었다. 그리고 어디에 어떻게
람다식을 사용할 수 있는지도 첨언하였다.
마지막으로 함수형 인터페이스와함수 디스크립터에 대해서 설명하려고 했는데기억이 잘 안나는 나 ㅠㅠ
나 스스로도 명확히 알고 있지 못하고 있다는 것을 깨달아버렸다.
남에게 설명할 수 있어야 확실이 알게 된 것이라는 말이 있듯이 이번기회에 자바 람다식과 스트림, 함수형 인터페이스, 성능 비교 등 관련된 개념들을 하나씩 정리해보는 시간을 갖아보려고 한다.
'ChatGPT' 와 도서 '모던 자바 인 액션' 을 주로 참고하여 정리할 예정이다.퓨전을 하면 전투력이 몇배는 늘어난다 - 람다 표현식이란?
람다 표현식은 자바 8에서 도입된 개념으로, 함수형 프로그래밍에서 영감을 받아 나온 것이다.
이는 익명 함수를 간결하게 표현하는 방법으로, 기존의 자바 코드를 더 간편하고 가독성 있게 만들어준다.
그렇다면, 람다의 특징은 어떤것들이 있을까?
● 익명함수 : 보통의 메서드(함수)들과 달리 이름이 필요없다.
● 함수 : 메서드를 변수처럼 다룰 수 있게 한다. 특정 클래스에 종속되지 않으므로 함수라고 부른다.
또한 람다 표현식은 함수형 프로그래밍 스타일을 자바에 도입하는데 중요한 역할을 한다.
함수를 일급 시민으로 취급하여 함수를 매개변수로 전달하거나 반환하는 등의 함수형 프로그래밍의
특징을 자바에서도 쉽게 사용할 수 있게 해준다.
● 전달 : 람다 표현식을 메서드 인수로 전달되거나, 메서드의 결과로 반환하여 변수로 저장할 수 있다.
즉 메서드를 메 개변수로 전달하는 등의 유연한 사용이 가능하게 한다.
● 간결성 : 코드를 간결하게 만들어 준다. 기존의 익명 클래스를 사용하여 함수형 인터페이스를 구현할 때,
코드가 상 당히 길고 복잡해지는 경우가 많았는데, 람다 표현식은 이러한 복잡성을 제거하고 코드를
더 간결하게 만들어 가독성을 향상시킨다.
람다식 예시와 사용방법
//1. 기존의 익명 클래스를 사용한 구현 Runnable runnable1 = new Runnable() { @Override public void run() { System.out.println("Hello, world!"); } }; //2. 람다 표현식을 사용한 간단한 구현 Runnable runnable2 = () -> System.out.println("Hello, world!");
기존에 1로 표현하던 방식을 람다식을 이용하여 2로 바꾸어 보았다. 코드가 짧아져 훨씬 간결해 보인다. 람다 표현식의 기본 문법은 다음과 같다.
예제를 좀더 살펴보면서 람다식에 익숙해져 보자(parameters) -> expression // (parameters) : 메서드의 매개변수를 나타낸다. // -> : 람다 화살표로, 매개변수와 표현식을 연결한다. // expression: 메서드의 몸체에 해당하는 표현식. 람다의 반환값에 해당된다.
- 람다 표현식 예제
여러가지 람다 표현식의 예제를 좀더 살펴보도록 하자
//1. String 형식의 파라미터 하나를 가지며 int를 반환한다 // 람다 표현식에는 return이 함축되어 있으므로 명시적으로 사용하지 않아도 된다 (String s) -> s.length(); //2. Apple 형식의 파라미터 하나를 가지며 사과가 150보다 무거운지 boolean을 반환한다 (Apple a) -> a.getWeight() > 150; //3. int 형식의 파라미터 두 개를 가지며 리턴값이 없다(return void) // 여러 행의 문장을 포함할 수도 있다 (int x, int y) -> { System.out.println("Result: "); System.out.println(x + y); } //4. 파라미터가 없으며 int 42를 반환한다 () -> 42; //5. Apple 형식의 파라미터 두개를 가지며 int(두 사과의 무게 비교 결과)를 반환한다 (Apple a1, Apple a2) -> a.getWeight().campareTo(a.getWeight());
- 예시
아래의 코드를 보면 주석으로 표시된 1과 2에서 람다 표현식을 사용하고 있다.
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; // Person 클래스 정의 class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } public class LambdaExample { public static void main(String[] args) { // Person 객체 생성 Person person1 = new Person("Alice", 25); Person person2 = new Person("Bob", 30); Person person3 = new Person("Charlie", 22); // Person 객체를 담은 리스트 생성 List<Person> people = Arrays.asList(person1, person2, person3); //1. 람다 표현식을 사용하여 나이순으로 정렬 people.sort((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge())); // 정렬된 결과 출력 System.out.println("People sorted by age:"); for (Person person : people) { System.out.println(person.getName() + " - " + person.getAge() + " years old"); } //2. 람다 표현식을 사용하여 각 사람의 이름을 대문자로 매핑 List<String> upperCaseNames = people.stream() .map(person -> person.getName().toUpperCase()) .collect(Collectors.toList()); // 매핑된 결과 출력 System.out.println("\nNames in uppercase:"); for (String name : upperCaseNames) { System.out.println(name); } } }
1 에서는 함수형 인터페이스인 'Comparator'의 'compare'를 사용하여 람다 표현식을 사용하였고,
2 에서는 Stream API와 함께 사용하여 가독성을 높혔다.
다음글에서는 함수형 인터페이스에 대하여 알아보고, 자바 람다식이 함수형 인터페이스와 함께
사용되는 문맥에 대해 정리하겠다. 그리고 Stream API에 대해서도 좀더 자세히 알아보겠다.
'Java' 카테고리의 다른 글
Singleton (0) | 2024.03.09 |
---|---|
불변 객체(Immutable Object) (0) | 2024.03.04 |
Builder Pattern (빌더 패턴) (0) | 2024.03.02 |
BigInteger.valueOf와 정적 팩토리 메서드 (0) | 2024.02.29 |
람다 표현식 - 2. 자바 함수형 인터페이스 (0) | 2023.12.05 |