□ 배열 (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]
}
코틀린에서 배열을 선언하는 방법에는 크게 arrayOf와 Array가 있습니다.
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. 배열과 리스트에 관련한 유용한 메소드가 굉장히 많습니다. 다음 포스팅에서 정리해보겠습니다 :)
'Kotlin' 카테고리의 다른 글
[Kotlin] Flow에서 ColdStream과 HotStream의 차이 (0) | 2023.06.03 |
---|---|
[Kotlin] for, while 반복문 (0) | 2022.12.23 |
[Kotlin] readLine()과 자료형 변환 (0) | 2022.12.20 |