Unit 3: Navigation (1)

quokka·2021년 11월 8일
0

Android Basics in Kotlin

목록 보기
10/25
post-thumbnail

Kotlin의 컬렉션

컬렉션은 어떤 관련 항목에 대한 그룹이다. 이전에 학습한 목록 List도 컬렉션의 한 유형이다. 목록과 마찬가지로 컬렉션은 변경 가능한 컬렉션과 변경 불가능한 컬렉션으로 구분된다.

집합 Set

목록과 달리 중복될 수 없으며 순서는 중요하지 않다.

List를 Set으로 변환 toSet()

fun main() {
    val numbers = listOf(0, 3, 8, 4, 0, 5, 5, 8, 9, 2)
    println("list: ${numbers}")
    val setOfNumbers = numbers.toSet()
    println("set: ${setOfNumbers}")
}
// list: [0, 3, 8, 4, 0, 5, 5, 8, 9, 2]
// set: [0, 3, 8, 4, 5, 9, 2]

setOf, mutableSetOf

목록과 마찬가지로 수정 가능한 집합 MutableSet이 있다.

val set1 = setOf(1,2,3)
val set2 = mutableSetOf(3,2,1)
  • 존재 여부를 확인하는 contain(), 교집합 연산 intersect(), 합집합 연산 union() 함수 등을 사용할 수 있다.

맵 Map

특정 키가 부여된 값을 쉽게 찾을 수 있도록 key-value 쌍으로된 집합이다. 키는 고유하고 정확히 하나의 값에 매핑되지만 값은 중복될 수 있다. 맵의 값은 문자열, 숫자, 객체일 수 있으며 목록 또는 집합과 같은 다른 컬렉션일 수도 있다.

fun main() {
    val peopleAges = mutableMapOf<String, Int>(
    	"Fred" to 32, 
      "Ann" to 8
    )
    peopleAges.put("Barbara",42)
    peopleAges["Joe"] = 13
    println(peopleAges)  
}
// {Fred=32, Ann=8, Barbara=42, Joe=13}
  • put()을 사용하거나 map[key] = value 로 항목을 추가할 수 있다.

forEach

컬렉션의 모든 항목을 탐색하면서 항목별로 작업을 실행할 때 forEach()를 사용할 수 있다.

peopleAges.forEach{print("${it.key} is ${it.value}, ")}
// Fred is 32, Ann is 8, Barbara is 42, Joe is 13,

forEachfor문처럼 항목의 변수를 지정하는 대신 특수 식별자 it을 사용한다. forEach 메소드는 소괄호 없이 중괄호 안에 코드를 작성하면 된다.

map()

컬렉션의 한 유형 맵이 아니라 map() 함수다. map() 함수는 컬렉션의 각 항목에 변환을 적용한다.

println(peopleAges.map{"${it.key} is ${it.value}"}.joinToString(", "))
// Fred is 32, Ann is 8, Barbara is 42, Joe is 13

forEach로 출력한 것과 달리 마지막에 쉼표가 사라진 것을 확인할 수 있다.

filter

특정 조건과 일치하는 항목을 찾을 때 사용한다.

val filteredNames = peopleAges.filter { it.key.length < 4 }
println(filteredNames)
// {Ann=8, Joe=13}
  • 반환 유형은 LinkedHashMap이다.

람다와 고차함수

peopleAges.forEach { print("${it.key} is ${it.value}") } 앞에서 본 이 코드를 보면 중괄호 안에 작은 함수를 작성하는 것이라고 볼 수 있다. 하지만 이 작은 함수에 이름은 없다. 이처럼 이름이 없고 곧바로 표현식으로 사용할 수 있는 함수는 람다 표현식으로 나타낼 수 있다.

Function Type

아래 코드를 실행하면 15가 출력된다.

fun main() {
    val triple: (Int) -> Int = { a: Int -> a * 3 }
    println(triple(5))
}
  • (Int) -> Int : Function Type
  • { a: Int -> a * 3 } : Lambda

특수 식별자 it 을 사용해 더 짧게 작성할 수 있다.

val triple: (Int) -> Int = { it * 3 }

고차 함수

함수를 다른 함수로 전달하거나 함수에서 함수를 반환하는 것이다.

앞에서 본 mapfilterforEach 함수 모두 고차 함수의 예이다.

sortedWith()

아래 코드처럼 람다를 이용해 정렬하는 기준을 정할 수 있다. 이 경우 이름의 길이 순으로 정렬된다. 그냥 sorted()를 사용했다면 사전순으로 정렬 되었을 것이다.

pplNames.sortedWith{str1: String, str2: String -> str1.length - str2.length }

단어 목록 만들기

다음 실습을 위해 단어 목록을 만들자.

fun main() {
    val words = listOf("about", "acute", "awesome", "balloon", "best", 
						"brief", "class", "coffee", "creative")
    val filteredWords = words.filter { it.startsWith("b", ignoreCase = true) }
        .shuffled()
        .take(2)
    println(filteredWords)
}
  • filter로 "b" 또는 "B"로 시작하는 단어를 골라내고
  • shuffled()로 순서를 섞고
  • take(2)로 2개만 가져온다.

0개의 댓글