본문 바로가기
Java & Kotlin/Kotlin

[Kotlin] 배열과 컬렉션

by heekng 2022. 7. 7.
반응형

배열과 컬렉션

배열

Kotlin

// 배열 만들기
val array = arrayOf(100, 200)

// 값 넣기
array.plus(300)

// 인덱스로 반복
for (i in array.indices) {
    println("${i} ${array[i]}")
}

// 인덱스와 값 모두 가져오기
for ((idx, value) in array.withIndex()) {
    println("$idx, $value")
}
  • 배열은 잘 사용하지 않는다.
    • 배열보다는 리스트를 사용하자.
  • array.indices는 0부터 마지막 index까지의 Range이다.
  • array.withIndex()를 사용하면, 인덱스와 값을 한번에 가져올 수 있다.
  • array.plus()를 사용하면 값을 추가할 수 있다.

Collection

  • 컬렉션을 만들어 줄 때 불변인지, 가변인지를 지정해야 한다.
  • 가변(Mutable) 컬렉션: 컬렉션에 element를 추가, 삭제할 수 있다.
  • 불변 컬렉션: 컬렉션에 element를 추가, 삭제할 수 있다.
    • 가변 컬렉션에 Collections.unmodifiableXXX()를 사용하면 불변 컬렉션이 된다.
    • 불변 컬렉션이더라도 ReferenceType인 Element의 필드는 바꿀 수 있다.

List

Kotlin

// 불변 리스트
val numbers = listOf(100, 200)
// 비어있는 리스트
val emptyList = emptyList<Int>()
// 가변 리스트
val numbers2 = mutableListOf(100, 200)

// 하나만 가져오기
println(numbers[0])

// foreach
for (number in numbers) {
    println(number)
}

// 인덱스와 함께 가져오기
for ((idx, value) in numbers.withIndex()) {
    println("${idx} ${value}")
}
  • listOf()를 통해 불변 리스트를 만든다.
  • emptyList<타입>()를 이용해 비어있는 리스트를 만들 수 있다.
    • 타입을 추론할 수 있다면 생략 가능하다.
  • mutableListOf()를 사용하면 가변 리스트를 만들 수 있다.
    • 기본 구현체는 자바의 ArrayList이다.
  • TIP: 불변 리스트를 만들고, 꼭 필요한 경우 가변 리스트로 바꾸자

Set

Kotlin

// 불변 Set
val numbers = setOf(100, 200)
// 비어있는 Set
val emptySet = emptySet<Int>()
// 가변 Set
val numbers2 = mutableSetOf(100, 200)

// foreach
for (number in numbers) {
    println(number)
}

// 인덱스와 함께 가져오기
for ((idx, value) in numbers.withIndex()) {
    println("${idx} ${value}")
}
  • SetList와 다르게 순서가 없고, 같은 element는 하나만 존재할 수 있다.
    • 자료구조적 의미만 제외하면 모든 기능은 List와 동일하다.
  • setOf()를 사용해 불변 Set을 만들 수 있다.
  • mutableSetOf()를 사용하면 가변 Set을 만들 수 있다.
    • 기본 구현체는 LinkedHashSet이다.

Map

Kotlin

mapOf(1 to "MONDAY", 2 to "TUESDAY")

val oldMap = mutableMapOf<Int, String>()
oldMap[1] = "MONDAY"
oldMap[2] = "TUESDAY"

// 사용하기

for (key in oldMap.keys) {
    println(key)
    println(oldMap.get(key))
    println(oldMap[key])
}

for ((key, value) in oldMap.entries) {
    println(key)
    println(value)
}
  • MutableMap을 만들어 넣을 수도 있고, 정적 팩토리 메서드를 활용할 수도 있다.
  • mapOf()을 사용해 불변 Map을 만들 수 있다.
  • mutableMapOf()를 사용하면 가변 Map을 만들 수 있다.

컬렉션의 null 가능성과 Java

  • ?의 위치에 따라 null 가능성 의미가 달라진다.
    • List<Int?>: 리스트에 null이 들어갈 수 있지만, 리스트는 절대 null이 아니다.
    • List<Int>?: 리스트에는 null이 들어갈 수 없지만, 리스트는 null일 수 있다.
    • List<Int?>?: 리스트에 null이 들어갈 수도 있고, 리스트가 null일 수도 있다.
  • Java의 읽기 전용 컬렉션과 변경 가능 컬렉션을 구분하지 않는다.
    • 코틀린의 불변 컬렉션을 자바에서 사용한다면 Element를 추가할 수 있다.
      자바에서 Element를 추가하고 코틀린에서 다시 사용한다면 문제가 발생할 수 있다.
    • 코틀린의 non-nullable 컬렉션을 자바에서 사용한다면 null을 추가할 수 있다.
      자바에서 nulㅣ을 추가하고 코틀린에서 다시 사용한다면 문제가 발생할 수 있다.
    • 때문에 Kotlin쪽의 컬렉션이 Java에서 호출된다면 컬렉션 내용이 변경할 될 수 있음을 감안해야 한다.
    • 코틀린 쪽에서 Collections.unmodifiableXXX()를 활용한다면 final이 붙은 것처럼 변경 자체를 막을 수 있다.
    • 반대로 자바의 컬렉션을 코틀린에서 사용한다면, 플랫폼 타입을 주의해야 한다.
      Java 코드를 보며 맥락을 확인하고 Java 코드를 가져오는 지점을 wrapping 해야 한다.
반응형

'Java & Kotlin > Kotlin' 카테고리의 다른 글

[Kotlin] 컬렉션을 함수형으로 사용하기  (0) 2022.07.07
[Kotlin] 람다  (0) 2022.07.07
[Kotlin] 함수  (0) 2022.07.07
[Kotlin] Data, Enum, Sealed 클래스  (0) 2022.07.06
[Kotlin] 중첩 클래스를 다루는 방법  (0) 2022.07.06
[Kotlin] object를 다루는 방법  (0) 2022.07.06