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