본문 바로가기
Projects/ATeen

[Android/Kotlin] filterIsInstance와 firstOrNull을 사용한 개선

by quessr 2024. 8. 12.

오늘은 Kotlin 코드를 리팩토링하여 더 간결하고 명확하게 만드는 방법을 공유하고자 합니다. 주제로는 filterIsInstance와 firstOrNull을 사용하여 객체를 찾고 처리하는 방법을 다루겠습니다.

변경 전 코드

먼저, 기존의 toggleLike 함수 코드는 아래와 같았습니다.

fun toggleLike() {
    val currentItems = _items.value.toMutableList()
    val profileImagesIndex = currentItems.indexOfFirst { it is ProfileDetailModel.ProfileImages }

    if (profileImagesIndex != -1) {
        val profileImages = currentItems[profileImagesIndex] as ProfileDetailModel.ProfileImages
        val isCurrentLiked = profileImages.isLiked
        val updateProfileImages = profileImages.copy(
            likeCount = if (isCurrentLiked) profileImages.likeCount - 1 else profileImages.likeCount + 1,
            isLiked = !isCurrentLiked
        )
        currentItems[profileImagesIndex] = updateProfileImages
        _items.value = currentItems
    }
}

 

이 코드는 ProfileImages 인스턴스를 찾고 해당 인스턴스의 likeCount와 isLiked 값을 토글합니다. 하지만, 더 간결하고 명확하게 작성할 수 있는 방법이 있습니다.

변경 후 코드

새로운 코드는 filterIsInstance와 firstOrNull을 사용하여 개선되었습니다.

fun toggleLike() {
    val currentItems = _items.value.toMutableList()
    val profileImages = currentItems.filterIsInstance<ProfileDetailModel.ProfileImages>().firstOrNull()

    profileImages?.let { item ->
        val isCurrentLiked = item.isLiked
        val updatedProfileImages = item.copy(
            likeCount = if (isCurrentLiked) item.likeCount - 1 else item.likeCount + 1,
            isLiked = !isCurrentLiked
        )

        val index = currentItems.indexOf(item)
        if (index != -1) {
            currentItems[index] = updatedProfileImages
            _items.value = currentItems
        }
    }
}

 

개선된 부분 설명

  1. 객체 찾기:
    - 변경 전: indexOfFirst를 사용하여 ProfileImages 객체의 인덱스를 찾고, 해당 인덱스를 통해 객체에 접근했습니다.
    - 변경 후: filterIsInstance<ProfileDetailModel.ProfileImages>().firstOrNull()를 사용하여 리스트에서 ProfileImages 객체를 직접 찾습니다. 이렇게 하면 코드가 더 간결해지고, 타입 캐스팅을 피할 수 있습니다.
  2. 존재 여부 확인:
    - 변경 전: 인덱스 값이 -1인지 확인하여 객체의 존재 여부를 판단했습니다.
    - 변경 후: firstOrNull()의 결과가 null인지 확인하여 객체의 존재 여부를 판단합니다. 이는 더 Kotlin-idiomatic한 방식입니다.

  3. 객체 업데이트:
    - 변경 전: 찾은 인덱스를 이용해 리스트에서 객체를 업데이트했습니다.
    - 변경 후: filterIsInstance를 사용하여 찾은 객체의 인덱스를 다시 찾아 업데이트합니다.

결론

이번 리팩토링으로 toggleLike 함수가 더 간결하고 이해하기 쉬워졌습니다.
filterIsInstance와 firstOrNull을 사용하여 리스트에서 특정 타입의 객체를 안전하게 찾고 처리하는 방법을 알게 되었고,
이를 통해 코드의 가독성과 유지보수성이 크게 향상 됨을 느낄 수 있었습니다.