본문 바로가기
Android/Kotlin

[Android/Kotlin] 코틀린에서 비동기 콜백 처리하기: 람다와 인터페이스 방식 비교

by quessr 2024. 10. 30.
반응형

1. 람다 표현식을 사용한 콜백

람다 표현식은 코드가 간결해지고 가독성을 높여주며, 코틀린의 함수형 프로그래밍 스타일을 쉽게 구현할 수 있습니다. 예를 들어, reportEmergency 메서드에서 이벤트 ID를 전달받아 처리하는 방식을 람다로 작성한 코드는 다음과 같습니다.

fun reportEmergency(
    context: Context,
    uuid: String = UserSettingsManager.getUuid(context),
    latitude: Double = 37.585057,
    longitude: Double = 126.885347,
    eventIdCallback: ((Long) -> Unit)? = null // 람다로 콜백 전달
) {
    CoroutineScope(Dispatchers.IO).launch {
        val eventId = 12345L // 예시 ID
        withContext(Dispatchers.Main) {
            eventIdCallback?.invoke(eventId) // 메인 스레드에서 콜백 호출
        }
    }
}

 

위 코드는 eventIdCallback 람다를 통해 결과를 호출 측에서 간단히 처리할 수 있도록 합니다.

ApiSender.reportEmergency(context = this@BleManager) { eventId ->
    Logger.d("Received event ID: $eventId")
}

 

  • 장점
    • 간결성: 람다 표현식으로 콜백을 처리하면 코드가 간단해지고, 가독성이 높아집니다.
    • 유연성: 외부에서 정의된 람다식을 전달하여, 호출 측에서 직접 코드를 실행할 수 있습니다.
  • 단점
    • 확장성 부족: 여러 메서드가 포함된 복잡한 콜백에는 적합하지 않습니다.
    • 단일 작업에 적합: 단일 함수(여기서는 eventIdCallback)만 처리할 때 사용하기 좋습니다.

2. 인터페이스를 통한 콜백 설정

콜백이 여러 메서드로 구성되어 복잡한 구조가 필요한 경우, 인터페이스를 사용한 콜백 설정이 더 적합할 수 있습니다. 인터페이스를 사용하여 콜백을 설정하고, 별도의 메서드를 통해 외부에서 관리할 수 있습니다.

  • 예제: setEventIdCallback() 메서드를 통한 콜백 설정 방식           

1.콜백 인터페이스 정의

interface EventIdCallback {
    fun onEventIdReceived(eventId: Long)
}

 

2. 설정 메서드를 통해 콜백 설정 인터페이스 인스턴스를 reportEmergency 메서드의 매개변수로 받지 않고, 별도의 setEventIdCallback() 메서드를 통해 외부에서 설정할 수 있게 합니다.

object ApiSender {
    private var eventIdCallback: EventIdCallback? = null

    fun setEventIdCallback(callback: EventIdCallback) {
        eventIdCallback = callback
    }

    fun reportEmergency(context: Context) {
        CoroutineScope(Dispatchers.IO).launch {
            val eventId = 12345L // 예시 ID
            withContext(Dispatchers.Main) {
                eventIdCallback?.onEventIdReceived(eventId)
            }
        }
    }
}

 

3. 다른 클래스에서 콜백 설정

class ReportActivity : AppCompatActivity(), EventIdCallback {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        ApiSender.setEventIdCallback(this)
        ApiSender.reportEmergency(this)
    }

    override fun onEventIdReceived(eventId: Long) {
        Log.d("ReportActivity", "Received event ID: $eventId")
    }
}

 

  • 장점
    • 유연한 콜백 설정: 콜백을 별도의 메서드로 설정할 수 있어 코드가 깔끔해지고, 필요한 시점에 설정 및 해제할 수 있습니다.
    • 복잡한 구조에 적합: 콜백에 여러 메서드가 필요한 경우, 인터페이스로 처리할 수 있어 확장성이 좋습니다.
  • 단점
    • 메모리 누수 위험: 설정한 콜백을 명확히 해제하지 않으면, 메모리 누수가 발생할 수 있습니다.
    • 상태 관리 필요: 콜백 설정과 해제를 명확히 관리하지 않으면, 예상치 못한 동작이 발생할 수 있습니다.

결론

  • 람다 표현식은 단일 작업을 처리하는 간단한 콜백을 전달할 때 유용합니다.
  • 인터페이스 콜백은 여러 작업을 처리해야 하거나, 구조가 복잡한 경우에 적합합니다.

두 가지 방식을 상황에 맞게 활용하면, 비동기 작업을 더욱 효과적으로 관리하고 유지보수성을 높일 수 있습니다

반응형