•
같은 타입 또는 하위 타입의 고정된 수의 값을 보유하는 데이터 구조
◦
객체 유형 배열에서 기본형을 사용하면 오토박싱에 의한 오버헤드가 발생한다.
•
특수한 요구사항이 있지 않으면 배열 대신 컬렉션을 사용하라.
◦
컬렉션은 읽기 전용으로 설정할 수 있으므로 제어력이 높고 명확한 의도가 담긴 견고한 코드를 작성할 수 있다.
◦
컬렉션에서 요소를 추가하거나 제거하는 것은 쉽지만 배열은 크기가 고정되어 매번 새 배열을 만들기 때문에 비효율적이다.
◦
동등성을 비교하기 위해 컬렉션은 == 을 사용할 수 있지만 배열은 특수 함수를 사용해야한다.
•
배열 타입 지정
var exampleArray = emptyArray<String>()
//OR
var exampleArray: Array<String> = emptyArray()
Kotlin
복사
배열 생성
•
Array 생성자 혹은 arrayOf(), arrayOfNulls(), emptyArray() 함수
// Creates an array with values [1, 2, 3]
val simpleArray = arrayOf(1, 2, 3)
println(simpleArray.joinToString())
// 1, 2, 3
// Creates an array with values [null, null, null]
val nullArray: Array<Int?> = arrayOfNulls(3)
println(nullArray.joinToString())
// null, null, null
var exampleArray = emptyArray<String>()
Kotlin
복사
요소 접근 및 수정
•
인덱스 연산자 [] 를 사용한다.
val simpleArray = arrayOf(1, 2, 3)
val twoDArray = Array(2) { Array<Int>(2) { 0 } }
// Accesses the element and modifies it
simpleArray[0] = 10
twoDArray[0][0] = 2
// Prints the modified element
println(simpleArray[0].toString()) // 10
println(twoDArray[0][0].toString()) // 2
Kotlin
복사
•
코틀린의 배열은 불변적이다.
◦
Array<String>을 Array<Any>로 할당할 수 없다.
◦
Array<out Any>를 사용하면 타입 안정성을 유지하면서 배열을 공변적으로 사용할 수 있다.
◦
Array<out Any>는 “어떤 타입이든 받아들이는 배열”이 아니라 “어떤 타입이든 반환할 수 있는 배열”
배열을 사용하는 작업
•
함수에 가변 개수의 인수 전달
◦
스프레드 연산자 * 를 통해 가변적인 수의 인수를 포함하는 배열을 함수에 전달할 수 있다.
◦
함수에서는 vararg를 통해 가변적인 개수의 인수를 받을 수 있다.
fun main() {
val lettersArray = arrayOf("c", "d")
printAllStrings("a", "b", *lettersArray)
// abcd
}
fun printAllStrings(vararg strings: String) {
for (string in strings) {
print(string)
}
}
Kotlin
복사
•
배열 비교
◦
두 배열에 같은 요소가 같은 순서로 있는지 비교하려면 .contentEquals() 및 .contentDeepEquals() 함수를 사용한다.
◦
배열을 비교하기 위해 == 또는 != 를 사용하는 것은 동등성 비교가 아니라 참조 비교이다.
val simpleArray = arrayOf(1, 2, 3)
val anotherArray = arrayOf(1, 2, 3)
// Compares contents of arrays
println(simpleArray.contentEquals(anotherArray))
// true
// Using infix notation, compares contents of arrays after an element
// is changed
simpleArray[0] = 10
println(simpleArray contentEquals anotherArray)
// false
Kotlin
복사
•
배열 변환
◦
sum
▪
.sum() 함수를 사용해서 모든 요소의 합계를 반환한다.
▪
숫자형 타입 배열에서만 사용 가능하다.
val sumArray = arrayOf(1, 2, 3)
// Sums array elements
println(sumArray.sum())
// 6
Kotlin
복사
◦
shuffle
▪
.shuffle() 함수를 사용한다.
val simpleArray = arrayOf(1, 2, 3)
// Shuffles elements [3, 2, 1]
simpleArray.shuffle()
println(simpleArray.joinToString())
// Shuffles elements again [2, 3, 1]
simpleArray.shuffle()
println(simpleArray.joinToString())
Kotlin
복사
◦
convert arrays to collections
▪
.toList(), .toSet() 함수를 사용한다.
//Array to List
val simpleArray = arrayOf("a", "b", "c", "c")
// Converts to a Set
println(simpleArray.toSet())
// [a, b, c]
// Converts to a List
println(simpleArray.toList())
// [a, b, c, c]
Kotlin
복사
▪
Pair<K, V> 배열만 Map으로 변환할 수 있다.
▪
중위 표기법을 사용하여 to 함수를 호출하여 Pair 튜플을 만든다.
//Array to Map
val pairArray = arrayOf("apple" to 120, "banana" to 150, "cherry" to 90, "apple" to 140)
// Converts to a Map
// The keys are fruits and the values are their number of calories
// Note how keys must be unique, so the latest value of "apple"
// overwrites the first
println(pairArray.toMap())
// {apple=140, banana=150, cherry=90}
Kotlin
복사
원시형 배열
•
Array와 기본형 타입을 함께 사용하면 기본형은 객체로 박스화된다.
•
기본형 타입을 박스화 오버헤드 없이 그대로 사용하려면 원시형 배열을 사용해야 한다.
•
원시형 배열을 객체형 배열로 변환하려면 .toTypedArray()를 사용한다.
•
객체형 배열을 원시형 배열로 변환하려면 .toByteArray(), .toCharArray() 등을 사용한다.
원시형 배열 | Java |
BooleanArray | boolean[] |
ByteArray | byte[] |
CharArray | char[] |
DoubleArray | double[] |
FloatArray | float[] |
IntArray | int[] |
LongArray | long[] |
ShortArray | short[] |