/* 본 게시물은 ' Do it! 코틀린 프로그래밍 | with 황영덕 ' 의 내용을 토대로 작성되었습니다. */
참고 자료
[kotlin array 표준 라이브러리] : https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-array/
#배열 사용해보기
배열에 대한 특징은 [자료 구조] 배열에서 다루었다. (배열에 대해 잘 모르면 한 번 읽어보길 추천한다.) 이번에는 코틀린으로 배열을 사용하는 방법을 익혀보자.
1. 일차원 배열
배열의 기본적인 형태로 코틀린에서는 배열을 arrayOf() 나 Array() 생성자를 사용해 배열을 만든다. 빈 상태의 배열을 만들고 싶으면 arrayOfNulls<>() 를 통해 생성할 수 있다.
//arrayOf() 생성자 : 배열의 값을 알고 있을 때
val arr = arrayOf(1,2,3,4)
val arr2 = arrayOf("a", "b", "c")
// Array(요소 개수, 초깃 값) 생성자
val arr3 = Array(3){i -> i + 1} // [1,2,3]
val arr4 = Array(3) { 0 } // [0,0,0]
val arrOfNulls = arrayOfNulls<Int>(3) // [null,null,null]
// primitive type array ex) IntArray -> int[]
val intArray = intArrayOf(1,2,3,4)
2. 다차원 배열
다차원 배열은 일차원 배열을 묶어서 2차원 이상의 배열로 표현하는 형태이다. 2차원 배열을 한번 만들어보자.
val array1 = arrayOf(1,2,3)
val array2 = arrayOf(4,5,6)
val array3 = arrayOf(7,8,9)
val array2d = arrayOf(array1, array2, array3)
1차원 배열을 묶어서 2차원 배열을 만들어 주었다. 각 요소를 접근하는 방법은 다음과 같다.
// 요소 1에 접근하는 방법
array2d[0][0] // 1
// 요소 6에 접근하는 방법
array2d[1][2] // 6
3. 유용한 배열 메서드
Java에서 제공하는 Arrays , 혹은 Kotlin 에서 제공하는 Arrayskt 의 유용한 메서드들을 알아보자.
contentToString() / Arrays.toString() : 1차원 배열 -> String 형으로 변환
// Array -> String 형으로 변환
println(array1.contentToString()) // [1, 2, 3]
println(Arrays.toString(array1)) // [1, 2, 3]
* collections 은 contentToString() 메서드 없이 println() 해도 출력이 된다.
contentDeepToString() / deepToString() : 다차원 배열 -> String 형으로 변환
// print 다차원 배열
println(array2d.contentDeepToString()) //[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
println(Arrays.deepToString(array2d)) //[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
sum() / average() : 배열의 합 / 배열의 평균 계산
println(array1.sum()) // 6
println(array1.average()) // 2
plus() : 배열의 끝에 하나의 요소를 추가한 새 배열 생성
val plusArray = arr.plus(4) // [1,2,3,4]
println(arr.contentToString()) // [1,2,3]
* 주의할 점 : 기존 배열은 그대로이고 새로운 배열을 만든 것이다.
sliceArray(범위) : 해당 범위에 새로운 배열 생성
val sliceArray = arr.sliceArray(0..1) // [1,2]
contains() : 배열에 해당 요소가 있는지 확인
println(arr.contains(1)) // true
// in 연산자를 사용해 검사할 수 도 있다.
println(0 in arr) // False
reversedArray(), reverse() : 역순의 배열 -> reversedArray() 는 새로운 배열 생성 / reverse() 는 기존 배열 역순 처리
arr.reverse() // arr: [3,2,1]
val reversedArray = arr.reversedArray() // 새로운 배열 [3,2,1] 생성
copyOf() : 기존 배열과 같은 새로운 배열을 생성
val arrCopy = arr.copyOf()
이 외에도 많은 메서드들이 있다. 코틀린 공식문서로 들어가 한 번 확인해보자.
4. 배열 정렬하기
코틀린에서는 배열을 정렬하는 메서드도 제공한다.
val arr = arrayOf(6,3,4,1,7,3,1,2)
sort() : 기존 배열을 정렬
arr.sort()
print(arr.contentToString()) // [1, 1, 2, 3, 3, 4, 6, 7]
arr.sort(1,7) // [6, 1, 1, 3, 3, 4, 7, 2] 마지막 index 포함 x
sortedArray() / sortedArrayDescending() : 오름차순/ 내림차순 정렬한 새로운 배열 생성
val sortedArray = arr.sortedArray() // [1, 1, 2, 3, 3, 4, 6, 7]
val descendingArray = arr.sortedArrayDescending() // [7, 6, 4, 3, 3, 2, 1, 1]
*어떤 정렬 알고리즘을 쓸까? 궁금하다.. 검색해도 안 나오네..
sorted() / sortedDescending() : Array -> 정렬된 List 변환
val listFromArray : List<Int> = arr.toList()
val sortedListFromArray : List<Int> = arr.sorted()
val sortedDescendingListFromArray = arr.sortedArrayDescending()
cf > 객체의 프로퍼티로 정렬하기
1. sortBy { }
data class Person(val name : String, val age : Int)
fun main() {
/**
* 객체의 프로퍼티로 정렬하기 -> sortBy / sortWith() 비교자 사용
*/
val people = arrayOf(
Person("철수", 16),
Person("영수", 19),
Person("안수", 17),
Person("미수", 21),
Person("정수", 24),
Person("진수", 23),
)
//sortBy 로 정렬
people.sortBy{ it.age }
people.forEach { println(it) }
}