본문 바로가기
Kotlin 공부 노트

[Kotlin] 예제를 통한 filterIsInstance 알아보기

by 지게요 2026. 7. 16.
728x90
반응형

AI가 작성해 준 코드를 분석하던 중 filterIsInstance라는 함수 키워드를 접했다.
그래서 이거는 무슨 함수가 인가 싶어 찾아보기로 했다.

# filterIsInstance란?

inline fun <R> Array<*>.filterIsInstance(): List<R>
inline fun <R> Iterable<*>.filterIsInstance(): List<R>

 

우선 해당 함수는 Kotlin.collections 패키지 내에 있는 함수이다.

패키지 위치로 추측하자면 당연히 collection에서만 사용되는 함수라고 생각하면 된다.

Returns a list containing all elements that are instances of specified type parameter R.
(지정된 유형 매개변수 R의 인스턴스인 모든 요소를 포함하는 목록을 반환합니다.)

 

코틀린 공식 문서에서는 위와 같이 설명하고 있다.

쉽게 설명하면 리스트에서 특정 타입인 것만 골라내고, 타입도 그 타입으로 바꿔주는 필터 함수라고 생각하면 된다.

# 예제를 통해 알아보기

이번 예제는 여러 데이터형이 담겨 있는 리스트 중 정수만 필터링하는 예제이다.

우선 filterIsInstance 함수를 사용 안 했을때 예시이다.

// 여러 데이터형이 담겨 있는 리스트 변수
val 잡동사니: List<Any> = listOf(1, "안녕", 2, "잘가", 3.14, 4)

val 정수만있는 = 잡동사니
    .filter { it is Int }      // ① Int인 것만 남긴다
    .map { it as Int }         // ② 남은 걸 Int로 캐스팅(형변환)한다
// 결과: [1, 2, 4]

이 처럼 여러 데이터형이 있고 filterIsInstance 함수를 사용 안 했을 때 내가 원하는 데이터를 필터링하기 위해서는 두 단계로 나눠서 진행해야 한다.

  1. filter 함수를 통해 int형만 남긴다. → 이 시점에는 반환 타입이 List <Any>
  2. map 함수를 통해 int형으로 캐스팅 → 최종 반환은 List <Int>

filterIsInstance 함수를 사용했을 때 예시

// 여러 데이터형이 담겨 있는 리스트 변수
val 잡동사니: List<Any> = listOf(1, "안녕", 2, "잘가", 3.14, 4)

val 정수만있는 = 잡동사니.filterIsInstance<Int>()
// 결과: [1, 2, 4]

 

해당 함수를 사용하면 두 단계를 거쳐 원하는 데이터를 필터링하는 방식을 한 번에 처리를 할 수 있다.

만약 나는 Int형이 아닌 String만 뽑고 싶다면 아래와 같이 R 타입에 String을 적어주면 끝이다.

// 여러 데이터형이 담겨 있는 리스트 변수
val 잡동사니: List<Any> = listOf(1, "안녕", 2, "잘가", 3.14, 4)

val 글자만 = 잡동사니.filterIsInstance<String>()
// 결과: ["안녕", "잘가"]

# 그럼 이게 왜 가능하냐?

/**
 * Appends all elements that are instances of specified type parameter R to the given [destination].
 * 
 * @sample samples.collections.Collections.Filtering.filterIsInstanceTo
 */
public inline fun <reified R, C : MutableCollection<in R>> Iterable<*>.filterIsInstanceTo(destination: C): C {
    for (element in this) if (element is R) destination.add(element)
    return destination
}

 

위 해당 코드는 filterIsInstance 함수 내부 계산하는 함수이다.
가장 중요하게 봐야 할 부분은 아래 for문이다.

for (element in this) if (element is R) destination.add(element)
//                        └── ① 거르기 ──┘ └────── ② 담기 ──────┘
//                        둘 다 같은 if 블록 안!

 

그래서 위 함수에서 is로 타입을 확인한 그 블록 안에서(스마트 캐스트가 살아있는 동안) 곧바로 결과 통에 담기 때문에 가능하다.

 

 

참조

https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/filter-is-instance.html

반응형