Lined Notebook

[자바 개발자를 위한 코틀린 입문] 배열과 컬렉션 다루기

by dev.hardy

코틀린에서 배열과 컬렉션을 다루는 방법

인프런에서 최태현 지식 공유자님의
자바 개발자를 위한 코틀린 입문을 수강하며 정리한 내용 입니다.
하단에 강의 링크 있습니다.

배열

사실 배열은 잘 사용하지 않는다.

이펙티브 자바에서는 배열보다 리스트를 사용하라 라고 나와있다.

val array = arrayOf(100, 200) // (1)

for (i in array.indices){ // (2)

}

for ((idx, value) in array.withIndex()){ // (3)

}

array.plus(300) // (4)

(1) 100, 200이 들어간 배열 생성

(2) 배열의 인덱스를 이용하여 for 루프 생성

(3) 인덱스와 값까지 같이 받는 방법

(4) 배열에 엘리먼트 추가 가능

코틀린에서의 Collection

**컬렉션을 만들어줄 때 불변인지, 가변인지를 설정해야 함**

  • 가변 컬렉션 : 컬렉션에 element를 추가, 삭제할 수 있다.
  • 불변 컬렉션 : 컬렉션에 element를 추가, 삭제 불가
    • 불변 컬렉션이라 하더라도 Reference Type 인 element의 필드는 바꿀 수 있다.

List

예) 불변 리스트 만들기

val numbers = listOf(100, 200)
val emptyList = emptyList<Int>() // 타입 명시해야함

예) 리스트 순회

fun main() {
    val numbers = listOf(100, 200)
    println(numbers[0])
    for (number in numbers) {
        println(numbers)
    }
    for ((idx, value) in numbers.withIndex()) {
        println("${idx} / ${value}")
    }
}

/**
100
[100, 200]
[100, 200]
0 / 100
1 / 200
*/
fun main() {
    val numbers = mutableListOf(100, 200) // (1)
    numbers.add(300) // (2)
}

(1) 원소들로 타입 추론 가능하므로 생략 가능

(2) element 추가 가능

기본구현체는 ArrayList 이다. 기타 사용법은 자바와 동일!

TIP)

우선 불변 리스트를 만들고, 꼭 필요한 경우 가변 리스트로 바꾸자!

→ 그래야 코드도 깔끔해지고 불필요한 가변 리스트 사용이 줄어들기 때문!

Set

집합 은 List와 다르게 순서가 없고 중복 허용 안한다.

→ 자료구조적 의미만 제외하면 모든 기능이 List와 비슷

가변 집합을 만들고 싶다면? → mutableSetOf() 를 사용

기본 구현체는 LinkedHashSet이다.

fun main() {
    val subject = setOf("java", "spring", "kotlin") // (1)
    val lecture = mutableSetOf("git", "linux") // (2)

}

(1) 불변 집합

(2) 가변 집합

Map

예) Map 엘리먼트 추가하는 두 가지 방법

fun main() {
    val oldMap = mutableMapOf<Int, String>() // (1)
    oldMap.put(1, "Monday")
    oldMap[1] = "Monday" 

    mapOf(1 to "Monday", 2 to "Tuesday")
}

(1) 가변 Map이기 때문에 (key, value) 추가 가능

  • 자바처럼 put 사용할 수도 있다.
  • map[key] = value 도 가능
  • 코틀린도 동일하게 MutableMap을 만들어 넣을 수 있다.
  • 정적 팩토리 메소드를 바로 활용 할 수 있다.

예) Map 순회

fun main() {
    val oldMap = mutableMapOf<Int, String>()
    oldMap[1] = "Monday"
    oldMap[2] = "TuesDay"

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

    for ((key, value) in oldMap.entries) {
        println("key=${key} , value=${value}")
    }
}

컬렉션의 null 가능성, 자바와 함께 사용하기

  1. List<Int?>: 리스트에 null이 들어갈 수 있지만, 리스트는 절대 null 아님
  2. List: 리스트에 null이 들어갈 수 없지만, 리스트는 null일 수 있음
  3. List<Int?>?: 리스트에 null이 들어갈 수도 있고, 리스트가 null일 수도 있음

→ ? 위치에 따라 null 가능성 의미가 달라지므로 차이를 잘 이해해야함

  • 자바와 함께 사용할 때의 주의점
    • 자바는 읽기 전용 컬렉션과 변경 가능 컬렉션을 구분하지 않음
      • 코틀린에서 불변 리스트를 만들더라도 자바에서는 구분하지 않으므로 element 추가 삭제 가능하다.
    • 자바는 nullable과 non-nullable 타입을 구분하지 않음
      • 코틀린에서 null이 들어갈 수 없는 리스트를 만들었는데 자바에서 null을 리스트에 추가할 수도 있다.

코틀린에서 자바 컬렉션을 가져다 사용할 때 플랫폼 타입 을 신경써야 한다.

즉, 자바에서 List이라고 리스트를 만들고 코틀린에서 사용할 때 코틀린은 List<String?>, List, List<String?>? 인지 모른다.

→ 자바 코드를 보며, 맥락을 확인하고 Java 코드를 가져오는 지점을 wrapping 한다.

→ 영향범위를 최소화 해야함

Reference:
자바 개발자를 위한 코틀린 입문

블로그의 정보

개발자 하디 : 기록저장소

dev.hardy

활동하기