반응형
Arrays
코틀린 배열은 타입 파라미터를 받는 클래스다. 다른 제네릭 타입에서 처럼 배열 타입의 타입 인자는 객체 타입이 되므로 Array 같은 타입을 선언하면 박싱된 정수의 배열(java.lang.Integer[]
)이 된다.
class Array<T> private constructor() {
val size: Int
operator fun get(index: Int): T
operator fun set(index: Int, value: T): Unit
operator fun iterator(): Iterator<T>
// ...
}
get
: 특정 인덱스의 원소 값을 반환 , indexing operator([]
)로 호출 가능
set
: 특정 인덱스의 원소 값을 삽입, indexing operator([]
)로 호출 가능
초기화
arrayOf
val arr = arrayOf(1, 2, 3) // [1, 2, 3]
arrayOfNulls
- 함수에 정수 값을 인자로 넘기면 인자로 넘긴 값의 크기의 모든 원소가 null인 배열을 만들 수 있다. 원소가 널이 될 수 있는 타입만 사용 가능하다.
val arr = arrayOfNulls<Int?>(3) // [null, null, null]
생성자
- 배열 크기와 람다를 인자로 받아서 람다를 호출해서 각 배열 원소를 초기화한다.
val asc = Array(5) { i -> (i * i).toString() } // ["0", "1", "4", "9", "16"]
순회
배열 요소 순회
val nums = arrayOf(1, 2, 3, 4, 5)
// for
for (element in nums) {
println(element)
}
// forEach()
nums.forEach { e -> println(e) }
// iterator
val it: Iterator<Int> = nums.iterator()
while (it.hasNext()) {
val element = it.next()
println(element)
}
배열 요소와 인덱스 순회
val nums = arrayOf(1, 2, 3, 4, 5)
// indices
for (index in nums.indices) {
println("arr[$index] = ${arr[index]}")
}
// withIndex
for ((index, element) in nums.withIndex()) {
println("arr[$index] = $element")
}
// forEachIndexed
nums.forEachIndexed { i, e -> println("arr[$i] = $e") }
참고로 indices를 이용하면 보다 편하게 인덱스 범위안에 해당하는 값인 지를 확인할 수 있다.
인덱스의 범위는 0 부터 배열길이 -1 까지이다.
val nums = arrayOf(1, 2, 3, 4, 5)
val targetIndex = 10
if (0 <= targetIndex && targetIndex <= nums.lastIndex) {
// 배열 인덱스 범위에 해당
println(nums[targetIndex])
}
// indices
if (targetIndex in nums.indices) {
// 배열 인덱스 범위에 해당
println(nums[targetIndex])
}
Primitive type arrays
박싱하지 않은 원시 타입의 배열이 필요하다면 특별한 배열 클래스를 사용해야 한다.
ByteArray, ShortArray, IntArray 같은 원 시 타입 배열을 제공한다.
각각 byte[], short[], int[] 로 컴파일된다.
초기화
생성자
val arr = IntArray(5) // [0, 0, 0, 0, 0]
val arr2 = IntArray(5) { 42 } // [42, 42, 42, 42, 42]
var arr3 = IntArray(5) { it * 1 } // [0, 1, 2, 3, 4]
arrayOf
val integers = intArrayOf(1, 2, 3, 4)
참고
반응형