본문 바로가기
Language/Kotlin

Predicate란?

by 시니성 2023. 8. 29.

Predicate는 수학적으로 주어진 조건을 만족하는지 아닌지를 테스트하는 함수나 표현식을 의미합니다. 프로그래밍 컨텍스트에서는 보통 어떤 값을 입력으로 받아 Boolean 값을 반환하는 함수를 가리킵니다.
키워드(예약어)는 아니지만 많이 통용되는 용어 입니다.

코틀린에서는 Predicate를 (T) -> Boolean 형태의 함수 타입으로 표현합니다. 여기서 T는 어떤 타입의 입력값이던 상관 없으며, 함수는 이 입력값이 어떤 조건을 만족하는지 (true) 아닌지 (false)를 반환합니다.

가상 시나리오

쇼핑몰 앱에서 특정 조건을 만족하는 상품들만을 필터링하여 보여주려고 합니다. 사용자는 다음과 같은 조건들로 상품들을 필터링할 수 있습니다:

  1. 가격이 10,000원 이하인 상품
  2. 별점이 4.5 이상인 상품
  3. 리뷰 수가 100개 이상인 상품

이를 Predicate를 활용하여 구현해보겠습니다.

예시 코드

// 상품 클래스 정의
data class Product(
    val name: String,
    val price: Int,
    val rating: Double,
    val reviewCount: Int
)

fun main() {
    // 몇몇 상품 예시
    val products = listOf(
        Product("상품A", 5000, 4.7, 50),
        Product("상품B", 15000, 4.3, 120),
        Product("상품C", 9500, 4.9, 300),
        Product("상품D", 12000, 4.2, 70)
    )

    // 조건(Predicate) 정의
    val isCheap: (Product) -> Boolean = { it.price <= 10000 }
    val isHighRated: (Product) -> Boolean = { it.rating >= 4.5 }
    val isPopular: (Product) -> Boolean = { it.reviewCount >= 100 }

    // 상품 필터링 후 출력
    val cheapProducts = products.filter(isCheap)
    println("가격이 10,000원 이하인 상품: $cheapProducts")

    val highRatedProducts = products.filter(isHighRated)
    println("별점이 4.5 이상인 상품: $highRatedProducts")

    val popularProducts = products.filter(isPopular)
    println("리뷰 수가 100개 이상인 상품: $popularProducts")
}

주석 설명:

  • Product 클래스를 통해 상품을 정의합니다. 각 상품은 이름, 가격, 별점, 리뷰 수를 가지고 있습니다.
  • isCheap, isHighRated, isPopular 함수를 통해 각각의 조건을 Predicate로 정의합니다.
  • filter 함수를 사용하여 조건에 맞는 상품들만 필터링하여 출력합니다.

이처럼 Predicate는 조건에 따라 데이터를 필터링하거나, 결정을 내리는 등의 용도로 사용될 수 있습니다.