Kotlin Programming Intermediate - 2

htwenty-1·2022년 1월 24일
0

Kotlin for Android

목록 보기
2/11
post-thumbnail

코틀린 프로그래밍 두번째입니다.

이번 포스팅에서는 배열에 대해 다룹니다. 자바에서 배열은 같은 자료형으로 이루어진 자료들을 특정 인덱스(주소)에 보관하여 필요에 의해 끌어다 쓰는 서랍과 같은 것이었습니다.

코틀린에서의 배열도 마찬가지입니다. 어차피 JVM에서 돌아가는 언어이므로 자바와 거의 유사합니다.

다만, 배열을 생성하는 방법에 다소 차이가 있습니다.

배열


배열의 선언 / 초기화

자바에서의 배열은

String[] names = new String[3];
String[] names = { "Mike", "Jane", "Johan" };

이러한 방식으로 선언, 초기화를 해주었습니다.

코틀린에서는 조금 다릅니다.

val arr = intArrayOf(1, 2, 3, 4, 5)
println(arr)
println(arr[1])
println(Arrays.toString(arr))
println(arr.contentToString())

우선 intArrayOf라는 메서드가 정수형 배열을 만들어줍니다.
마찬가지로 배열을 그냥 출력하게 되면 메모리 주소가 반환되고, 배열의 인덱스를 지정하여 출력하면 해당 인덱스의 원소가 출력됩니다.

자바에서 배열을 문자열 형태로 출력할 때 Arrays.toString()의 형태를 사용했는데 코틀린도 JVM에서 돌아가므로 이를 사용할 수 있습니다.

또한 코틀린에서 제공하는 contentToString()의 형태도 사용할 수 있습니다.

뿐만 아니라 arrayOf()를 통해서 내부에 들어가는 자료형이 균일하지 않은 배열도 만들어줄 수 있습니다.

val arr1 = arrayOf(1, 1.23, "hi", true)
println(arr1.contentToString())

또 다른 방법으로 배열의 인덱스 개수를 할당하고 내부에 똑같은 값만 채워주는 경우가 있습니다.

// 0~9까지 0으로 채워넣기
val arr2 = Array(10) { 0 }
for (n in arr2) {
	println(n)
}

// 0~9까지의 인덱스에 1부터 1씩 증가하는 숫자들로 채워넣기
var i:Int = 1
var arr3 = Array(10) { i++ }

forEach문으로 배열 순환하기

한편 it 즉 iterator라는 내부적인 기능을 제공합니다. 이는 배열을 돌면서 원소들을 하나하나 거칩니다.

var arr4 = arrayOf<Int>(10, 20, 30)
arr4.forEach { println(it) }		// 10, 20, 30

var arr5 = arrayOf<String>("하나", "둘", "삼")
arr5.forEach { println(it) }		// 하나, 둘, 삼

배열의 길이

자바에서는 배열의 길이를 알고자 할 때 배열명.length를 사용했습니다.

코틀린에서는 자바의 리스트의 길이를 알고자 할 때 사용하는 size를 사용합니다.

val array = intArrayOf(1, 2, 3, 4, 5)
println("${array.size}")
println("${array.sum()}")	// 15 ---> 배열 원소의 합을 구해주는 메서드
println("${array.contentToString()}")

배열의 값 가져오기

아래와 같은 배열이 있다고 가정할 때, 가장 쉽게 배열의 특정 값을 가져오는 방법은 배열의 인덱스로 참조해서 가져오는 것입니다.

val array = intArrayOf(1, 2, 3, 4, 5)
println(array[2])

또한 코틀린에서는 자바의 리스트에서 사용한 get메서드를 사용할 수 있습니다.

그래서,

val array = intArrayOf(1, 2, 3, 4, 5)
println(array.get(2))

이와 같이 인덱스를 가져올 수도 있습니다.

배열 전체의 값을 가져올 때 for in 구문을 사용할 수 있습니다.

예를 들어 다음과 같이 사용할 수 있습니다.

1. 배열의 인덱스를 가져오는 구문 : indices

val arr = arrayOf<Int>(10, 20, 30, 40, 50)
for (n in array.indices) {
	println(n)
}

2. 배열의 인덱스와 해당하는 값을 동시에 가져와보기
여기에서는 배열의 범위를 지정해주기 위해 0..arr.size - 1을 사용했습니다. A..BA이상 B이하를 나타냅니다.

val arr = arrayOf<Int>(10, 20, 30, 40, 50)
for(i in 0..arr.size - 1) {		// 배열의 크기가 5이므로 4번째까지 참조하기 위해서 -1
	println("arr[$i] = ${arr[i]}")
}

또 다른 방법으로 until을 사용할 수 있는데

val arr = arrayOf<Int>(10, 20, 30, 40, 50)
for(i in 0 until arr.size) {
	println("arr[$i] = ${arr[i]}")
}

until을 사용하면 해당 값의 -1까지만 돌기 때문애 A until B라고 하면 A이상 B미만의 개념이 됩니다.

3. 포함관계
포함관계는 contains 메서드를 사용합니다.

val arr = arrayOf<Int>(10, 20, 30, 40, 50)
println(arr.contains(10))		// true

배열의 filter


filter란?

필터는 조건에 맞게 배열을 정렬해주는 기능을 말합니다.

예를 들어서 다음과 같은 배열이 있다고 가정하면,

val array = arrayOf(1, -2, 3, 4, -5, 0)

이 배열에서 0보다 큰 값, 즉 음수를 제외하고 출력해보겠습니다.

우선 음수를 털어주는 작업을 해보겠습니다.

array.filter { e -> e > 0 } 

여기까지 필터를 걸었으면 배열 요소를 각각 순회하면서 출력해주겠습니다.

array.filter { e -> e > 0 }.forEach { e -> println(e) }

이렇게 람다식을 사용해서 배열에 필터를 걸어주고 출력까지 할 수 있습니다.

위에서 필터를 걸어서 출력해준 원소들을 다른 배열에 저장해보겠습니다.

var filteredArr = array.filter(e -> e > 0)

filter 응용

우선 배열을 준비해줍니다.

val fruits = arrayOf("banana", "pear", "apple", "kiwi", "avocado")

이 배열에 대해서 맨 앞글자가 'a'인 것, 오름차순 정렬, 내림차순 정렬, 모든 글자를 대문자로 바꾸는 작업을 해보겠습니다.

맨 앞글자가 'a'인 것 찾기

val fruits = arrayOf("banana", "pear", "apple", "kiwi", "avocado")

fruits.filter { it.startsWith("a") }

오름차순으로 정렬

val fruits = arrayOf("banana", "pear", "apple", "kiwi", "avocado")

fruits.sortedBy { it }

내림차순으로 정렬

val fruits = arrayOf("banana", "pear", "apple", "kiwi", "avocado")

fruits.sortedByDescending { it }

대문자로 바꾸기

val fruits = arrayOf("banana", "pear", "apple", "kiwi", "avocado")

fruits.map { it.uppercase(Locale.getDefault()) } 

when 조건절을 사용하여 배열의 특정 원소 뽑아내기

val fruits = arrayOf("banana", "pear", "apple", "kiwi", "avocado")

when {
	"avocado" in fruits -> println("avocado 있음")
}
profile
tried ? drinkCoffee : keepGoing;

0개의 댓글