# Table of Contents
# 배열
배열(Array)은 같은 자료형의 데이터를 한꺼번에 관리하는데 사용한다.
# 배열 생성하기
배열을 생성하는 방법에는 두 가지가 있다.
arrayOf()메소드Array클래스
# arrayOf()
배열을 선언하고 초기화할 때는 arrayOf()메소드를 사용한다. 담을 데이터의 타입은 제너릭 안에 적어준다.
var numbers: Array<Int> = arrayOf<Int>(1, 2, 3, 4, 5)
이렇게 선언된 배열의 각 요소는 []를 사용하여 접근할 수 있다.
numbers[0] // 1
numbers[1] // 2
numbers[2] // 3
numbers[3] // 4
numbers[4] // 5
객체의 배열은 다음과 같이 생성한다.
class Person (val name: String, val age: Int) {
// ...
}
val people: Array<Person> = arrayOf<Person>(
Person("Paul", 34),
Person("Jenny", 20),
Person("John", 25)
)
arrayOfNulls()를 사용하면 null로 채워진 배열을 생성할 수 있다. 인자에 배열의 크기를 전달해야한다.
val people: Array<Person?> = arrayOfNulls(5)
println(Arrays.toString(people)) // [null, null, null, null, null]
# Array 클래스
배열을 생성할 때 Array클래스의 생성자를 사용할 수 있다. 첫 번째 인자는 배열의 크기이며, 두 번째 인자는 람다가 전달되는데 람다의 인자로 배열의 인덱스가 전달된다.
// 크기가 4인 배열
val numbers = Array<Int>(4, { idx -> idx * 2 })
for (number in numbers) {
println(number)
}
// 0
// 2
// 4
// 6
다음과 같이 람다를 밖으로 빼낼 수도 있다.
val numbers = Array<Int>(4) { idx -> idx * 2 }
for (number in numbers) {
println(number)
}
# 배열의 길이
size 속성으로 배열의 길이를 확인할 수 있다.
// 배열의 길이
var length = players.size // 3
# 원시 타입을 위한 배열
Kotlin은 원시 타입을 위한 배열을 제공한다. 예를 들어 intArrayOf() 메소드를 사용하면 Int타입의 배열을 생성할 수 있다.
val numbers: IntArray = intArrayOf(1, 2, 3)
IntArray()클래스를 사용할 수도 있다.
val numbers: IntArray = IntArray(5) // 배열의 크기 지정
for (number in numbers) {
println(number)
}
// 0
// 0
// 0
// 0
// 0
IntArray()의 두 번째 인자로 전달되는 람다를 통해서 요소들을 초기화할 수 있다.
val numbers: IntArray = IntArray(5) { index -> index * 2 }
for (number in numbers) {
println(number)
}
// 0
// 2
// 4
// 6
// 8
Kotlin이 제공하는 원시 타입을 위한 배열은 다음과 같다.
- ByteArray
- ShortArray
- IntArray
- LongArray
- FloatArray
- DoubleArray
- BooleanArray
- CharArray
# Array vs. IntArray
Array<Int>는 Java의 Integer[]와 동일하다.
// kotlin
val arr: Array<Int> = arrayOf(1, 2, 3, 4, 5)
// java
Integer[] arr = {1, 2, 3, 4, 5};
반면 IntArray는 Java의 int[]와 동일하다.
// kotlin
val arr: IntArray = intArrayOf(1, 2, 3, 4, 5)
// java
int[] arr = {1, 2, 3, 4, 5};
Java의 Integer는 Wrapper 클래스이기 때문에 바이트 코드로 변환하는 과정에서 박싱(Boxing)이 발생하여 성능이 저하된다. 따라서 원시 타입의 배열을 사용하는 경우 null을 저장할 필요가 없다면 Array<Int> 보단 IntArray를 사용하자.
# 배열 순회
for in 구문을 사용하면 배열의 각 요소를 순회할 수 있다.
var numbers: Array<Int> = arrayOf<Int>(1, 2, 3, 4, 5)
for (number in numbers) {
println(number)
}
// 1
// 2
// 3
// 4
// 5
요소의 인덱스도 필요하다면 Array클래스의 withIndex()를 사용할 수 있다.
var numbers: Array<Int> = arrayOf<Int>(1, 2, 3, 4, 5)
for ((index, number) in numbers.withIndex()) {
println("index: ${index}, number: ${number}")
}
// index: 0, number: 1
// index: 1, number: 2
// index: 2, number: 3
// index: 3, number: 4
// index: 4, number: 5
Array클래스의 forEach()를 사용할 수도 있다.
var numbers: Array<Int> = arrayOf<Int>(1, 2, 3, 4, 5)
numbers.forEach { element ->
println(element)
}
// 1
// 2
// 3
// 4
// 5
# 배열을 List로 변환
val arr: Array<String> = arrayOf("a", "b", "c", "d", "e")
val list: List<String> = arr.toList()
val arr: Array<String> = arrayOf("a", "b", "c", "d", "e")
val mutableList: MutableList<String> = arr.toMutableList()