[코틀린 완전정복] 배열

Dohyeon Ko·2021년 9월 15일
0

코틀린

목록 보기
5/7
post-thumbnail

배열 생성하기

코틀린에서 배열을 생성하기 위해서는 arrayOfArray 를 사용하면 된다. 빈 배열을 생성하고 싶은 경우 arrayOfNulls 를 사용하면 된다. arrayOf는 인자로 배열에 넣을 데이터를 받는다. Array는 데이터의 개수와 초기값을 인자로 받는다. 아래 코드를 보자.

import java.util.*

fun main(args: Array<String>) {
    val array1 = arrayOf(1, 2, 3, 4, 5)
    println(array1)
    println(Arrays.toString(array1))

    val array2 = Array(5) { i -> i * i }
    println(array2)
    println(Arrays.toString(array2))
}

array1은 arrayOf 키워드를 사용해서 배열을 생성했다. 인자로 배열에 넣을 데이터만 받는다. array2는 Array를 사용했고 데이터의 개수와 초기값을 인자로 받는다. 인자로는 람다식 을 이용했다. 다음과 같은 출력 결과를 보여준다.

파이썬 에서는 print(array1)을 하면 배열 내부의 원소를 보여주지만 코틀린 에서는 그렇지 않다. 배열을 단순히 출력하면 배열의 주소값을 출력하게 된다. 배열 내부의 원소를 출력하기 위해서는 java.util 패키지를 import 해서 Arrays.toString 사용해야 한다. 추가적으로 contentToString 를 사용해도 같은 결과가 출력된다. (난 개인적으로 contentToString이 편한 것 같다.)

import java.util.*

fun main(args: Array<String>) {
    val array1 = arrayOf(1, 2, 3, 4, 5)
    println(array1)
    println(array1.contentToString())

    val array2 = Array(5) { i -> i * i }
    println(array2)
    println(array2.contentToString())
}

배열 정렬하기

원본 그대로 두고 정렬된 새로운 배열 반환하기

원본 배열 은 그대로 두고 정렬된 새로운 배열을 반환하기 위해선 sortArraysortArrayDescending 을 사용한다.

import java.util.*

fun main(args: Array<String>) {
    val array1 = arrayOf(5, 4, 3, 2, 1)
    val sortedArray1 = array1.sortedArray() // 오름차순으로 정렬
    println(sortedArray1.contentToString())

    val array2 = Array(5) { index -> index * index }
    val sortedArray2 = array2.sortedArrayDescending() // 내림차순으로 정렬
    println(sortedArray2.contentToString())
}

원본 정렬하기

원본 배열을 정렬하기 위해서는 Array 키워드를 생략한 sortsortDescending 을 사용한다. 인자에 fromIndex, toIndex를 넣어줄 수 있으며 인자를 생략하면 전체 요소를 대상으로 한다. 또한 원본 배열을 정렬하기 때문에 리턴 값이 없다.

import java.util.*

fun main(args: Array<String>) {
    val array1 = arrayOf(5, 4, 3, 2, 1)
    array1.sort()
    println(array1.contentToString())

    // sort와 sortDesending은 리턴값이 없어서 아래 코드의 경우 Unit이 출력된다.
    val sortedArray1 = array1.sort()
    println(sortedArray1)
}

배열에서 리스트로 반환하기

배열과 다르게 리스트는 원소의 삽입과 삭제가 가능하다. 이후에 더 설명하도록 하고, 배열을 리스트로 반환할 수 있다. 이때는 Array 키워드를 생략한 sortedsortedDescending 을 사용한다.

import java.util.*

fun main(args: Array<String>) {
    val array1 = arrayOf(5, 4, 3, 2, 1)
    val sortedList : List<Int> = array1.sorted()
    println(sortedList)
}

배열과 다르게 리스트는 contentToString이나 toString 없이도 내부의 원소를 출력할 수 있다.

sortBy로 인자에 따라 정렬하기

이름과 나이를 갖고 있는 Person 객체를 배열 데이터로 갖고 있는 People Array 객체가 있을 때 이름, 혹은 나이에 따라 정렬하고 싶을 때 어떻게 해야할까? 이 때 sortBysortDescending 을 사용할 수 있다.

import java.util.*

data class Person(val name: String, val age: Int)

fun main(args: Array<String>) {
    val People = arrayOf(
        Person("고도현", 20),
        Person("황철순", 30),
        Person("김강민", 35),
        Person("홍길동", 12),
    )
    println(People.contentToString())
    People.sortBy { it.age } // 나이에 따라 오름차순으로 정렬
    println(People.contentToString())
    People.sortBy { it.name } // 이름에 따라 오름차순으로 정렬
    println(People.contentToString())
}

하지만 sortBy와 sortByDescending은 인자로 1개의 람다식을 갖기 때문에 여러 인자에 대해 정렬을 진행할 수 없다. 이 때 sortWith 을 사용한다.

sortWith로 여러 인자에 따라 정렬하기

sortWithComparator 를 인자로 갖는다. compareBy 를 활용하면 여러 인자에 따라 정렬이 가능하다.

import java.util.*

data class Person(val name: String, val age: Int)

fun main(args: Array<String>) {
    val People = arrayOf(
        Person("고도현", 20),
        Person("황철순", 30),
        Person("김강민", 35),
        Person("홍길동", 12),
    )
    People.sortWith(compareBy({ it.name }, { it.age })) // 이름 오름차순 정렬 후 나이 오름차순 정렬
    println(People.contentToString())
    People.sortWith(compareBy({ it.age }, { it.name })) // 나이 오름차순 정렬 후 이름 오름차순 정렬
    println(People.contentToString())
}

정리

edArray 가 붇으면 배열로 반환하고, ed 만 붙으면 리스트로 반환, 아무것도 붙지 않은 경우 원본을 정렬한다.

  • 반환 값이 있는가?
    • sortedArray / sortedArrayDesending (배열로 반환)
    • sorted / sortedDesending (리스트로 반환)
    • sortedBy / sortedByDesending (하나의 인자에 따라 정렬 후 리스트로 반환)
    • sortedArrayWith ( 두 개 이상의 인자에 따라 정렬 후 배열로 반환)
    • sortedWith (두 개 이상의 인자에 따라 정렬 후 리스트로 반환)
  • 반환 값이 없는가? (원본을 정렬)
    • sort / sortDesending (정렬)
    • sortBy / sortByDesending (하나의 인자에 따라 정렬)
    • sortWith (두 개 이상의 인자에 따라 정렬)
profile
티스토리로 옮겼어요! (https://codekodo.tistory.com)

0개의 댓글