Java Predicate 살펴보기 C# 개발자가

몬난아·2021년 8월 14일
0

Predicate를 살펴 보았다.

일번에도 저번과 마찬가지로 구현체를 살펴 보았다

마찬가지로 FunctionalInterface이며 test라는 1개의 함수를 구현해야하고
test라고 이름은 만들었지만 실제로는 데이터를 평가하는 함수이니 다른현실적인 이름이 있었으면
좋았을것 같다.

이외에도 default함수로 or, negate, and, isEqual, not이 존재 하고 있으며 해당 함수들의 역활은 아직 코드가 손에 익지 않아 테스트 하지 않았지만 일종에 method chain을 위해 여러개의
평가를 이어서 연속적으로 사용하기 위해서가 아닐까 생각된다.

해당 연속성은 기본역활을 확인한 이후에 다시 작성하는것으로...

기본코드를 보자

public class PredicateDemo implements Predicate<Integer> {
    @Override
    public boolean test(Integer t) {
        if(t % 2 == 0) {
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        System.out.println("---------- functional ------------");
        Predicate<Integer> predicate = new PredicateDemo();
        System.out.println(predicate.test(7));
        System.out.println(predicate.test(6));


        System.out.println("---------- lamda ------------");
        Predicate<Integer> pre1 = i -> (i%2) == 0;
        System.out.println(pre1.test(7));
        System.out.println(pre1.test(6));

    }
}

자바를 하다가보면서 알게된점인데.. 아무 클래스에서나 프로그램 진입점 작성이 가능하다...
너무 적응은 안되지만 테스트 코드를 작성하고 테스트 하기에는 너무 좋다.
잠깐 삼천포로 빠졌지만.. 다시 코드를 살펴보면

처음으로 "functional" 부분을 출력부분은
Predicate를 상속받은 평가 객체 PredicateDemo를 만들고 짝수일때 true, 홀수일때 false를 반환하는 간단한 평가 객체를 생성하였다.

이는 JAVA에 delegate 함수포인터가 없기때문에 함수형 객체를 만드는 원리이다.

다음으로는 "lamda" 부분의 출력부분은 함수 구현체를 제외하고 람다식으로 바로 호출하는 예제를 작성하였다.

해당부분을 C#으로 옮겨서 확인해 보면 다음과 같다.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int, bool> func = (i) =>
            {
                if((i%2) == 0)
                {
                    return true;
                }
                return false;
            };

            Console.WriteLine("------------ delegate -------------");
            Console.WriteLine(func(7));
            Console.WriteLine(func(6));

            Console.WriteLine("------------ lamda -------------");

            Func<int, bool> func2 = i => (i%2) == 0;
            Console.WriteLine(func2(7));
            Console.WriteLine(func2(6));

        }
    }
}

C#의결과도 마찬가지로 차이는 나지 않는다.

Func Delegate를 선어하고 Func의 경우 가장오른쪽이 리턴값이고 왼쪽앞에서부터는
인자가 오는 타입의 순서라고 보면 읽기가 편하다.

예제코드도 쉽게보면 int를 인자로 받고 bool 을 리턴해주는 함수포이터이며 해당 함수포인터의 경우 구지 Func가 아니라도 개발자가 다음과 같이 선언하여 사용하는것도 가능하다.

public delegate bool Test(int i);

Java의 Predicate의 함수 이름인 "Test"를 선언하여 int를 인자로 받고 bool을 리턴하는
Delegate를 선언하였으며 해당 delegate를 활용해도 무방하다.

그게 아니라면 c# 2.0에 이미 generic List의 평가를 위해 다음과 같은코드가 이미 2005년부터 존재하였으니 다음코드를 사용해도 무방하나 기본적으론 대부분 lamda를 사용할 것이라 사용법은 생략 합니다.

public delegate bool Predicate<in T>(T obj);

일단 오늘의 결론을 간단히 내자면
Java Predicate는 C# Func<T, bool> 과 같은 역활을한다. 정도에서 마무리 하겠습니다.

다음번엔 predicate에 있는 or, negate, and, isEqual, not을 살펴볼 예정인데..
느낌은 일종에 c#의 linq쿼리를 interface로 구현을 위해 선언한것으로 생각된다.

profile
잘~ 사는게 목표인사람

0개의 댓글