프로그래밍 언어/Java

람다식(Lambda Expressions)의 메소드 참조 :: (JAVA)

제이온 (Jayon) 2021. 1. 3.

안녕하세요? 코딩 중독입니다.

 

오늘은 람다식을 간소화할 수 있는 메소드 참조에 대해서 알아 보겠습니다.

 

 

메소드 참조란?

메소드 참조는 말 그대로 메소드를 참조해서 매개 변수의 정보 및 리턴 타입을 알아내어, 람다식에서 불필요한 매개 변수를 제거하는 것을 말합니다. 람다식은 종종 기존 메소드를 단순히 호출만 하는 경우가 많은데, 예를 들어 두 개의 값을 받아 작은 수를 리턴하는 Math 클래스의 min() 정적 메소드를 호출하는 람다식은 다음과 같습니다.

 

 

(x, y) -> Math.min(x, y)

 

 

이때, 람다식은 단순히 두 개의 값을 Math.min() 메소드의 매개값으로 전달만 하기 때문에 메소드 참조를 이용하여 아래와 같이 코드를 줄일 수 있습니다.

 

 

Math :: min;

 

 

만약, 이것을 함수적 인터페이스에 담고 싶다면 IntBinaryOperator 인터페이스를 사용하면 됩니다. 이것은 두 개의 int 매개값을 받아 int 값을 리턴하기때문입니다.

 

 

IntBinaryOperator operator = Math :: min;

 

 

그리고 IntBinaryOperator 인터페이스에서는 applyAsInt() 메소드가 있는데, 이 메소드를 활용하여 연산한 값을 int 값으로 리턴이 가능합니다.

 

 

정적 메소드와 인스턴스 메소드 참조

정적 메소드를 참조할 경우에는 클래스 이름 뒤에 더블 콜론 연산자인 :: 기호를 붙이고 정적 메소드 이름을 기술하면 됩니다. "클래스 :: 메소드"와 같이 사용하는 것이죠.

 

반대로, 인스턴스 메소드를 참조할 경우에는 먼저 객체를 생성한 다음 참조 변수 뒤에 :: 기호를 붙이고 인스턴스 메소드 이름을 기술하면 됩니다. "참조변수 :: 메소드"와 같이 사용하는 것이죠.

 

 

정적 메소드와 인스턴스 메소드를 참조하는 예시를 하나 봅시다.

 

 

 

 

먼저, Calculator 클래스를 만들고 그 안에 동일한 작업을 하는 정적 메소드와 인스턴스 메소드를 정의하였습니다.

 

 

 

 

그리고 위와 같이 덧셈을 수행하도록 코드를 작성하였습니다. 출력 결과는 각각 9, 11이 될 것입니다.

 

 

매개 변수의 메소드 참조

위에서는 메소드가 모두 외부의 클래스 멤버였습니다. 이번에는 람다식의 매개 변수의 메소드를 참조하는 경우에 대해서 알아봅시다. 예시를 통해 이해해 봅시다.

 

 

 

 

위 코드는 특정 두 문자열이 동일한지 아닌지 검사하는 코드입니다. 여기서 ToIntBitFunction 인터페이스는 함수적 인터페이스이고, 두 매개값을 받은 후 int 값을 리턴하는 역할을 합니다. 출력 결과로는 전자는 동일하고, 후자는 동일하지 않다고 나올 것입니다.

 

 

생성자 참조

마지막으로 생성자 참조입니다. 생성자를 참조한다는 것은 객체를 생성하는 것인데, 단순히 객체를 생성하고 리턴하도록 구성된 람다식은 생성자 참조로 변환이 가능합니다. 예를 들어, '(a, b) -> new Student(a, b)'는 'Student :: new'로 바꿀 수 있습니다.

 

이때, 주의할 점이 매개 변수로 들어오는 개수에 따라서 다른 생성자를 접근한다는 것입니다. 아래 예시 코드를 살펴봅시다.

 

 

 

 

Student 클래스의 멤버 변수로는 String 타입의 name과 country가 있고, name을 매개 변수로 하는 생성자와 name과 country를 매개 변수로 하는 생성자가 존재합니다.

 

여기서 Function<T, R> 인터페이스는 함수적 인터페이스로, 객체 T를 객체 R로 변환하는 역할을 하고, BiFunction<T, R, V>는 객체 T와 R을 객체 V로 변환하는 역할을 합니다.

 

생성자 참조는 Student :: new로 코드는 같지만, 명시하는 함수적 인터페이스의 타입에 따라 Student에서 다른 생성자를 호출할 수 있습니다.

 

 

정리

지금까지 람다식을 더 간결하게 사용할 수 있는 메소드 참조에 대해서 알아 보았습니다. 중간 중간 여러 가지 함수적 인터페이스가 나오는데, 주요 함수적 인터페이스를 묶어서 다음 포스팅에서 설명하도록 하겠습니다.

 

 

참고 서적

이것이 자바다. - 저자 신용권

댓글

추천 글