Kotlin - Array & Collections

2023. 4. 23. 20:18·📘 Backend/Kotlin
목차
  1. 💡 코틀린에서 배열과 컬렉션을 다루는 법
  2. 💡 Array
  3. 💡Collection - List, Set, Map
  4. List
  5. Set
  6. Map
  7. 💡Null 가능성, Java와 함께 사용
  8. 💡 정리

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

목차

  • Array
  • Collection - List, Set, Map
  • Null 가능성, Java와 함께 사용
  • 정리

💡 Array

코틀린엑서 배열을 잘 쓸일이 없지만 그래도 자바와 차이점을 설명한다.

for loop를 쓸때 indices 키워드를 사용하여 0 부터 index 까지의 Range를 나타낼 수 있다.

또 다른 방법은 withIndex()를 사용하면, 인덱스와 값을 한번에 가져올 수 있다.


자바 예시 코드

int[] array = {100, 200};

for (int i=0; i<array.length; i++) {
    System.out.println("%s %s", i, array[i]);
}

코틀린 예시 코드

방법 1: indices는 0부터 마지막 index까지의 Range이다.

val array = arrayOf(100, 200)

for (i in array.indeices) {
    println("${i} ${array[i]}")
}

방법 2 : witnIndex()를 사용하면, 인덱스와 값을 한번에 가져올 수 있다.

val array = arrayOf(100, 200)

for ((idx, value) in array.withIndex()) {
    println("${idx} ${value}")
}

값을 쉽게 넣을수도 있다.

val array = arrayOf(100, 200)
array.plus(300) // 값 넣기

for ((idx, value) in array.withIndex()) {
    println("${idx} ${value}")
}

💡Collection - List, Set, Map

코틀린에서 컬렉션을 생성할 때, 불변인지 가변인지를 설정해야 한다.

Collection을 만들자마자, Collections.unmodifiableList()를 붙여준다.

불변 컬렉션이라 하더라도 Reference Type인 Element의 필드는 바꿀 수 있다.


가변 컬렉션

  • 컬렉션에 Element를 추가, 삭제할 수 있다.

불변 컬렉션

  • 컬렉션에 Element를 추가, 삭제할 수 없다.

image-20230423191124531


List

불변리스트의 생성은 listOf()를 사용한다.

가변리스트의 생성은 mutableListOf()를 사용한다.

우선 불변리스트로 만들되, 필요한 경우 가변 리스트로 변경하는걸 추천한다.

/* ----- 불변 리스트 ----- */
val numbers = listOf(100, 200)
val emptyList = emptyList<Int>()

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

// For-Each
for (number in numbers) {
    println(number)
}

// 전통적인 For문
for ((index, number) in numbers.withIndex()) {
    println("$index $number")
}

/* ----- 가변 리스트 ----- */
val numbers = mutableListOf(100, 200)
numbers.add(300)

Set

집합은 List와 다륵 순서가 없고, 같은 Element는 하나만 존재할 수 있다. (데이터 중복 불가능)

기본 구현체는 LinkedHashSet 이다.

Set도 List와 같이 불변으로 만드려면 setOf()를 사용한다.

가변 집합을 만들고 싶으면 동일하게 mutableSetOf()를 사용한다.

val numbers = setOf(100, 200)

// For-Each
for (number in numbers) {
    println(number)
}

// 전통적인 For문
for ((index, value) in numbers.withIndex()) {
    println("$index $number")
}

Map

List와 Set과 동일하게 불변은 mapOf(), 가변은 mutableMapOf()를 사용한다.

정적 팩토리 메서드를 바로 활용할 수도 있다.


예시

가변 Map 이기 때문에 (key, value)를 넣을 수 있다.

Java 처럼 put을 쓸 수도 있고, map[key] = value를 쓸 수도 있다.

// 가변 Map인 MutableMapOf() 생성
val map = mutableMapOf<Int, String>()
map[1] = "MONDAY"
map[2] = "TUESDAY"

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

// 불변 Map인 mapOf() 생성
val map = mapOf<Int, String>()

for (key in map.keys) {
    println(key)
    println(value)
}

for ((key, value) in map.entries) {
    println(key)
    println(value)
}

💡Null 가능성, Java와 함께 사용

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

자바는 nullable 타입과 non-nullable 타입을 구분하지 않는다.

그래서 Kotlin의 컬렉션이 Java에서 호출되면 컬렉션 내용이 변할 수 있음을 감안해야 한다.

코틀린 쪽에서 Collections.unmodifableXXX()를 활용하면 변경 자체를 막을 순 있다.


List<Int?>

  • 리스트에 null이 들어갈 수 있지만, 리스트 자체는 절대 null이 아님

List?

  • 리스트에는 null이 들어갈 수 없지만, 리스트 자체는 null일 수 있음

List<Int?>?

  • 리스트에 null이 들어갈 수도 있고, 리스트 자체가 null일 수도 있음

💡 정리

  • 코틀린에서는 컬렉션을 만들때도 불변/가변을 명시해야 한다.
  • List, Set, Map에 대한 사용법이 변경/확장 되었다.
  • Java와 Kotlin 코드를 섞어 컬렉션을 사용할 때는 주의 해야한다.
    • Java에서 Kotlin 컬렉션을 가져갈 때, 불변 컬렉션을 수정 할 수도 있고,
      non-nullable 컬렉션에 null을 넣을 수도 있다.
    • Kotlin에서 Java 컬렉션을 가져갈 때는 플랫폼 타입을 주의해야 한다.
저작자표시 (새창열림)

'📘 Backend > Kotlin' 카테고리의 다른 글

Kotlin - Lambda  (0) 2023.04.29
Kotlin - More Functions  (0) 2023.04.27
Kotlin - Classes  (1) 2023.04.23
Kotlin - 중첩 클래스  (0) 2023.04.23
Kotlin - Object  (0) 2023.04.23
  1. 💡 코틀린에서 배열과 컬렉션을 다루는 법
  2. 💡 Array
  3. 💡Collection - List, Set, Map
  4. List
  5. Set
  6. Map
  7. 💡Null 가능성, Java와 함께 사용
  8. 💡 정리
'📘 Backend/Kotlin' 카테고리의 다른 글
  • Kotlin - Lambda
  • Kotlin - More Functions
  • Kotlin - Classes
  • Kotlin - 중첩 클래스
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      Lock #Thread #Concurrency
      GStreamer #Pipeline
      React #Markdown
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    Kotlin - Array & Collections
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.