[Kotlin] Array

Hood·2024년 9월 11일

Kotlin

목록 보기
8/18
post-thumbnail

✍ 코틀린과 친해지자

PS 문제를 하나씩 풀다 보니, 공부가 필요하다고 느낀 문법을 정리한 글입니다.


🔎 Array

배열(Array)은 같은 타입의 값을 고정된 크기로 저장하는 자료구조입니다.
즉, 여러 값을 하나로 묶어서 다룰 수 있지만, 한 번 생성하면 크기를 바꿀 수 없다는 특징이 있습니다.

Kotlin에서도 배열을 사용할 수 있지만, 일반적인 경우에는 List, Set, Map 같은 컬렉션을 더 자주 사용합니다.
그럼에도 배열은 특정 상황에서 여전히 유용하게 쓰입니다.


배열을 사용하는 경우

배열은 주로 크기가 정해진 데이터를 인덱스로 빠르게 다뤄야 할 때 사용합니다.
또는 자바 API와 함께 작업하거나, 원시 타입 배열(IntArray, DoubleArray)이 필요한 경우에도 자주 등장합니다.

컬렉션과 비교하면 다음과 같은 차이가 있습니다.

  • 컬렉션은 읽기 전용과 변경 가능한 형태가 나뉘어 있어 의도를 더 분명하게 표현할 수 있습니다.
  • 컬렉션은 요소 추가와 삭제가 비교적 자연스럽지만, 배열은 크기가 고정되어 있어 요소를 늘리거나 줄이려면 새 배열을 만들어야 합니다.
  • 컬렉션은 ==로 구조적 비교를 할 수 있지만, 배열은 ==가 참조 비교이기 때문에 내용 비교에는 contentEquals()를 사용해야 합니다.

즉, Kotlin에서는 보통 컬렉션이 더 자주 쓰이지만,
고정된 크기의 데이터를 다루거나 배열 자체가 더 적합한 상황에서는 배열을 사용하는 것이 자연스럽습니다.


배열 생성

Kotlin에서는 여러 방식으로 배열을 만들 수 있습니다.

1. arrayOf()

가장 기본적인 배열 생성 방식입니다.
값을 직접 넣어서 배열을 만들 수 있습니다.

fun main() {
    val simpleArray = arrayOf(1, 2, 3)
    println(simpleArray.joinToString())
}
// 1, 2, 3

arrayOf()는 전달한 값들을 바탕으로 배열을 생성합니다.
joinToString()을 사용하면 배열의 요소를 보기 쉽게 출력할 수 있습니다.


2. arrayOfNulls()

주어진 크기만큼 null로 채워진 배열을 만들 때 사용합니다.

fun main() {
    val nullArray: Array<Int?> = arrayOfNulls(3)
    println(nullArray.joinToString())
}
// null, null, null

위 예제에서는 크기가 3인 배열을 만들고, 모든 요소가 null로 초기화된 상태입니다.
null이 들어갈 수 있으므로 타입도 Int?처럼 nullable 타입으로 선언해야 합니다.


3. emptyArray()

비어 있는 배열을 만들 때 사용합니다.

fun main() {
    val exampleArray = emptyArray<String>()
    println(exampleArray.joinToString())
}

emptyArray()는 요소가 없는 배열을 생성합니다.
초기값 없이 빈 배열이 필요한 상황에서 사용할 수 있습니다.


4. 초기값으로 채운 배열 생성

특정 크기의 배열을 만들고, 모든 요소를 같은 값으로 초기화할 수도 있습니다.

fun main() {
    val initArray = Array(3) { 0 }
    println(initArray.joinToString())
}
// 0, 0, 0

위 코드는 크기가 3인 배열을 만들고, 각 요소를 모두 0으로 초기화합니다.

다만 정수처럼 원시 타입을 다룰 때는 Array<Int>보다 IntArray를 쓰는 경우도 많습니다.

fun main() {
    val intArray = IntArray(3)
    println(intArray.joinToString())
}
// 0, 0, 0

IntArray는 정수 전용 배열이며, 기본값인 0으로 초기화됩니다.


5. 인덱스를 활용한 배열 생성

배열을 만들 때 각 인덱스를 이용해 값을 계산할 수도 있습니다.

fun main() {
    val asc = Array(5) { i -> (i * i).toString() }
    asc.forEach { print(it) }
}
// 014916

위 예제에서는 각 인덱스 i에 대해 i * i 값을 문자열로 저장하고 있습니다.
즉, 인덱스 0부터 4까지의 제곱값인 0, 1, 4, 9, 16이 배열에 들어갑니다.


배열 비교 시 주의할 점

배열은 컬렉션과 다르게 ==로 비교하면 내용이 아니라 참조를 비교합니다.

fun main() {
    val a = arrayOf(1, 2, 3)
    val b = arrayOf(1, 2, 3)

    println(a == b)
    println(a.contentEquals(b))
}
false
true

a == b는 두 배열이 같은 객체인지를 확인하므로 false가 나오고,
contentEquals()는 배열 안의 요소가 같은지를 비교하므로 true가 나옵니다.

이 부분은 컬렉션과 다르기 때문에 꼭 구분해서 알아두는 것이 좋습니다.


📌 결론

이번 글에서는 Kotlin의 배열(Array)에 대해 정리해보았습니다.

배열은 같은 타입의 데이터를 고정된 크기로 저장하는 자료구조이며,
인덱스로 빠르게 접근할 수 있다는 장점이 있습니다.
다만 크기를 바꿀 수 없고, 컬렉션보다 유연성이 적기 때문에 Kotlin에서는 일반적으로 컬렉션을 더 많이 사용합니다.

그럼에도 다음과 같은 상황에서는 배열이 유용합니다.

  • 크기가 고정된 데이터를 다룰 때
  • 인덱스 기반 접근이 중요할 때
  • 자바 API와 함께 사용할 때
  • IntArray 같은 원시 타입 배열이 필요할 때

즉, 배열과 컬렉션은 서로 대체 관계라기보다
상황에 따라 더 적합한 쪽을 선택하는 것이 중요하다고 볼 수 있습니다.

profile
달을 향해 쏴라, 빗나가도 별이 될 테니 👊

0개의 댓글