ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] Array
    Kotlin/Types 2021. 12. 16. 17:05

    https://kotlinlang.org/docs/basic-types.html#arrays

     

    Basic types | Kotlin

     

    kotlinlang.org


    코틀린 배열

    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(", ")
        }
    
    }

    댓글

Designed by Tistory.