glenn-syj / more-effective-java

이펙티브 자바를 읽으며 자바를 더 효율적으로 공부합니다
4 stars 5 forks source link

[MEJ-010] 함수형 인터페이스 IntPredicate #188

Closed glenn-syj closed 2 weeks ago

glenn-syj commented 1 month ago

based on: #183 by @undeadtimo

들어가며

글을 읽으면서, 함수형 인터페이스에 대해서 조금은 알게 되었는데요. 사실 IntPredicate에 대해서, 대략적으로 Int 자료형에 대한 판단이 이루어지는가? 정도만 추측하고 넘어갔었는데요. 이번에는 간단하게 IntPredicate에 대해 알아보려고 합니다.

함수형 인터페이스: IntPredicate

IntPredicate는 함수형 인터페이스의 대표적인 예시인데요. 함수형 인터페이스는 단 하나의 추상 메서드만을 가집니다. IntPredicate도 마찬가지입니다. 간단하게 코드를 살펴봅시다.

@FunctionalInterface
public interface IntPredicate {
    boolean test(int value);

    default IntPredicate and(IntPredicate other) {
        return (value) -> test(value) && other.test(value);
    }

    default IntPredicate or(IntPredicate other) {
        return (value) -> test(value) || other.test(value);
    }

    static IntPredicate isEqual(int target) {
        return (value) -> value == target;
    }
}

default가 붙어있지 않고, boolean을 반환하는 test 메소드가 추상메서드입니다. 다른 메서드들은 디폴트 메서드입니다. and와 or은 논리연산을 진행할 수 있도록 돕고, isEqual은 일치 여부를 확인합니다. 대표적으로, and를 이용하는 코드만 우선적으로 살펴보겠습니다. (chatGPT에 의해 생성된 코드입니다)

public class IntPredicateAndExample {
    public static void main(String[] args) {
        IntPredicate isEven = (int value) -> value % 2 == 0;
        IntPredicate isPositive = (int value) -> value > 0;

        IntPredicate isPositiveAndEven = isEven.and(isPositive);

        System.out.println("Is 4 positive and even? " + isPositiveAndEven.test(4)); // true
        System.out.println("Is -4 positive and even? " + isPositiveAndEven.test(-4)); // false
        System.out.println("Is 5 positive and even? " + isPositiveAndEven.test(5)); // false
    }
}

단순히 조건문을 나열하거나 boolean값만을 변수에 할당하거나, 단순히 int 자료형의 검사를 위해 클래스 메서드를 만들지 않아도 됩니다.

나가며

이번 장에서는 내용도 내용이지만, 이펙티브 자바에서 내내 등장하던 함수형 인터페이스의 정의와 쓰임을 엿볼 수 있어 좋았습니다.

undeadtimo commented 1 month ago

저는 서로 다른 함수형 인터페이스를 같은 위치의 인수로 받는 메서드에 대해 집중하여 탐구하였지만 IntPredicate에 대해서는 이러한 함수형 인터페이스가 존재하는지만 인식하고 넘어갔습니다.

하지만 glenn-syj님께서 IntPredicate의 추상 메서드 및 디폴트 메서드에 대해 정리하고, 그 쓰임새를 알려주어 IntPredicate에 대해 알 수 있게 되었습니다.

비록 보여주신 예제에서는 디폴트 메서드인 and 에 대해서만 사용하는 것이 나왔지만, 같은 방식으로 or과 isEqual 또한 사용할 수 있음을 알게 되어 쉽게 IntPredicate에 대해 이해하게 되었습니다.