반응형
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")
}
}
- 장점
- 유연한 콜백 설정: 콜백을 별도의 메서드로 설정할 수 있어 코드가 깔끔해지고, 필요한 시점에 설정 및 해제할 수 있습니다.
- 복잡한 구조에 적합: 콜백에 여러 메서드가 필요한 경우, 인터페이스로 처리할 수 있어 확장성이 좋습니다.
- 단점
- 메모리 누수 위험: 설정한 콜백을 명확히 해제하지 않으면, 메모리 누수가 발생할 수 있습니다.
- 상태 관리 필요: 콜백 설정과 해제를 명확히 관리하지 않으면, 예상치 못한 동작이 발생할 수 있습니다.
결론
- 람다 표현식은 단일 작업을 처리하는 간단한 콜백을 전달할 때 유용합니다.
- 인터페이스 콜백은 여러 작업을 처리해야 하거나, 구조가 복잡한 경우에 적합합니다.
두 가지 방식을 상황에 맞게 활용하면, 비동기 작업을 더욱 효과적으로 관리하고 유지보수성을 높일 수 있습니다
반응형
'Android > Kotlin' 카테고리의 다른 글
[Android/Kotlin] 람다를 사용하는 두 가지 방식: 함수 인자와 마지막 인자 문법 (0) | 2024.09.09 |
---|---|
[Kotlin] Kotlin의 apply 문법 이해하기 (0) | 2024.06.24 |
[Kotlin] 코틀린의 Unit 타입: 무엇이고 어떻게 사용하는가? (0) | 2024.06.14 |
[Kotlin] Kotlin에서 class와 object의 차이점 및 활용 방안: 싱글톤 패턴과 유연성 비교 (0) | 2024.05.28 |
[Kotlin] Kotlin에서의 지연 초기화: lateinit 키워드 이해하기 (0) | 2024.04.30 |