Java
메소드 참조
뽀루피
2024. 10. 21. 19:38
메소드 참조는 람다 표현식을 더 간결하게 작성할 수 있는 기능이다.
람다 표현식이 단순 기존 메소드를 호출하는 경우 사용할 수 있다.
메소드 참조의 기본 구조
- 클래스 또는 객체 이름
- 이중 콜론(::) 연산자
- 메소드 이름
예시는 다음과 같다.
Integer::parseInt
메소드 참조의 종류
메소드 참조에는 4가지 유형이 있다.
1. 정적 메소드 참조 (Class::staticMethod)
다음과 같은 람다 표현식에 사용할 수 있다.
(String str) -> Integer.parseInt(str)
위의 식은 메소드 참조를 활용하면 다음과 같이 변경된다.
Integer::parseInt
2. 다양한 형식의 인스턴스 메소드 참조 (Class::instanceMethod)
다음과 같은 람다 표현식에 사용할 수 있다.
(String str) -> str.length()
위의 식은 메소드 참조를 활용하면 다음과 같이 변경된다.
String::length
3. 외부 객체의 인스턴스 메소드 참조 (object::instanceMethod)
다음과 같은 람다 표현식에 사용할 수 있다.
// Transaction 객체를 할당받은 expensiveTransaction 지역 변수가 있다 가정
() -> expensiveTransaction.getValue()
위의 식은 메소드 참조를 활용하면 다음과 같이 변경된다.
expensiveTransaction::getValue
4. 생성자 참조 (Class::new)
다음과 같은 람다 표현식에 사용할 수 있다.
// Supplier는 get 추상 메소드를 가지는 () -> T 형태의 함수형 인터페이스이다.
Supplier<Apple> c1 = () -> new Apple();
Apple a1 = c1.get();
위의 식은 메소드 참조를 활용하면 다음과 같이 변경된다.
Supplier<Apple> c1 = Apple::new;
Apple a1 = c1.get();
메소드 참조의 장점
- 가독성 향상: 람다 표현식보다 코드가 더 간결하고 직관적이다.
- 재사용성: 이미 존재하는 메소드를 재사용할 수 있어 중복 코드를 줄일 수 있다.
- 유지보수성: 람다 표현식에 비해, 메소드 참조는 해당 메소드가 무엇을 하는지 명확히 알 수 있어 유지보수성이 좋다.
메소드 참조의 단점
- 메소드 오버라이드 불가 : 기존 메소드를 호출하는 경우에 적합하지만, 동적으로 로직을 변경하거나 추가하는 것은 람다 표현식을 사용하는 것이 낫다.
- 디버깅 어려움 : 람다 표현식과 마찬가지로 디버깅 시 어떤 메소드에서 문제가 일어났는지 확인하기 어렵다.