BooleanArray란?
Kotlin의 BooleanArray는 원시 타입(Primitive Type) Boolean으로 이루어진 배열을 나타낸다. Kotlin은 non-nullable한 Boolean을 JVM상에서 Java의 원시 타입인 boolean과 똑같이 저장한다. 이러한 non-nullable한 Boolean 값들의 집합을 원시 타입을 유지하면서 배열로 만든 것이 바로 BooleanArray이다. 이 BooleanArray는 언뜻 보면 Array<Boolean>과 비슷해 보이지만, Array클래스는 객체만을 이낮로 받으므로 Array<Boolean> 속에 들어가는 Boolean은 Primitive Type이 아닌 한번 클래스로 감싸진 Boxed Type의 Boolean이다.
즉, 원시타입 BooleanArray는 Array<Boolean>에 비해 메모리를 효율적으로 사용한다. 이는 BooleanArray의 주석에서 확인할 수 있다. 아래는 Kotlin 1.8.20의 BooleanArray 주석이다.
/**
* An array of booleans. When targeting the JVM, instances of this class are represented as `boolean[]`.
* ...
*/
public class BooleanArray(size: Int)
이를 직역하면 아래와 같다.
boolean의 배열. JVM에서 실행될 때 이 클래스의 인스턴스는 boolean[] 으로 표현된다.
Java에서 boolean[]은 원시타입인 boolean의 Array를 뜻한다.
자 BooleanArray가 무엇인지 이해했으면 이제 BooleanArray를 다루어 보도록 하자.
BooleanArray 조작하기
BooleanArray 생성하기
BooleanArray를 생성하기 위해서는 세가지 방법이 있다. booleanArrayOf를 사용하는 방법, booleanArray의 크기만 지정해 초기화 하는 방법, booleanArray 내부의 값들을 바꾸어 초기화 하는 방법. 자 이제 각각에 대해 알아보자
booleanArrayOf를 사용하는 방법
booleanArrayOf를 사용하는 것이다. booleanArrayOf는 Boolean을 argument를 여러개 받고, 그 크기만큼 배열을 생성한다.
public fun booleanArrayOf(vararg elements: Boolean): BooleanArray
아래와 같이 사용할 수 있다.
booleanArrayOf(true, false, false)
자 한번 여기에 null을 추가해보자. 그러면 아래와 같은 오류를 볼 수 있다. Primitive 타입은 non-null인 값만 갖기 때문이다. 즉, BooleanArray의 모든 인자들은 null이 아니다.
booleanArray의 크기만 지정해 초기화 하기
둘째는 BooleanArray의 크기만 지정해 초기화 하는 방법이다. 이때는 BooleanArray의 기본 constructor을 사용한다.
public class BooleanArray(size: Int)
그런데 앞서 살펴봤듯이 BooleanArray는 무조건 값을 가져야 한다. 그러면 이 경우 어떤 값으로 초기화 될까? 바로 false이다. BooleanArray는 크기만 지정될 경우 모두 false로 초기화된다.
val createdArray = BooleanArray(3) // [false, false, false] 생성
booleanArray 내부의 값들을 바꾸어 초기화 하는 방법
마지막은 BooleanArray의 추가 constructor인 constructor(size: Int, init: (Int) -> Boolean)을 사용해 내부의 값들도 함께 초기화 하는 것이다.
public class BooleanArray(size: Int) {
/**
* Creates a new array of the specified [size], where each element is calculated by calling the specified
* [init] function.
* ...
*/
public inline constructor(size: Int, init: (Int) -> Boolean)
...
}
뒤의 init: (Int) -> Boolean 함수가 BooleanArray의 Index의 값에 해당하는 Boolean 원소 값을 계산한다. 즉 아래와 같이 한다면 2로 나누었을 때 나머지가 0인 경우 true가 되므로 true, false, true 가 생성된다.
val createdArray = BooleanArray(size = 3, init = { index -> index % 2 == 0 })
// [true, false, true]
BooleanArray 내부의 값에 접근하기
BooleanArray 내부의 값에 접근하기 위해서는 get(index: Int) 함수를 사용한다.
public class BooleanArray(size: Int) {
...
/**
* Returns the array element at the given [index]. This method can be called using the index operator.
*/
public operator fun get(index: Int): Boolean
...
}
get은 operator fun 이므로 [index]로도 접근 가능하다.
fun main() {
val createdArray = booleanArrayOf(true, false, true)
println("index 0 value >> ${createdArray.get(0)}")
println("index 0 value >> ${createdArray[0]}")
}
//index 0 value >> true
//index 0 value >> true
만약 index에 값이 없으면 ArrayIndexOutOfBoundsException 이 발생한다.
fun main() {
val createdArray = booleanArrayOf(true, false, true)
println("index 0 value >> ${createdArray.get(10)}")
}
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 3
// at MainKt.main(Main.kt:4)
// at MainKt.main(Main.kt)
BooleanArray 내부의 값 바꾸기
BooleanArray내부의 값을 바꾸기 위해서는 set함수를 사용한다. index 위치의 값을 value로 변경한다.
public class BooleanArray(size: Int) {
...
/**
* Sets the element at the given [index] to the given [value]. This method can be called using the index operator.
*/
public operator fun set(index: Int, value: Boolean): Unit
...
}
}
Index 0 위치의 원소를 false로 Index 1 위치의 원소를 true로 바꿔보자. set 또한 operator fun 이므로 [Index] 로 접근 가능하다.
fun main() {
val createdArray = booleanArrayOf(true, false, true)
createdArray.set(0, false)
createdArray[1] = true
println("index 0 value >> ${createdArray[0]}")
println("index 1 value >> ${createdArray[1]}")
}
//index 0 value >> false
//index 1 value >> true
BooleanArray 에서 for 문 돌리기
BooleanArray에서 for문은 세가지 방식으로 돌릴 수 있다. for 문을 사용하는 방법, forEach를 사용하는 방법, forEachIndexed를 사용하는 방법이다.
for 문을 사용하는 방법
fun main() {
val createdArray = booleanArrayOf(true, false, true)
for (bool in createdArray) {
println("value is $bool")
}
}
//value is true
//value is false
//value is true
forEach를 사용하는 방법
fun main() {
val createdArray = booleanArrayOf(true, false, true)
createdArray.forEach { value ->
println("value is $value")
}
}
//value is true
//value is false
//value is true
forEachIndexed를 사용하는 방법
forEachIndexed를 사용하면 index도 같이 인자로 받을 수 있다.
fun main() {
val createdArray = booleanArrayOf(true, false, true)
createdArray.forEachIndexed { index, value ->
println("index $index value is $value")
}
}
//index 0 value is true
//index 1 value is false
//index 2 value is true
정리하며
이번 글에서는 Boolean Primitive Type 값으로 이루어진 Array를 만드는 방법에 대해 살펴봤다. 원시 타입은 자주 쓰이게 되니 차이점을 잘 알고, 상황에 맞추어 효율적으로 사용하도록 하자.