Callback

콜백(CallBack)은 어떤 함수의 파라미터로 들어오는 함수입니다.

특정 함수의 파라미터로 넘겨받아, 특정 작업이 끝난 뒤에 콜백 함수를 호출하여 특정 작업이 끝났을 때의 이벤트에 대한 처리를 할 수 있습니다.

대표적인 예로, 안드로이드의 클릭 리스너가 있습니다. 사용자의 클릭을 감지하면 onClickListener를 호출하여 사용자가 클릭에 대한 이벤트를 처리할 수 있도록 하는 것입니다.

쉽게 이야기 하자면 특정 작업이 끝났다는 것을 알려주기 위해 사용됩니다.

오늘은 코틀린의 인터페이스를 사용하여 특정 범위 내의 소수들을 출력하는 코드를 작성해볼것입니다.

인터페이스 작성

소수를 판별하기위해 콜백 인터페이스를 작성합니다.

interface PrimeCallBack {
    fun onPrimeCatched(primeNumber: Int)
}

함수 작성

소수를 판별하는 함수를 작성하고, 소수로 판별이 되면 콜백함수를 호출하여 알려줍니다.

fun catchPrime(callback: PrimeCallBack, range: Int) {
    (1..range).forEach { num ->
        // 소수라고 판별되면 힘껏 외치자.
        if (isPrime(num)) callback.onPrimeCatched(num)
    }
}
fun isPrime(num: Int): Boolean {
    for (i in 2..num / 2) {
        if (num % i == 0) return false
    }
    return true
}

콜백으로 넘어온 소수 출력

메인 함수에서 다음과 같이 catchPrime함수에 콜백을 등록(register)해줍니다. 이렇게 하면 catchPrime함수가 소수를 판별 하고 콜백 함수를 호출할 때마다 onPrimeCatched 오버라이드 함수 안에 있는 내용이 실행됩니다.

fun main() {
    catchPrime(object : PrimeCallBack {
        override fun onPrimeCatched(primeNumber: Int) {
            println("CatchedPrimeNumber: $primeNumber")
        }

    }, range = 100)
}

결과 값

특정 값이 소수로 판별될 때마다 해당 값이 잘 넘어가는 것을 확인할 수 있다.

CatchedPrimeNumber: 1
CatchedPrimeNumber: 2
CatchedPrimeNumber: 3
CatchedPrimeNumber: 5
CatchedPrimeNumber: 7
CatchedPrimeNumber: 11
CatchedPrimeNumber: 13
CatchedPrimeNumber: 17
CatchedPrimeNumber: 19
CatchedPrimeNumber: 23
CatchedPrimeNumber: 29
CatchedPrimeNumber: 31
CatchedPrimeNumber: 37
CatchedPrimeNumber: 41
CatchedPrimeNumber: 43
CatchedPrimeNumber: 47
CatchedPrimeNumber: 53
CatchedPrimeNumber: 59
CatchedPrimeNumber: 61
CatchedPrimeNumber: 67
CatchedPrimeNumber: 71
CatchedPrimeNumber: 73
CatchedPrimeNumber: 79
CatchedPrimeNumber: 83
CatchedPrimeNumber: 89
CatchedPrimeNumber: 97

코틀린 고차함수 활용

람다를 인자로 받거나 반환하는 고차함수를 통하여 더 간결하게 표현할 수 있습니다.

fun main() {
	// 코드가 간결해진다.
    catchPrimeHigh(range = 100) { num ->
        println("CatchedPrimeNumber: $num")
    }
}

fun catchPrimeHigh(range: Int, callback: (Int) -> Unit) {
    (1..range).forEach { num ->
        // 소수라고 판별되면 힘껏 외치자.
        if (isPrime(num)) callback(num)
    }
}

fun isPrime(num: Int): Boolean {
    for (i in 2..num / 2) {
        if (num % i == 0) return false
    }
    return true
}

Source Code

interface PrimeCallBack {
    fun onPrimeCatched(primeNumber: Int)
}
fun main() {
    // 1. 인터페이스 사용
    catchPrime(object : PrimeCallBack {
        override fun onPrimeCatched(primeNumber: Int) {
            println("CatchedPrimeNumber: $primeNumber")
        }

    }, 100)
    
    // 2. 고차함수 사용
    catchPrimeHigh(range = 100) { num ->
        println("CatchedPrimeNumber: $num")
    } 
}
fun catchPrime(callback: PrimeCallBack, range: Int) {
    (1..range).forEach { num ->
        // 소수라고 판별되면 힘껏 외치자.
        if (isPrime(num)) callback.onPrimeCatched(num)
    }
}

fun catchPrimeHigh(range: Int, callback: (Int) -> Unit) {
    (1..range).forEach { num ->
        // 소수라고 판별되면 힘껏 외치자.
        if (isPrime(num)) callback(num)
    }
}
fun isPrime(num: Int): Boolean {
    for (i in 2..num / 2) {
        if (num % i == 0) return false
    }
    return true
}

0개의 댓글