람다식
람다식(Lambda Expression)은 자바에서 "익명 함수(이름이 없는 함수)" 를 표현하는 방법입니다. 코드에서 간결하게 함수를 정의할 수 있게 해주며, 특히 한 번만 사용되는 간단한 함수를 작성할 때 유용합니다.
람다식은 보통 함수형 인터페이스(메서드를 하나만 가지는 인터페이스)를 구현할 때 쓰입니다. 예를들어, Runnable 인터페이스나 Comparator 인터페이스는 각각 run()과 compare() 라는 하나의 메서드만을 가지는 함수형 인터페이스입니다.
람다식 기본 구조
람다식의 기본 구조는 아래와 같습니다.
(매개변수) -> { 실행 코드 }
- (매개변수) : 함수의 입력 파라미터를 작성합니다. 파라미터가 하나라면 괄호를 생략할 수 있습니다.
- -> : 람다를 나타내는 화살표로, "이것을 입력 받아서 저것을 실행한다"는 의미입니다.
- { 실행 코드 } : 함수가 수행할 코드 블록입니다. 실행 코드가 한 줄이라면 중괄호 {} 를 생략할 수 있습니다.
예제: 리스트의 각 요소를 출력하기
람다식을 사용하여 리스트의 요소를 간단하게 출력하는 예제입니다.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 람다식으로 각 요소 출력
names.forEach(name -> System.out.println(name));
여기서 name -> System.out.println(name) 부분이 람다식입니다. forEach 메서드는 Consumer 함수형 인터페이스를 필요로 하는데, 람다식을 통해 Consumer 의 accept() 메서드를 구현한 것입니다.
예제: 숫자 리스트 필터링
숫자 리스트에서 짝수만 필터링하는 람다식 예제입니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
// 짝수만 필터링하여 출력
numbers.stream()
.filter(n -> n % 2 == 0) // n이 짝수인 경우에만 필터링
.forEach(System.out::println);
n -> n % 2 == 0 은 n을 입력받아 n % 2 == 0 이 참인 경우에만 남기는 람다식 입니다.
::연산자
:: 연산자는 자바에서 메서드 참조를 나타내는 기호입니다. 메서드 참조는 람다식을 더 간단하게 표현하기 위한 방식으로, 이미 존재하는 메서드를 참조하여 사용할 때 유용합니다.
메서드 참조의 사용법
메서드 참조는 람다식처럼 함수형 인터페이스의 인스턴스를 제공하는 방법 중 하나입니다. 일반적으로 다음과 같은 4가지 형태로 사용할 수 있습니다.
- 클래스명::정적 메서드명
- 객체명::인스턴스 메서드명
- 클래스명::인스턴스 메서드명
- 클래스명::new (생성자 참조)
각각을 에시와 함께 설명하겠습니다.
1. 클래스명::정적 메서드명
클래스의 정적 메서드를 사용할 때는 클래스 이름 뒤에 :: 를 붙이고 메서드 이름을 작성합니다. 예를 들어 Integer 클래스의 parseInt 메서드를 참조하려면 Integer::parseInt 로 사용할 수 있습니다.
List<String> numbers = Arrays.asList("1", "2", "3");
numbers.stream()
.map(Integer::parseInt) // 문자열을 정수로 변환
.forEach(System.out::println);
위 예제에서 Integer::parseInt 는 map 메서드 내에서 문자열을 정수로 변환하는 기능을 제공합니다.
2. 객체명::인스턴스 메서드명
이미 생성된 객체의 인스턴스 메서드를 사용할 때는 해당 객체의 이름 뒤에 ::를 붙여서 메서드 이름을 작성합니다.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println); // System.out 객체의 println 메서드를 참조
여기서 System.out::println 은 Systme.out 객체의 println 메서드를 참조하여 각 요소를 출력하게 됩니다.
3. 클래스명::인스턴스 메서드명
특정 클래스의 인스턴스 메서드를 참조할 때 사용합니다. 이 방식은 스트림의 각 요소가 첫 번째 매개변수로 들어갈 때 주로 사용됩니다.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
.map(String::toUpperCase) // 각 문자열을 대문자로 변환
.forEach(System.out::println);
여기서 String::toUpperCase 는 String 클래스의 toUpperCase 메서드를 참조하여 각 문자열을 대문자로 변환합니다.
4. 클래스명::new (생성자 참조)
생성자를 참조할 때는 클래스명::new 를 사용하여 객체를 생성하는 기능을 제공합니다.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
.map(Person::new) // 각 이름으로 새로운 Person 객체를 생성
.forEach(System.out::println);
여기서 Person::new는 Person 클래스의 생성자를 참조합니다. map 메서드의 각 요소가 Person 생성자의 인자로 전달되어 새로운 Person 객체가 생성됩니다.
메서드 참조와 람다식 비교
메서드 참조는 특정 람다식을 더 간결하게 표현할 수 있는 방법 입니다. 예를들어
names.forEach(name -> System.out.println(name));
이 코드는 메서드 참조를 사용하여 다음과 같이 줄일 수 있습니다.
names.forEach(System.out::println);
'서버&백엔드 > 🔥 JAVA' 카테고리의 다른 글
JAVA | StringBuilder (0) | 2024.11.03 |
---|---|
Java | 스트림(Stream) 완전 정복 - 문자형 (0) | 2024.11.03 |
Java | 스트림(Stream) 완전 정복 - 숫자형 (0) | 2024.11.01 |
톰캣 자바 메모리풀 사이즈 설정 (0) | 2024.08.07 |
FTP서버에 파일 저장 (0) | 2024.06.04 |