본문 바로가기

Kotlin

Kotlin - 데이터 타입 (배열)

출처 : https://kotlinlang.org/docs/arrays.html

 

Arrays | Kotlin

 

kotlinlang.org

 

배열은 다른 언어와 마찬가지로 고정된 사이즈수의 동일하거나 하위 타입 데이터를 담는 데이터 타입이다. Kotlin 에서는 Array 클래스를 이용해서 표현된다.

배열을 사용하는 경우

Kotlin 에서 배열은 일반 어플리케이션 대비 높은 성능이 필요하거나, 사용자 정의 자료구조를 정의하는 등 저수준 요구사항을 만족시키기 위한 경우 주로 사용된다. 그렇지 않은경우에는 그냥 Collections(list, set, map) 을 사용하면 된다.

Collections은 배열 에 비해 아래와 같은 이점들이 있다.

  • Collections은 read only 로 만들수 있어서 명확한 의도를 가진 강력한 코드와 더 많은 제어 기능을 제공 한다.
  • 사이즈가 고정된 배열에 비해 원소를 추가하거나 제거하는 것이 편리 하다. 배열에서 원소를 추가하거나 제거하는 유일한 방법은 배열을 새로 만드는 일 뿐이어서 불편하다.
  • Collections 는 구조적으로 동일함을 비교하기 위해 동등 비교 연산자 (==)를 사용할 수 있다. 배열을 서로 비교하기 위해서는 특별한 다른 함수를 사용해야 한다.

 

배열 생성하기

  • arrayOf(), arrayOfNulls(), emptyArray()
  • Array 생성자

를 이용해서 배열을 생성 할 수 있다.

arrayOf()

// Creates an array with values [1, 2, 3]
val simpleArray = arrayOf(1, 2, 3)
println(simpleArray.joinToString())
// 1, 2, 3

arrayOfNulls()

// Creates an array with values [null, null, null]
val nullArray: Array<Int?> = arrayOfNulls(3)
println(nullArray.joinToString())
// null, null, null

emptyArray()

var exampleArray = emptyArray<String>()
// var exampleArray: Array<String> = emptyArray()

Array 생성자

// Creates an Array<Int> that initializes with zeros [0, 0, 0]
val initArray = Array<Int>(3) { 0 }
println(initArray.joinToString())
// 0, 0, 0

// Creates an Array<String> with values ["0", "1", "4", "9", "16"]
val asc = Array(5) { i -> (i * i).toString() }
asc.forEach { print(it) }
// 014916

 

중첩 배열

다른 언어들과 마찬가지로 배열의 원소로 배열을 가질 수 있다.

// Creates a two-dimensional array
val twoDArray = Array(2) { Array<Int>(2) { 0 } }
println(twoDArray.contentDeepToString())
// [[0, 0], [0, 0]]

// Creates a three-dimensional array
val threeDArray = Array(3) { Array(3) { Array<Int>(3) { 0 } } }
println(threeDArray.contentDeepToString())
// [[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]

 

원소에 접근하고 수정하기 (Accesse and modify elements)

"[인덱스]"를 이용해서 특정 원소에 접근할 수 있다. 배열은 변경이 불가능 하기 때문에 Array<String>을 Array<Any>에 할당하는 것이 불가능 하다.

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

 

배열 작업

함수의 매개변수로 전달

vararg 키워드를 이용해서 파라미터 갯수가 정해지지 않은 경우 (가변인자) 매개변수를 배열로 전달 할 수 있다.

함수의 가변인자로 배열을 전달 하려는 경우 spread 연산자(*)를 이용하여 배열을 전달 할 수 있다.

fun main() {
    val lettersArray = arrayOf("c", "d")
    printAllStrings("a", "b")
    // ab
    printAllStrings(*lettersArray)
    // cd
    printAllStrings("a", "b", *lettersArray)
    // abcd
}

fun printAllStrings(vararg strings: String) {
    for (string in strings) {
        print(string)
    }
    print("\n")
}

배열 비교

두 배열에 같은 순서로 같은 원소들이 존재하는지 비교 하고 싶은 경우 .contentEquals() 와 .contentDeepEquals() 함수를 이용한다. 배열이 일차원 배열인 경우 contentEquals() 함수를, 다차원 배열인 경우 contentDeepEquals() 함수를 이용한다.

동등 비교연산자는 두 객체가 같은 객체인지를 비교하기 때문에,배열의 원소내용을 비교하는데 동등 비교연산자(==, !=)를 사용해서는 안된다. 

val array = arrayOf(1, 2, 3)
val array2 = arrayOf(1, 2, 3)

println(array.contentEquals(array2)) // true
// infix 표현법
println(array contentEquals array2) // true


val nestedArray = arrayOf(arrayOf(1, 2), arrayOf(3, 4))
val nestedArray2 = arrayOf(arrayOf(1, 2), arrayOf(3, 4))

println(nestedArray.contentEquals(nestedArray2)) // false
println(nestedArray.contentDeepEquals(nestedArray2)) // true
println(nestedArray contentDeepEquals nestedArray2) // true

배열 변경

좀더 다양하고 자세한 내용은 API reference를 참조하자.

Sum (Int와 같은 숫자 타입의 배열에만 사용 가능 함)

val sumArray = arrayOf(1, 2, 3)

// Sums array elements
println(sumArray.sum())
// 6

Shuffle

val simpleArray = arrayOf(1, 2, 3)

// 원소들이 랜덤으로 섞임
simpleArray.shuffle()
println(simpleArray.joinToString())

List 나 Set 으로 변환

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]

Map 으로 변환

map으로 변환 가능 한 배열은 원소로 Pair<K,V>를 가지는 배열 뿐이며, toMap()함수를 이용하여 배열을 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}

 

기본 타입 배열 (Primitive-type arrays)

Array 클래스에 기본 타입(primitivy type) 값을 사용한다면, 값들은 모두 boxing 되어 overhead가 발생한다. 이를 방지하고 싶다면 기본 타입 배열을 사용 하면 된다. 기본타입 배열은 Array와 아무런 연관(상속) 관계가 없지만 동일한 속성과 함수를 제공한다.

기본타입 배열로 변환하고 싶다면 .toBooleanArray(), toByteArray() 등과 같은 to{Typed}Array() 함수를 이용한다.

Primitive-type array Java
BooleanArray boolean[]
ByteArray byte[]
CharArray char[]
DoubleArray double[]
FloatArray float[]
IntArray int[]
LongArray long[]
ShortArray short[]

 

 

반응형

'Kotlin' 카테고리의 다른 글

Kotlin - 반복문(for, while)  (0) 2024.01.10
Kotlin - 조건문  (2) 2024.01.07
Kotlin - 타입체크와 형 변환  (0) 2024.01.06
Kotlin - 데이터 타입 (Character, String)  (0) 2023.12.31
Kotlin - 데이터 타입 (숫자, Boolean)  (2) 2023.12.30