배열을 초기화하는 방법을 간단하게 체크 하려고합니다.
특히 생성자를 활용한 배열 생성에 초점을 두려고 합니다.
1. 배열(Array) 생성
(1) emptyArray
비어있는 배열 객체를 생성합니다. size 는 0 을 가집니다.
val emptyArray = emptyArray<Int>()
(2) arrayOf
지정한 값을 가지는 배열 객체를 생성합니다.
val arrayOf = arrayOf(0, 1)
(3) arrayOfNulls
지정한 크기만큼 배열 객체를 생성합니다. 배열값은 null 로 초기화합니다.
val arrayOfNulls: Array<Int?> = arrayOfNulls(10)
(4) Array 생성자
지정한 크기만큼 배열 객체를 생성합니다. 배열값은 init function 의 반환값으로 초기화합니다.
val array: Array<Int> = Array(10) { i ->
Log.d("init function", "i : $i")
i
}
2. arrayOfNulls vs Array 생성자
arrayOfNulls 로 배열을 생성한 경우 데이터 타입은 Array<Int?> 입니다.
Array 로 배열을 생성한 경우 데이터 타입은 Array<Int> 입니다.
data class Number(var value: Int, var valueString: String)
Number 라는 데이터 클래스를 가지는 배열을 생성한다고 가정했을때,
(상황에 따라 다르겠지만) 해당 데이터를 활용할 때 arrayOfNulls 의 경우
아래와 같이 계속해서 null check 를 해줘야하는 번거로움이 있습니다.
for (i in arrayOfNulls.indices) {
// arrayOfNulls: Array<Number?> : null 값으로 초기화되었기때문에 null 체크를 해줘야합니다.
value = arrayOfNulls[i]?.value!!
valueString = arrayOfNulls[i]?.valueString!!
}
for (i in array.indices) {
// array: Array<Number> : 초기화때 배열크기만큼 초기화되었기때문에 null 체크가 필요없습니다.
value = array[i].value
valueString = array[i].valueString
}
저 같은 경우 배열 사용할 때 arrayOfNulls 를 주로 사용해왔습니다.
사실 문제될건 없지만.. 값을 불러올 때마다 null check 가 너무 불편했던거 같아요
꼭 null 로 초기화해서 사용할 필요가 없다면
Array 생성자를 활용해야겠다는 생각이 들어서 정리하였습니다.
끝으로 아래 전체소스 참조로 넣고 마무리하겠습니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 지정한 size 만큼 배열 객체 생성 (배열값은 null 로 초기화)
val arrayOfNulls: Array<Number?> = arrayOfNulls(10)
for (i in arrayOfNulls.indices) {
arrayOfNulls[i] = Number(i, i.toString())
}
// 지정한 size 만큼 배열 객체 생성 (배열값은 init function 반환값으로 초기화)
val array: Array<Number> = Array(10) { i ->
Log.d("init function", "i : $i")
Number(i, i.toString())
}
var value = 0
var valueString = ""
for (i in arrayOfNulls.indices) {
// arrayOfNulls: Array<Number?> : null 값으로 초기화되었기때문에 null 체크를 해줘야합니다.
value = arrayOfNulls[i]?.value!!
valueString = arrayOfNulls[i]?.valueString!!
}
for (i in array.indices) {
// array: Array<Number> : 초기화때 배열크기만큼 초기화되었기때문에 null 체크가 필요없습니다.
value = array[i].value
valueString = array[i].valueString
}
}
data class Number(var value: Int, var valueString: String)
}
0 comments: