본문 바로가기
Kotlin

[Kotlin] 배열(Array)과 리스트(List) + ArrayList

by JongSeok 2022. 12. 26.

□ 배열 (Array)

  • 배열(Array)은 정적인 데이터 타입으로 선언하는 순간 배열의 크기(size)가 정해지며 이후 size 변경 불가
  • 배열의 값(value)에 인덱스(Index)를 이용해 접근
  • 기본적으로 Mutable(수정 가능) 타입이고, 인덱스(Index)를 통해 값(value) 변경 가능

배열의 생성

fun main(args: Array<String>) {
    val arr1 = arrayOf<Int>(1, 2, 3, 4, 5)    // [1,2,3,4,5]
    val arr2 = arrayOf("하나", "둘", "셋", 1, 2, 3)    // [하나, 둘, 셋, 1, 2, 3]
    val arr3 = arrayOfNulls<Int>(3)    // [null, null, null]
    val arr4 = Array<Int>(5) {0}    // [0, 0, 0, 0, 0]
    val arr5 = Array<String>(3) {i -> "Name$i"}    // [Name0, Name1, Name2]
}

코틀린에서 배열을 선언하는 방법에는 크게 arrayOfArray가 있습니다.

arrayOf는 배열의 크기를 지정할 수는 없지만 배열 선언과 동시에 배열의 원소 값을 직접 지정해줄 수 있습니다.

자료형을 명시하지 않은 경우에는 자료형이 혼합된 배열 생성도 가능합니다.

Array는 배열 선언과 동시에 배열의 크기를 지정해야 합니다. 중괄호를 이용해 배열의 초기값을 지정할 수 있고, 람다식을 활용해 초기값을 적절히 조작할 수 있습니다.

배열의 값 읽기, 수정

앞서 언급했듯이 생성된 배열은 기본적으로 Mutable 타입이므로 수정이 가능하며 인덱스로 접근합니다.

fun main(args: Array<String>) {
    val arr1 = arrayOf<Int>(1, 2, 3, 4, 5)    // [1,2,3,4,5]
    val arr2 = Array<String>(3) {i -> "Name$i"}    // [Name0, Name1, Name2]

    println(arr1[3])    // 4
    arr1[3] = 10    // 배열의 값 수정
    println(arr1[3])    // 10

    for (i in arr2.indices) {
        print("${arr2[i]} ")    // Name0 Name1 Name2 
    }
}

생성된 배열의 값에 접근하는 데에는 인덱스(Index)를 통해 접근합니다.

반드시 배열의 크기 내에서만 접근 가능하며 배열의 크기 범위를 벗어나 접근할 시 오류가 발생합니다.


리스트(List)

  • 리스트(List)는 동적인 데이터 타입으로 순서를 가지지만 크기(size)가 정해지지 않음, 크기가 고정되지 않기 때문에
    생성 이후 size에 관계없이 데이터 추가 가능
  • 배열(Array)와 마찬가지로 인덱스를 통해 접근하지만 '몇 번째 데이터인가' 정도의 의미이고, 리스트의 데이터에는
    포인터를 이용해 접근
  • 기본적으로 Immutable(수정 불가) 타입이므로 데이터 수정을 위해서는 별도로 Mutable List 선언이 필요

리스트의 생성

fun main(args: Array<String>) {
    val list1: List<Int> = List(3) { i -> i }    // [0, 1, 2]
    val list2: List<String> = listOf("하나", "둘", "셋")    // [1, 2, 3]
    val list3 = mutableListOf<Int>(1,2,3,4,5)    // [1, 2, 3, 4, 5]
}

리스트를 생성하는 방법은 배열을 생성하는 방법과 유사합니다.

리스트의 크기(size)를 지정할 수 있는 List와 크기를 지정할 수 없지만 원소들을 나열하여 리스트를 생성하는 listOf가 있습니다.

다만, 리스트는 기본적으로 Immutable 타입이기 때문에 수정 가능한 리스트를 생성하려면 mutableListOf 키워드를 사용해줘야 합니다.

리스트의 데이터 읽기, 수정

fun main(args: Array<String>) {
    val list1: List<Int> = List(3) { i -> i }    // [0, 1, 2]
    val list2: List<String> = listOf("하나", "둘", "셋")    // [1, 2, 3]
    val list3 = mutableListOf<Int>(1,2,3,4,5)    // [1, 2, 3, 4, 5]

    list1[0] = 3    // 수정 불가, 오류 발생
    println(list1[0])    // 0
    list3[1] = 8    // 데이터 수정
    println(list3)    // [1, 8, 3, 4, 5]
}

mutableListOf로 선언되지 않은 리스트는 읽기만 가능할 뿐, 수정이 불가능합니다.

리스트도 배열과 마찬가지로 인덱스를 이용해 원소에 접근합니다.

 

리스트에서 사용되는 추가, 삭제 메소드는 ArrayList에서 알아보겠습니다.


□ ArrayList

  • ArrayList는 배열과 리스트의 장단점을 보완한 Array 형태로 이루어진 List
  • 기본적으로 Mutable 타입이고, 크기가 자유롭다는 특징

ArrayList 생성과 데이터 추가

fun main(args: Array<String>) {
    val arr1 = ArrayList<Int>()    // []
    val arr2 = arrayListOf<Int>(1,2,3,4,5)    // [1, 2, 3, 4, 5]

    arr1.add(10)    
    arr1.add(20)    
    arr1.add(30)    // 맨 뒤에 원소 삽입
    println(arr1)    // [10, 20, 30]

    arr2.add(1,6)    // 1번째 인덱스에 6삽입 
    println(arr2)    // [1, 6, 2, 3, 4, 5]
}

ArrayList의 데이터 삭제

fun main(args: Array<String>) {
    val arr1 = ArrayList<Int>()    // []

    arr1.add(10)
    arr1.add(20)
    arr1.add(30)
    arr1.add(40)    // 맨 뒤에 원소 삽입
    println(arr1)    // [10, 20, 30, 40]

    arr1.remove(20)    // 맨 앞에서 부터 20을 찾아 삭제
    println(arr1)    // [10, 30, 40]
    arr1.removeAt(1)    // 1번째 인덱스 위치의 데이터 삭제
    println(arr1)    // [10, 40]

    arr1.removeFirst()    // 맨 첫 번째 원소 삭제
    arr1.removeLast()     // 맨 마지막 원소 삭제
    arr1.clear()    // 배열 전체 비우기
}

 

 

cf. 배열과 리스트에 관련한 유용한 메소드가 굉장히 많습니다. 다음 포스팅에서 정리해보겠습니다 :)

728x90
반응형

'Kotlin' 카테고리의 다른 글

[Kotlin] Flow에서 ColdStream과 HotStream의 차이  (0) 2023.06.03
[Kotlin] for, while 반복문  (0) 2022.12.23
[Kotlin] readLine()과 자료형 변환  (0) 2022.12.20