본문 바로가기

Programming/JAVA

람다식(4) - 표준 API의 함수적 인터페이스 8 : 디폴트 메서드 and(), or(), negate() 그리고 정적 메서드 isEqual() 2

JAVA Logo image

 

 

 

앞서서 우리는 Predicate<T> 함수적 인터페이스가 제공하는 디폴트 메서드 and( ), or( ), negate( )를 살펴보았습니다.

 

 

 

람다식(4) - 표준 API의 함수적 인터페이스 8 : 디폴트 메서드 and(), or(), negate() 그리고 정적 메서드

이번 아티클에서는 우리가 배웠던 함수적 인터페이스 중 Predicate 함수적 인터페이스의 내용을 살펴봅니다. boolean 리턴 기능을 중심으로 설명했었던 것을 기억하실 것입니다. xxxTest() 추상 메서드

nozeroslope.tistory.com

 

 

그런데 Predicate<T> 함수적 인터페이스는 디폴트 메서드 외에 정적 메서드 isEqual( ) 메서드를 추가로 제공합니다. 다소 헷갈릴 수 있는 개념이자 사용법을 갖고 있는데, 간단하게 사용법을 확인해 보도록 하겠습니다. 

 

정적 메서드 isEqual( )에 대해서 살펴보기 위해서는, 우선 선행적으로 이해하고 있어야 하는 메서드가 있습니다. 바로 java.util.Objects.equals( )죠.

 

 

Objects (Java Platform SE 8 )

Generates a hash code for a sequence of input values. The hash code is generated as if all the input values were placed into an array, and that array were hashed by calling Arrays.hashCode(Object[]). This method is useful for implementing Object.hashCode()

docs.oracle.com

 

뜬금 없이 왜 메서드 equals( )를 왜 갖고 나왔는지 의아하시겠지만, 정적 메서드 isEqual의 동작이 이 equals( )를 기반으로 이루어지기 때문입니다. 간단한 메서드이지만 혹시라도 잊고 있다면 이번 아티클의 내용을 이해하기 힘들어집니다. 

 

 

 


 

 

기본적으로 정적 메서드 isEqual( )은 targetObjectsourceObject 두 가지를 비교하는 동작을 하게 됩니다. isEqual( )에서 targetObject를 인자로 받고 test( )에서 sourceObject를 인자로 받게 되는데요, 사용법이 헷갈릴 수 있으니 기본 폼을 아래와 같이 살펴보겠습니다. 

 

Predicate<Object> predicate = Predicate.isEqual(targetObject);
boolean result = predicate.test(sourceObject);

/* 사실상 Objects.equals(sourceObject, targetObject)를 실행한다.
   즉, targetObject와 sourceObject에 대해서 동등 비교를 하게 되는 것! */

 

실제로는 Objects.equals(souceObject, targetObject)가 실행되는 개념이라고 했죠? 실행에 따른 리턴 값은 아래와 같이 생성됩니다. 

 

sourceObject targetObject 리턴 값
null null true
not null null false
null not null false
not null not null sourceObject.equals(targetObject)의 리턴 값

 

import java.util.function.Predicate;

public class ExampleMain {
	public static void main(String[] args) {
		Predicate<String> predicate;
		
		predicate = Predicate.isEqual(null);
		System.out.println("null, null: " + predicate.test(null));
		
		predicate = Predicate.isEqual("Swings");
		System.out.println("null, Swings: " + predicate.test(null));
		
		predicate = Predicate.isEqual("null");
		System.out.println("Swings, null: " + predicate.test("Swings"));
		
		predicate = Predicate.isEqual("Swings");
		System.out.println("Swings, Swings: " + predicate.test("Swings"));
	}
}

/* 출력
null, null: true
null, Swings: false
Swings, null: false
Swings, Swings: true
*/