메서드 참조 ::
2024. 11. 22. 22:12ㆍBack-End/JAVA
반응형
Java에서 ::는 메서드 참조(Method Reference)를 나타내는 연산자입니다. 이 연산자는 람다 표현식을 더 간결하고 읽기 쉽게 표현하기 위해 사용됩니다.
1. 메서드 참조의 기본 개념
:: 연산자는 이미 정의된 메서드를 참조하여, 람다 표현식을 간결하게 나타냅니다.
예: String::toUpperCase
- 원래는 다음과 같은 람다 표현식으로 문자열을 대문자로 변환합니다:
list.stream() .map(s -> s.toUpperCase()) .forEach(System.out::println);
- 이를 메서드 참조를 사용하면 더 간결하게 작성할 수 있습니다:
list.stream() .map(String::toUpperCase) .forEach(System.out::println);
2. 메서드 참조의 유형
::는 메서드 참조를 다양한 방식으로 사용할 수 있습니다. 대표적으로 4가지 유형이 있습니다:
(1) 정적 메서드 참조
정적 메서드를 참조하는 경우:
ClassName::staticMethodName
예)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
numbers.stream()
.map(Math::abs) // Math.abs 메서드 참조
.forEach(System.out::println);
(2) 인스턴스 메서드 참조 (특정 객체)
특정 객체의 인스턴스 메서드를 참조하는 경우:
instance::methodName
예)
String prefix = "Hello, ";
Function<String, String> addPrefix = prefix::concat;
System.out.println(addPrefix.apply("World!")); // 출력: Hello, World!
(3) 인스턴스 메서드 참조 (임의 객체)
임의 객체의 인스턴스 메서드를 참조하는 경우:
ClassName::methodName
예)
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
.map(String::toUpperCase) // String의 toUpperCase 메서드 참조
.forEach(System.out::println);
(4) 생성자 참조
생성자를 참조하는 경우:
ClassName::new
예:
Supplier<List<String>> listSupplier = ArrayList::new;
List<String> list = listSupplier.get(); // 새로운 ArrayList 생성
3. 왜 메서드 참조를 사용할까?
- 가독성 향상: 코드가 더 간결하고 직관적입니다.
- 중복 제거: 메서드 이름을 명시하므로, 반복적인 람다 표현식을 줄일 수 있습니다.
- 함수형 프로그래밍에 적합: Java 8 이후 스트림 API와 잘 어울립니다.
4. 메서드 참조 vs 람다 표현식
람다 표현식과 메서드 참조는 대부분 상호교환이 가능합니다.
하지만 메서드 참조를 사용할 수 있을 때는 권장됩니다.
예:
람다 표현식:
list.stream()
.forEach(item -> System.out.println(item));
메서드 참조:
list.stream()
.forEach(System.out::println);
5. 요약
::는 이미 정의된 메서드 또는 생성자를 참조하여 람다를 간결하게 표현하는 방법입니다.
주요 유형:
- 정적 메서드 참조 (ClassName::staticMethod)
- 특정 객체의 인스턴스 메서드 참조 (instance::method)
- 임의 객체의 인스턴스 메서드 참조 (ClassName::method)
- 생성자 참조 (ClassName::new)
메서드 참조를 활용하면 더 간결하고 읽기 쉬운 코드를 작성할 수 있습니다.
반응형
'Back-End > JAVA' 카테고리의 다른 글
@RequiredArgsConstructor와 @Builder와의 차이 (0) | 2025.04.22 |
---|---|
final 필드와 @RequiredArgsConstructor는 왜 같이 쓰는가? (0) | 2025.04.22 |
자바 enum, 상수가 전부가 아니었다 (0) | 2025.04.17 |
Runnable이란? 비동기 워커 설계에서 마주친 첫 스레드 인터페이스 (0) | 2025.03.23 |
Stream() (0) | 2024.11.22 |