-
[Kotlin] ArrayKotlin/Types 2021. 12. 16. 17:05
https://kotlinlang.org/docs/basic-types.html#arrays
코틀린 배열
1. primitive 타입 배열
2. 객체 타입 배열
1. primitive 타입 배열
(package kotlin 패키지 , Arrayskt 파일에 각 primitive 타입 배열 클래스들이 선언되어 있다)
ByteArray, CharArray, ShortArray, IntArray, LongArray, FloatArray, DoubleArray, BooleanArray
각 배열 클래스는 iterator() 메서드를 제외하고 같은 구조로 되어있다.
- IntArray를 확인해보자. (자바의 int[] 배열에 맞게 자동으로 구현이 된다)
- 주생성자
size개수의 int 배열을 생성후, defualt값인 0으로 초기화 한다.
//ArrayTest1.kt fun main() { var intArray: IntArray = IntArray(10) //10개의 element를 가진 int 배열 //default 0으로 초기화된다. for(item in intArray){ print(item) print(", ") } }
코틀린 바이트 코드
- 보조 생성자
size개수의 배열을 생성하고, 배열의 요소에 해당하는 값을 입맛에 맞게 init 함수를 꾸려 초기화할 수 있다.
fun main() { var intArray: IntArray = IntArray(10) { i -> //i번째 요소값 i+100 i + 100 } for (item in intArray) { print(item) print(", ") } }
- 배열의 size
자바의 배열은 불변 객체이다. 그렇기 때문에 배열의 사이즈도 고정된다.
배열의 사이즈를 변경하면 새로운 배열 객체가 대입된다.
//ArrayTest1.kt fun main() { var intArray: IntArray = IntArray(10) println("배열 사이즈: ${intArray.size}") }
- indexed operator
여러가지 인덱스 오퍼레이터 메서드중 두가지가 선언되어 있다.
해당하는 두가지는 함수 호출로도 가능하며 해당되는 인덱스식으로도 사용가능하다.
가독성으로 인해 인덱스식으로 사용하기 위한 오퍼레이터(연산자) 메서드이다.
//ArrayTest1.kt fun main() { var intArray: IntArray = IntArray(10) { i -> i } //0,7 요소 출력 println("element0: ${intArray.get(0)}") println("element7: ${intArray[7]}") //0,7 요소 값 변경 intArray.set(0,100) intArray[7]=107 //0,7 요소 출력 println("element0: ${intArray[0]}") println("element7: ${intArray.get(7)}") }
pakage kotlin의 Library.kt 파일의 intArrayOf 메서드를 사용하여 간단하게 int 배열을 생성할 수 있다.
배열 사이즈= 가변인자의 개수 에 해당하는 배열을 만든다.
//ArrayTest1.kt fun main() { val intArray: IntArray = intArrayOf(0, 1, 2) println("배열 사이즈: ${intArray.size}") for (item in intArray) { print(item) print(", ") } }
기존의 배열값을 참조하여 새로운 배열을 생성할 때 vararg에 가변인자들을 일일이 넣지 않고 어레이를 전달하여 어레이를 값으로 펼치는 spread연산자 * 를 사용할 수도 있다.
//ArrayTest1.kt fun main() { val intArray: IntArray = intArrayOf(0, 1, 2) val intArray2: IntArray = intArrayOf(*intArray) println("intArray.hashCode: ${intArray.hashCode()}") println("intArray2.hashCode: ${intArray2.hashCode()}") println() println("intArray") for (item in intArray) { print(item) print(", ") } println() println("intArray2") for (item in intArray2) { print(item) print(", ") } }
intArrayOf 메서드는 값이 복사된 배열을 생성함을 확인하였다.
2. 객체 타입 배열 Array<T>
primitive의 경우 모두 Wrapper로 boxing 되어 배열의 요소로 저장된다.
package kotlin, Array.kt
package kotlin, Library.kt
기본 라이브러리의 메서드를 사용하면 객체 배열을 쉽게 생성할 수 있다.
--자바의 경우
객체 배열(클래스 객체, Wrapper클래스 객체를 담는)의 경우 사이즈만 지정한 배열을 생성하면
객체 배열이기 때문에 배열의 요소값이 모두 null로 초기화되었다.
class A{} public class ArrayTest { public static void main(String[] args) { Integer[] integers = new Integer[3]; System.out.println(integers[0]); //null A[] arrayA= new A[3]; System.out.println(arrayA[0]); //null } }
--코틀린의 경우
null과 관련하여 타입은 nullable, non null 두가지로 취급되는데
nullable한 객체 배열을 생성하는 arrayOfNulls메서드의 경우 사이즈만 지정하면 모든 요소값들이 null로 초기화된다.
fun main() { val nullable = arrayOfNulls<Int?>(10) //배열 사이즈 10 println(nullable[0]) }
fun main() { val nullable: Array<Int?> = Array<Int?>(10) { i -> if ((i % 2) == 0) { null } else { i } } for(item in nullable){ print(item) print(", ") } }
반면 non-null 객체 배열을 생성하는 arrayOf메서드의 경우에는 객체 배열의 생성과 함께 요소값들을 초기화가 필수다.
(생성과 함께 초기화하지 않으면 코틀린 컴파일러는 배열 요소의 default값으로 어떤값을 사용할지 모르기 때문에 nullable한 요소를 가질 수 밖에 없는 것에 위배된다. 비록 코틀린에서 따로 Int,String등등인 경우 해당 기본값 0,""으로 초기화해주는 문법을 만들었다하더라도 Wrapper,String등등을 제외한 클래스같은 경우 어떻게 초기화시킬지 모르기 때문이다. 또한 자바와의 혼동여지도 있기 때문)
fun main() { val nonNull: Array<Int> = arrayOf(0, 1, 2, 3) println("nonNull") for(item in nonNull){ print(item) print(", ") } println() println("nonNull2") val nonNull2: Array<Int> = Array<Int>(4) { i -> i } for(item in nonNull2){ print(item) print(", ") } }
'Kotlin > Types' 카테고리의 다른 글
[Kotlin] Nothing, Unit (0) 2021.08.16 [Kotlin] Type check and Type casts (0) 2021.08.13 [Kotlin] 코틀린 패키지 / .kt파일과 .java파일 (feat. top-level선언) (0) 2021.07.21 [Kotlin] val / const val (0) 2021.07.21 [Kotlin] 변수/자료형 (0) 2021.07.07