# 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()