Kotlin 기본 Data Types에 대한 정리가 끝나가네요.

 

Array(배열)은 지금까지의 기본 Daya Types과는 조금 다릅니다.

Array는 Data Type보다는 Data Structure라고 표현하는 것이 맞습니다.

Array는 index와 value 쌍으로 조합된 값을 할당할 수 있는 데이터 구조를 가지고 있기 때문입니다.

 

Array in Kotlin

 

Array 생성

Array는 위에 있는 constructor를 통해서 생성할 수 있지만, 실제로는 Kotlin에서 제공하는 function들을 사용하는 것이 유용합니다.

  • arrayOf() - Array에 할당할 values를 입력하여 생성합니다.
  • arrayNulls() - Arrya size를 입력하여, 각 value가 null 인 Array를 생성합니다.
  • emptyArray() - 빈 Array를 생성합니다.
  • Array constructors - Array size와 초기화 값으로 Array를 생성합니다.

무슨 말인지 좀 어려워 보입니다. 아래 코드를 보시면 이해가 되겠지요.

//arrayOf
//1,2,3,4,5가 담긴 Array 생성
val intArray = arrayOf(1,2,3,4,5)
println(intArray.joinToString()) //joinToString()는 Array values들을 String로 반환
//출력결과: 1,2,3,4,5

//arrayOfNulls()
//size가 3이고 values가 null인 Array 생성
val nullArray: Array<Int?> = arrayOfNulls(3)
println(nullArray.joinToString())
//출력결과 null, null, null

//emptyArray
//비어있는(size 0인) Array생성
var array1 = emptyArray<String>()
var array2: Array<String> = emptyArray()

//Array constructor
//size가 5이고 초기값이 1인 Array 생성
val initArray = Array<Int>(3, {0})

 

Nested Array (중첩 배열)

Array안에 value에는 Array가 사용될 수 있습니다. 그런 경우를 Nested Array(중첩 배열)이라고 합니다.

 

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

// 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]]]

 


Array value 접근

val oneDimArray = arrayOf(1, 2, 3) // 1차원 배열
val towDimArray = Array(2) { Array<Int>(2) { 0 } } //2차원 중첩배열

// Array value 변경
oneDimArray[0] = 10
towDimArray[0][0] = 2

println(oneDimArray[0].toString()) // 10
println(towDimArray[0][0].toString()) // 2

 

Array 비교

Array의 값들을 비교 위해서 == 혹은 !=을 사용하면 안됩니다. 두 operator는 생성된 Array(Array object(객체))가 동일한 객체를 가리키는지 여부를 확인하기때문입니다.

값을 비교하기 위해서는 Kotlin에서 제공하는 함수를 사용해야 합니다.

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

println(array1.contentEquals(array2))
//결과: true

array2[0] = 5
println(array1.contentEquals(array2))
//결과: false

 


Kotlin 공식문서에 따르면, 

Use arrays in Kotlin when you have specialized low-level requirements that you need to meet. For example, if you have performance requirements beyond what is needed for regular applications, or you need to build custom data structures. If you don't have these sorts of restrictions, use collections instead.

이라고 되어 있습니다.

대충 이해해보면, "특별한 성능 요구 사항이 있거나 저의하고 싶은 데이터 구조를 만들어야 하는 경우를 제외하고는 가능한 Collection을 사용하록 합니다." 정도입니다. 이유는 아래 내용으로 설명합니다.

  • Collections는 읽기 전용일 수 있으므로 더 많은 제어 기능을 제공하고 명확한 의도가 있는 강력한 코드를 작성할 수 있습니다.
  • Collections에 요소를 추가하거나 제거하는 것은 쉽습니다. 이에 비해 Array는 크기가 고정되어 있습니다. Array에서 요소를 추가하거나 제거하는 유일한 방법은 매번 새 배열을 만드는 것인데 이는 매우 비효율적입니다.
  • Collections이 구조적으로 동일한지 확인하려면 연산자(==)를 사용할 수 있습니다. 배열에는 이 연산자를 사용할 수 없습니다. 대신 배열 비교에서 자세한 내용을 읽을 수 있는 특수 함수를 사용해야 합니다.
val array1 = arrayOf(1,2,3)
val array2 = arrayOf(1,2,3)

println(array1.contentEquals(array2))
//결과: true
println(array1 == array2)
//결과: false
    
array2[0] = 5
println(array1.contentEquals(array2))
//결과: false
println(array1 == array2)
//결과: false
   
val list1 = listOf(1,2,3)
val list2 = mutableListOf(1,2,3)

println(list1 == list2)
//결과: true

list2[0] = 10
println(list1 == list2)
//결과: false

 

위 예제에서 List는 Collection의 한 구현체입니다.


Array to Collections

Collection은 interface입니다. 즉, 누군가가 상속하여 사용해야합니다. 지금 이해가 안가도 상관없습니다.

Collection에는 대표적으로 List와 Set이 있습니다. List와 Set 역시 기회가 되면 자세히 다루겠습니다.

변환은 간단합니다. Kotlin에서 toList()와 toSet() function을 제공합니다.

val simpleArray = arrayOf(1,2,3)

val simpleList:List = array.toList()

val simpleSet:Set = array.toSet()

 

Primitive-type arrays

Kotlin에서는 Boolean, Byte, Char, Double, Float, Int, Long, Short의 경우에는 primitive-type Array를 제공합니다.

혁식은 Array앞에 primitive-type을 붙이면됩니다.

BooleanArray, ByteArray, CharArray, DoubleArray, FloatArray, IntArray, LongArray, ShortArray

Array안에 Data Type이 정해진 Array로 생각하면 됩니다.

예를 들어 CharArray는 Array<Char>과 동일한 뜻으로 보면됩니다.

CharArray in Kotlin

 

위의 Array 코드와 비교해보면 다른 점은 Char로 value의 Type이 정해져 있다는 것 뿐입니다.

 

+ Recent posts