개발자의 생활

배열 기본 사용법 본문

kotlin(코틀린) 강좌

배열 기본 사용법

Developer성현 2024. 8. 26. 08:00

이번에는 코틀린에서 배열과 리스트 사용법을 알아보겠습니다.

 

배열도 변수 사용법과 거의 동일합니다.

하지만 코틀린에서는 배열 사용법이 타 언어에 비해 조금 더 다양한 거 같습니다. 저도 아직 헷갈리는 부분들도 있지만 아는 대로 정리를 해보겠습니다.

 

1. 배열1

fun main() {
    var intArrayValue1 = arrayOf(0, 1, 2, 3) //데이터 타입 Array<Int> 추론
    var intArrayValue2 = arrayOf(null, 1, 2, 3) //데이터 타입 Array<Int?> 추론
    var intArrayValue3: Array<Int> = arrayOf(0, 1, 2, 3) //데이터 타입 Array<Int> 명시
    var intArrayValue4: Array<Int?> = arrayOf(null, 1, 2, 3) //데이터 타입 Array<Int?> 명시
    var intArrayValue5 = Array(5){1} //데이터 타입 Array<Int> 추론, 선언과 동시에 배열크기를 5로 지정하고 모든 인덱스 값에 1을 초기값으로 지정
    var intArrayValue6: Array<Int?> = Array(5){null} //데이터 타입 Array<Int?> 명시(추론 안됨), 선언과 동시에 배열크기를 5로 지정하고 모든 인덱스 값에 null 로 초기값으로 지정
    var intArrayValue7 = arrayOfNulls<Int>(5) //데이터 타입 Array<Int?> 추론( arrayOfNulls<Int?>(5) 동일 ), 선언과 동시에 배열크기를 5로 지정하고 모든 인덱스 값에 null 을 초기값으로 지정
    var intArrayValue8: Array<Int>? = null
    intArrayValue8 = intArrayValue1;

    var floatArrayValue1 = arrayOf(0.1f, 0.2f, 0.3f, 0.4f) //데이터 타입 Array<Float> 추론
    var floatArrayValue2: Array<Float> = arrayOf(0.1f, 0.2f, 0.3f, 0.4f) //데이터 타입 Array<Float> 명시
    var floatArrayValue3 = Array(5){0.5f} //데이터 타입 Array<Float> 추론, 선언과 동시에 배열크기를 5로 지정하고 모든 인덱스 값에 0.5f을 초기값으로 지정
    var floatArrayValue4 = arrayOfNulls<Float>(5) //데이터 타입 Array<Int?> 추론, 선언과 동시에 배열크기를 5로 지정하고 모든 인덱스 값에 null 을 초기값으로 지정


    var stringArrayValue1 = arrayOf("str", "Kotlin", "코틀린") //데이터 타입 Array<String> 추론
    var stringArrayValue2: Array<String> = arrayOf("str", "Kotlin", "코틀린") //데이터 타입 Array<String> 명시
    var stringArrayValue3 = Array(5){""} //데이터 타입 Array<String> 추론, 선언과 동시에 배열크기를 5로 지정하고 모든 인덱스 값에 공백으로 초기값 지정

}

예시로 Int, Float, String로 선언코드를 작성해 보았습니다. 특히 Int 형 배열은 다양한 방식으로 선언을 해 보았습니다. 한번 주석을 읽어보시고 다른 타입으로도 생성코드를 직접 작성해 보세요(선언 방식이 많아서 조금 헷갈리네요...)

 

배열을 생설할때는 arrayOf 제네릭함수를 통해 생성을 하게 됩니다. 

 

배열도 변수처럼 추론을 통해 타입이 지정되며 타입을 직접 명시할 수도 있습니다.

 

코 틀린 또한 배열은 한번 사이즈를 정하면 변경할 수 없습니다.

 

Array(5){1} 은 크기를 지정하고 동시에 중괄호에 있는 값으로 모두 초기화시키게 됩니다. 중요한 것은 {} 안에 null을 넣어도 참조타입으로 추론이 안됩니다. 이유는 저도 명확하게는 모르겠습니다.

 

arrayOfNulls <Int>(5) 은 크기를 지정하고 동시에 null로 초기화됩니다. 그래서 제네릭으로 Int로 지정을 하더라도 자동으로 Int?로 추론됩니다

 

배열도?을 붙여서 null값을 넣을 수 있으며 컴파일 시에는? 가 있건 없건 참조타입으로 박싱 됩니다. 이유는 자바에서도 배열 자체가 객체이기 때문입니다.

Array <Int?>, Array <int>? 주의!

 

2. 배열 2

사실 arrayOf제네릭 함수를 사용하지 않는 배열도 있습니다. 이것도 먼저 코드를 보겠습니다.

fun main() {
    var intArrayValue1 = intArrayOf(0, 1, 2, 3) //데이터 타입 IntArray 추론
    var intArrayValue2: IntArray = intArrayOf(0, 1, 2, 3) //데이터 타입 IntArray 명시
    var intArrayValue3 = IntArray(5){1} //데이터 타입 IntArray 추론, 선언과 동시에 배열크기를 5로 지정하고 모든 인덱스 값에 1을 초기값으로 지정
    var intArrayValue4 = IntArray(5) //데이터 타입 IntArray 추론, 선언과 동시에 배열크기를 5로 지정하고 모든 인덱스 값에 기본으로 0 이 들어감

    var floatArrayValue1 = floatArrayOf(0.1f, 0.2f, 0.3f, 0.4f)
    var floatArrayValue2: FloatArray = floatArrayOf(0.1f, 0.2f, 0.3f, 0.4f)
    var floatArrayValue3 = FloatArray(5){0.5f}
    var floatArrayValue4 = FloatArray(5)
}

위와 같이 사용법은 거의 동일합니다. 다만 arrayOf 앞에 타입명이 붙게 됩니다.

arrayOf로 선언한 배열과의 차이점은 각 요소에 null값을 사용하지 못한다는 특징이 있습니다.

또한 문자열 String 변수는 생성을 못 합니다.

 

이유는 지금 이 코드는 원시타입 배열이고 arrayOf로 생성한 배열은 참조타입 배열이기 때입니다.

String 배열을 생성하지 못하는 이유를 좀 더 자세하게 설명드리면 자바에서 String 변수 자체가 참조타입 이기 때문입니다.

그리고 배열 또한 원소가 참조타입이기 때문에 원시타입으로는 생성을 못하니 당연한 이유입니다.

 

간단하게 자바코드와 비교해 보겠습니다.

var intArrayValue1 = arrayOf(0, 1, 2, 3)       <->       Integer [] intArrayValue1 = new Integer[] {0, 1, 2, 3};
var intArrayValue1 = intArrayOf(0, 1, 2, 3)   <->       int [] intArrayValue2 = new int []{0, 1, 2, 3};

 

이렇게 각각의 배열 선언방법을 알아보았으니 실제로 값을 가져오고 변경하는 것을 해보겠습니다.

 

3. 배열 사용

사용법은 타 언어들과 비슷합니다. "대괄호[]" 안에 인덱스 번호를 넣어 값을 재정의 할 수 있고 가져올 수도 있습니다.

또한 get, set을 통해서도 동일한 결과를 수행할 수 있으며 다양한 함수들이 제공됩니다.

 

간단한 예시코드를 보겠습니다.

 

1. 배열 입출력 코드

fun main() {
    var intArray = arrayOf(0, 1, 2, 3) //데이터 타입 Array<Int> 추론

    var index0 = intArray[0]
    var index1 = intArray.get(1)
    println("0번 인덱스: $index0")
    println("1번 인덱스: $index1")

    intArray[0] = 10
    intArray.set(1, 20)

    index0 = intArray[0]
    index1 = intArray.get(1)

    println("0번 인덱스: $index0")
    println("1번 인덱스: $index1")

}

실행경과

 

*  추가 정보

print, println 함수에 문자열 내부에 $를 붙이고 변수명을 붙이면 변숫값이 출력됩니다.

 

 

 

2. 배열 사이즈 구하기

fun main() {
    var intArray = arrayOf(0, 1, 2, 3) //데이터 타입 Array<Int> 추론
    var arraySize = intArray.size

    println("배열 사이즈: $arraySize")
}

실행결과

 

3. 배열(Number 타입) 총합 구하기

fun main() {
    var intArray = arrayOf(0, 1, 2, 3) //데이터 타입 Array<Int> 추론
    var sum = intArray.sum()

    println("총합: $sum")
}

실행결과

 

4. 배열 정렬

fun main() {
    val intArray = intArrayOf(5, 3, 1, 4, 2)
    val sortedArray = intArray.sortedArray()
    for(arrayNum in intArray){
        print("$arrayNum ")
    }
    println()// 줄 바꿈
    for(arrayNum in sortedArray){
        print("$arrayNum ")
    }

}

실행결과

* 추가정보

sortedArray() 함수는 Timsort알고리즘을 사용합니다. 해당 알고리즘은 병합과 삽입 정렬의 장점을 결합한 알고리즘으로

시간 복잡도는 O(n log n)입니다.

 

중간에 반복문을 사용하여 배열의 원소를 출력하는 코드가 있지만 아직 조건문, 반복문은 배우지 않았으니 이는 다음에 알아보겠습니다. 일단은 arrayNum에 각 원소가 순서대로 들어간다고 보면 되겠습니다.

 

5. 요소를 지정된 구분자로 연결한 문자열을 반환

fun main() {
    var intArray = arrayOf(0, 1, 2, 3) //데이터 타입 Array<Int> 추론
    val result = intArray.joinToString(separator = " | ")

    println(result)
}

실행결과

* 추가정보

. joinToString() 괄호를 비우면 기본으로 ", " 으로 구분하여 연결합니다.

 

4. 정리

배열에도 참조타입과 원시타입이 존재하며 각각 다양한 편리한 함수들을 제공하고 있습니다.

(예시로 보여드린 것은 극히 일부입니다)

변수도 마찬가지이지만 참조타입은 클래스로 만들어진 객체이기 때문에 원시타입에 비해서는 속도가 느리다는 단점이 있습니다. 하지만 제공하는 기능이 더 많다고 합니다. 하지만 사실 저도 공부하는 단계라 자세히 알지는 못합니다.

 

이상으로 배열에 대한 설명을 마치겠습니다.

감사합니다

'kotlin(코틀린) 강좌' 카테고리의 다른 글

조건문, 반복문 (연산자)  (2) 2024.09.09
함수  (0) 2024.08.30
List, Set, Map 컬렉션(Collection)  (0) 2024.08.29
변수  (0) 2024.08.22
kotlin(코틀린) 시작하기  (0) 2024.08.13