본문 바로가기

Programming/JAVA

람다식(5) - 메서드 참조 3 : 파라미터의 메서드 참조

JAVA logo image

 

 

 

우리가 참조하게 되는 메서드의 경우, 람다식 외부의 어떤 클래스의 멤버일 수도 있으며 람다식에서 제공되는 파라미터의 멤버일 수도 있습니다. 우리가 앞서 살펴본 아티클에서는 람다식 외부의 클래스 멤버인 메서드를 호출하는 경우를 살펴보았습니다. 

 

 

람다식(5) - 메서드 참조 2 : 정적 메서드, 인스턴스 메서드 참조

앞서 살펴본 메서드 참조의 개념을 활용해서 정적(static) 메서드를 참조하는 경우와 인스턴스 메서드를 참조하는 경우를 각각 살펴보도록 하겠습니다. 람다식(5) - 메서드 참조 1 : 메서드 참조의

nozeroslope.tistory.com

 

이번에는 람다식 자체에서 제공되는 파라미터의 메서드를 호출해서 다른 파라미터를 인자 값으로 사용하는 경우도 있습니다. 이를 테면 파라미터 a의 메서드를 호출해서, 파라미터 b를 해당 메서드의 인자 값으로 사용하는 경우가 있겠죠? 이는 아래와 같이 표현할 수 있습니다. 

 

(a, b) -> { a.instanceMethod(b) };

 

만일 이런 경우를 메서드 참조로 표현하면 아래와 같습니다. 

 

클래스명 :: instanceMethod

 

이 경우는 정적 메서드 참조와 동일한 형태로 작성하게 됩니다. 하지만 이 경우는 실제로 a의 인스턴스 메서드가 참조되므로 전혀 다른 코드가 실행됩니다. 이론만으로는 다소 감을 잡기 어려울 수 있으니, 바로 예제를 살펴보도록 하겠습니다. 

 

 


 

 

우선 이 예제에서는 두 개의 스트링 문자열을 비교합니다. 여기서 비교할 경우에는 대소문자는 무시하고, 동일한 알파벳으로 이루어진 문자열인지를 비교하게 됩니다. 여기서 두 개의 스트링 비교를 위한 메서드는 String 클래스의 인스턴스 메서드인 compareToIgnoreCase( )입니다. 

 

여기서 a.compareToIgnoreCase(b)로 호출할 경우, 두 개가 동일하면 0 / a가 b보다 사전 순으로 먼저 오면 음수 / a가 b보다 사전 순으로 나중에 오면 양수를 리턴하게 됩니다. 함수적 인터페이스는 String 두 개를 인자로 받아 int를 리턴하는 ToIntBiFunction<String, String> 입니다. 

 

import java.util.function.ToIntBiFunction;

public class ExampleMain {
	public static void main(String[] args) {
		
		ToIntBiFunction<String, String> function;
		
		function = (a, b) -> a.compareToIgnoreCase(b);
		print(function.applyAsInt("Swings", "SWINGS"));
		
		function = String :: compareToIgnoreCase;
		print(function.applyAsInt("Swings", "SWINGS"));
		
	}
	
	public static void print(int order) {
		if(order < 0) {
			System.out.println("사전순으로 먼저");
		} else if(order == 0) {
			System.out.println("동일한 문자열");
		} else {
			System.out.println("사전순으로 나중");
		}
	}
}

/* 출력
동일한 문자열
동일한 문자열
*/