단일 요소 가져오기
단일 요소 가져오기
Kotlin 컬렉션은 컬렉션에서 단일 요소를 가져오는 일련의 함수를 제공해요. 이 페이지에서 설명하는 함수는 리스트와 집합 모두에 적용돼요.
출처: Kotlin 공식 문서
본문
리스트의 정의에서 말하듯이 리스트는 순서가 있는 컬렉션이에요. 그래서 리스트의 모든 요소는 참조에 쓸 수 있는 위치(position)를 가져요. 이 페이지의 함수 외에도 리스트는 인덱스로 요소를 가져오고 검색하는 더 넓은 방법들을 제공해요. 자세한 내용은 리스트 전용 연산을 참고하세요.
반면 집합은 정의상 순서가 없는 컬렉션이에요. 다만 Kotlin Set은 요소를 특정 순서로 저장해요. 삽입 순서(LinkedHashSet), 자연 정렬 순서(SortedSet), 또는 다른 순서일 수 있죠. 집합 요소의 순서를 알 수 없는 경우도 있어요. 그럴 때도 요소들은 어쨌든 어떤 순서를 갖고 있으므로, 요소 위치에 의존하는 함수들이 결과를 돌려주긴 해요. 다만 사용된 Set의 구체적인 구현을 모르는 호출자에게는 그 결과가 예측 불가능하답니다.
위치로 가져오기
특정 위치의 요소를 가져올 때는 elementAt() 함수가 있어요. 정수 인자로 호출하면 주어진 위치의 컬렉션 요소를 받아요. 첫 번째 요소는 위치 0, 마지막 요소는 (size - 1)이에요.
elementAt()은 인덱스 접근을 제공하지 않거나, 인덱스 접근을 제공한다고 정적으로 알려지지 않은 컬렉션에 유용해요. List의 경우에는 인덱스 접근 연산자(get() 또는 [])를 쓰는 게 더 관용적이에요.
fun main() {
//sampleStart
val numbers = linkedSetOf("one", "two", "three", "four", "five")
println(numbers.elementAt(3))
val numbersSortedSet = sortedSetOf("one", "two", "three", "four")
println(numbersSortedSet.elementAt(0)) // elements are stored in the ascending order
//sampleEnd
}
컬렉션의 첫 번째와 마지막 요소를 가져오는 유용한 별칭(alias)도 있어요: first()와 last().
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.first())
println(numbers.last())
//sampleEnd
}
존재하지 않는 위치의 요소를 가져올 때 예외를 피하려면 elementAt()의 안전 변형을 쓰세요.
elementAtOrNull()은 지정된 위치가 컬렉션 범위를 벗어나면 null을 돌려줘요.elementAtOrElse()는 추가로Int인자를 컬렉션 요소 타입의 인스턴스로 매핑하는 람다를 받아요. 범위를 벗어난 위치로 호출하면elementAtOrElse()는 주어진 값에 대한 람다의 결과를 돌려줘요.
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.elementAtOrNull(5))
println(numbers.elementAtOrElse(5) { index -> "The value for index $index is undefined"})
//sampleEnd
}
조건으로 가져오기
first()와 last() 함수는 주어진 조건(predicate)과 일치하는 요소를 컬렉션에서 검색하게도 해줘요. 컬렉션 요소를 검사하는 조건으로 first()를 호출하면, 조건이 true가 되는 첫 요소를 받아요. 반대로 조건과 함께 last()를 쓰면 일치하는 마지막 요소를 돌려줘요.
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.first { it.length > 3 })
println(numbers.last { it.startsWith("f") })
//sampleEnd
}
조건과 일치하는 요소가 없으면 두 함수 모두 예외를 던져요. 그걸 피하려면 대신 firstOrNull()과 lastOrNull()을 쓰세요. 일치하는 요소가 없으면 null을 돌려줘요.
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.firstOrNull { it.length > 6 })
//sampleEnd
}
이름이 상황에 더 잘 맞는다면 별칭을 써도 돼요.
firstOrNull()대신find()lastOrNull()대신findLast()
fun main() {
//sampleStart
val numbers = listOf(1, 2, 3, 4)
println(numbers.find { it % 2 == 0 })
println(numbers.findLast { it % 2 == 0 })
//sampleEnd
}
셀렉터로 가져오기
요소를 가져오기 전에 컬렉션을 매핑해야 한다면 firstNotNullOf() 함수가 있어요. 이 함수는 두 동작을 합쳐요.
- 셀렉터 함수로 컬렉션을 매핑
- 결과에서 첫 번째 non-null 값을 돌려줌
결과 컬렉션에 non-null 요소가 없으면 firstNotNullOf()는 NoSuchElementException을 던져요. 그 경우 null을 돌려받으려면 대응하는 firstNotNullOfOrNull()을 쓰세요.
fun main() {
//sampleStart
val list = listOf<Any>(0, "true", false)
// Converts each element to string and returns the first one that has required length
val longEnough = list.firstNotNullOf { item -> item.toString().takeIf { it.length >= 4 } }
println(longEnough)
//sampleEnd
}
무작위 요소
컬렉션의 임의 요소를 가져와야 한다면 random() 함수를 호출하세요. 인자 없이 호출하거나, 무작위성의 원천으로 Random 객체와 함께 호출할 수 있어요.
fun main() {
//sampleStart
val numbers = listOf(1, 2, 3, 4)
println(numbers.random())
//sampleEnd
}
빈 컬렉션에서는 random()이 예외를 던져요. 대신 null을 받으려면 randomOrNull()을 쓰세요.
요소 존재 확인
컬렉션에 요소가 있는지 확인하려면 contains() 함수를 쓰세요. 함수 인자와 equals()인 컬렉션 요소가 있으면 true를 돌려줘요. contains()는 in 키워드가 있는 연산자 형태로도 호출할 수 있어요.
여러 인스턴스가 한 번에 존재하는지 확인하려면, 그 인스턴스들의 컬렉션을 인자로 containsAll()을 호출하면 돼요.
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.contains("four"))
println("zero" in numbers)
println(numbers.containsAll(listOf("four", "two")))
println(numbers.containsAll(listOf("one", "zero")))
//sampleEnd
}
추가로 컬렉션에 어떤 요소라도 들어 있는지 확인하려면 isEmpty() 또는 isNotEmpty()를 호출하면 돼요.
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.isEmpty())
println(numbers.isNotEmpty())
val empty = emptyList<String>()
println(empty.isEmpty())
println(empty.isNotEmpty())
//sampleEnd
}
더 알아보기 (Learn more)
- 컬렉션의 부분을 가져오는 법은 컬렉션 부분 가져오기 문서를 확인하세요.
- 컬렉션 연산의 전반을 보려면 컬렉션 연산 개요 문서를 살펴보세요.
- 리스트 인덱스 접근과 검색 함수는 리스트 전용 연산 문서를 참고하세요.