Today I Learned

콜렉션 사용하기 본문

Kotlin/다재다능 코틀린 프로그래밍

콜렉션 사용하기

하이라이터 2023. 7. 27. 17:43
728x90

콜렉션의 특징

코틀린이 제공하는 편리한 메소드들

  • kotiln.collections 패키지에 유용한 함수들이 많이 추가되었다.
  • 예를들어 withIndex() 메소드를 사용하면 인덱스와 값 모두를 편하게 얻을 수 있다.
val names = listOf("Tom", "Jerry")
println(names.javaClass)
for ((index, value) in names.withIndex()) {
  println("$index $value")
}

 

  • Java에서 이뮤터블 콜렉션을 변경하려면 runtime에 exception이 발생했다.
  • 코틀린에는 기본 콜렉션에 매핑되는 read-only 뷰와 read-write 뷰가 있으며, read-only 뷰에 쓰기를 시도하면 컴파일 단계에서 실패한다.
  • read-only 뷰가 스레드 안정성을 제공해주지는 않는다. read-only 뷰가 참조하고 있는 콜렉션은 뮤터블이기 때문이다.

 

페어와 트리플 사용하기

  • 코틀린에는 2개 짜리 튜플인 페어와 3개 짜리 튜플인 트리플이 있다.
println(Pair("Tom", "Jerry")) //(Tom, Jerry)
println(mapOf("Tom" to "Cat", "Jerry" to "Mouse")) //{Tom=Cat, Jerry=Mouse}
  • 위와 같이 Pair의 생성자를 이용해 인스턴스를 만들고, to() 확장함수를 이용해서 Map의 엔트리가 될 페어를 만들 수 있다.

 

객체 배열과 프리미티브 배열

  • Array<T> 클래스는 코틀린의 배열을 상징한다.
  • arrayOf() 함수를 사용해서 배열을 만들 수 있으며, 인덱스 연산자 []를 이용해서 요소에 접근할 수 있다.
val friends = arrayOf("Tintin", "Snowy", "Haddock", "Calculus")
println(friends::class) //class kotiln.Array
println(frineds.javaClass) //class [Ljava.lang.String;
println("${friends[0]} and ${friends[1]}") //Tintin and Snowy
  • 배열의 타입은 kotlin.Array(=Array<T>) 이지만, JVM에서 실행될 때 적용되는 진짜 타입은 String 배열이다.
  • 정수 배열을 만들때는 intArrayOf() 함수를 사용하면 Integer 배열로 박싱되지 않고 int 배열로 만들 수 있다.
  • IntArray와 같은 타입 특화 배열 클래스에서도 Array<T>에 사용된 연산을 동일하게 사용할 수 있다.

 

리스트 사용하기

  • listOf() 메소드로 이뮤터블 리스트를 만들 수 있다.
  • mutableListOf() 메소드는 뮤터블 리스트를 만들 수 있지만, 꼭 필요한 경우만 사용해야 한다.
  • 리스트의 요소들에 접근하기 위해 get() 메소드나 인덱스 연산자 []를 사용할 수 있다. 인덱스 연산자가 노이즈가 적고 편리하다.
val fruits: List<String> = listOf("Apple", "Banana", "Grape")
println("frist's ${friuts[0]}, that's ${fruits.get(0)}")
//first's Apple, that's Apple
  • 리스트에 다른 요소를 추가하려면 + 연산자를 사용하면 된다.
val fruits2 = fruits + "Orange"
println(fruits) //[Apple, Banana, Grape]
println(fruits2) //[Apple, Banana, Grape, Orange]
  • 이 연산은 기존의 리스트를 카피하면서 새로운 리스트를 만들고 새로운 요소를 추가한다.
  • 마찬가지로 - 연산자로 기존 리스트에서 특정 요소를 제외한 새로운 리스트를 만들 수 있다.

 

셋 사용하기

  • 셋은 정렬되지 않은 요소의 모음이다.
  • setOf(), mutableSetOf(), hashSetOf(), LinkedSetOf(), sortedSetOf() 등을 이용해서 다양한 set의 인스턴스를 만들 수 있다.
  • 셋은 중복 요소를 허용하지 않기 때문에 중복된 값은 누락된다.

 

맵 사용하기

  • 맵은 키-값 페어를 보관하는 콜렉션이다.
  • set과 마찬가지로 다양한 타입의 map의 인스턴스를 생성할 수 있는 함수들이 있다.
val sites = mapOf("naver" to "https://www.naver.com",
  "google" to "https://www.google.com")
println(sites.size) //2
  • to() 확장함수를 통해 키-값 페어를 만든다.
  • to() 확장함수는 코틀린의 모든 객체에서 사용 가능하고, mapOf()는 Pair<K,V>를 인자로 취급한다.
  • containKey(), containValue() 메소드를 통해 맵 안에 키 또는 값이 존재하는 체크할 수 있다.
val naverSite: String = sites.get("naver") //오류
  • 위 코드는 동작하지 않는데, get() 메소드는 키가 맵에 없을 경우 nullable 타입을 리턴하기 때문이다.
  • 코틀린은 컴파일 시간에 문제를 알려주고, nullable 참조 타입 사용을 권장한다.
val naverSite: String? = sites.get("naver") //오류
  • nullable 참조를 피하기 위해 키가 없으면 기본값을 리턴하도록 만들 수도 있다.
val naverSite = sites.getOrDefault("naver", "http://www.example.com")
  • 연산자 + 또는 -를 사용해 새로운 맵을 만들 수 있다.
  • for 루프를 사용하면 변수에 맵의 요소들을 참조해서 키와 값을 가져올 수 있으며, 구조분해를 이용해서 key와 value를 각각의 요소에 추출해서 사용할 수도 있다.
for(entry in sites) {
  println("${entry.key} -- ${entry.value}")
}

for((key, value} in sites) {
  println("$key -- $value")
}
728x90
Comments