티스토리 뷰

Kotlin

[Kotlin] Collection

hyuuny 2022. 6. 19. 15:04

이번에는 코틀린에서 컬렉션을 다루는 방법에 대해 알아보자!


1. List
2. Set
3. Map


List

List는 순서가 있고, 요소간의 중복을 허용하는 자료구조이다.

Java

  public static void main(String[] args) {

    final List<Integer> numbers = Arrays.asList(100, 200);

    // 요소 하나를 가져온다.
    Integer integer = numbers.get(0);

    // foreach
    for (int number : numbers) {
      System.out.println(number);
    }

    // 전통적인 for문
    for (int i = 0; i < numbers.size(); i++) {
      System.out.printf("%s %s", i, numbers.get(i));
    }

  }

Kotlin

fun main() {

    val immutableNumbers = listOf(100, 200) // 불변 list -> add, remove X
    val mutableNumbers = mutableListOf(100, 200) // 가변 list -> add, remove O
    mutableNumbers.add(300)
    mutableNumbers.remove(300)

    // 요소 하나를 가져온다.
    // numbers.get(0)과 같다.
    val integer = immutableNumbers[0]

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

    // 전통적인 for문
    // withIndex : 인덱스와 값을 가져온다.
    for ((idx, value) in immutableNumbers.withIndex()) {
        println("$idx, $value")
    }

}

코틀린에서 가변 리스트를 만들고 싶으면 mutableListOf(), 불변 리스트를 만들고 싶다면 listOf()를 사용하자. 깔끔한 코드와 불필요한 가변 리스트 사용을 줄이기 위해서 우선 불변 리스트로 만들고, 필요한 경우에 가변 리스트로 변경하길 권장한다.
참고로 불변이라 하더라도 Reference TypeElement의 필드는 변경할 수 있다.


Set

Set은 순서가 없고, 요소간의 중복을 허용하지 않는 자료구조이다. 자료구조적 의미를 제외하고는 모든 기능이 List와 비슷하다.

fun main() {

    val immutableNumbers = setOf(100, 200) // 불변 set -> add, remove X
    val mutableNumbers = mutableSetOf(100, 200) // 가변 set -> add, remove O
    mutableNumbers.add(300)
    mutableNumbers.remove(300)

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

    // 전통적인 for문
    // withIndex : 인덱스와 값을 가져온다.
    for ((idx, value) in immutableNumbers.withIndex()) {
        println("$idx, $value")
    }

}

Map

Map은 순서가 없고, Key에 대한 중복을 허용하지 않지만, Value는 중복이 가능한 자료구조이다.

Java

  public static void main(String[] args) {

    // JDK 8까지
    HashMap<Object, Object> oldMap = new HashMap<>();
    oldMap.put(1, "MONDAY");
    oldMap.put(2, "TUESDAY");

    // JDK 9 이후
    Map<Integer, String> newMap = Map.of(1, "MONDAY", 2, "TUESDAY");

  }

Kotlin

fun main() {

    val oldMap = mutableMapOf<Int, String>() // <Int, String> 타입 명시
    oldMap[1] = "MONDAY"  // oldMap.put(1, "MONDAY");
    oldMap[2] = "TUESDAY" // oldMap.put(2, "TUESDAY");

    mapOf(1 to "MONDAY", 2 to "TUESDAY") // to : 중위호출

}

코틀린도 자바와 동일하게 MutableMap을 만들어 넣을 수도 있고, 정적 팩토리 메소드(mapOf())를 바로 활용할 수도 있다.
다만, mutableMap의 경우 타입을 추론할 수 없기 때문에 타입을 명시해주어야한다.


정리

  • Kotlin에서는 컬렉션을 생성할 때, 불변/가변을 지정해주어야 한다.
  • Java와 비교했을 때, List, Set, Map에 대한 사용법이 변경, 확장되었다.
  • JavaKotlin 코드를 섞어 컬렉션을 사용할 때에는 주의해야 한다.
    • Java에서 Kotlin 컬렉션을 가져갈 때는 불변 컬렉션을 수정할 수도 있고, non-nullable컬렉션에 null을 넣을 수도 있다.
    • Kotlin에서 Java 컬렉션을 가져갈 때는 플랫폼타입을 주의해야 한다.

'Kotlin' 카테고리의 다른 글

[Kotlin] scope function  (0) 2022.06.28
[Kotlin] 람다(lambda)  (0) 2022.06.22
[Kotlin] 클래스  (0) 2022.06.17
[Kotlin] object 키워드  (0) 2022.06.14
[Kotlin] 접근 제한자(Visibility Modifier)  (0) 2022.06.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함