마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Kotiln - MutableList 의 mutableListOf 초기화 방식

0 추천
방법 1)
 val loArr = mutableListOf(
     ModelLocation(),
     ModelLocation(),
     ModelLocation(),
     ModelLocation(),
     ModelLocation()
 )  
loarr.set(id, weatherArr[0])

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

방법 1 은 mutableLisfOf 에서 객체로 만들어서 하면 값이 잘 들어 가는데

하지만 개수를 지정하지 않고 하려고 방법 2 로 초기화 해서 하니 값이 들어가지 않습니다 ㅠㅠ

 위 방법으로  객체개수를 지정하지 않고 초기화 하는 방법 없나요 ?

방법 2)
var loArr: MutableList< ModelLocation> = mutableListOf()
loarr.set(id, weatherArr[0])
kyand (290 포인트) 님이 2022년 11월 16일 질문
kyand님이 2022년 11월 16일 태그 변경

1개의 답변

+1 추천
 
채택된 답변
MutableList.set은 아이템을 추가하는게 아니라 업데이트하는 함수입니다. 첫번째 인자는 아이템의 위치입니다.
즉 loArr(0, weatherArr[0]) 을 하게 되면  loArr의 첫번째 아이템을 weatherArr[0]로 바꾸게 됩니다.

아이템을 추가하고 싶다면 MutableList.add()를 사용하시면 됩니다.

loArr.add(weatherArr[0])

그리고 set을 사용할 때는 Exception이 떨어지지 않게 범위검사를 하는게 안전하겠죠.
spark (224,800 포인트) 님이 2022년 11월 16일 답변
kyand님이 2022년 11월 17일 채택됨
답변 감사합니다 위 방법 1은 객체를 만들어서 하는 방법이라 set을 이용해서 넣어줘야 해서 그런 거에 용 근데 저는 방법 2를 사용해서 아이템 값을 넣고 싶은 건데 add를 이용하더라도 잘 안되더라고요 ㅠㅠ

혹시 괜찮으시면
LocationActivity

https://github.com/younghyeok-k/WeatherApp/blob/master/app/src/main/java/com/example/test2/LocationActivity.kt
조금 봐주실수 있나요
Adapter

https://github.com/younghyeok-k/WeatherApp/blob/master/app/src/main/java/com/example/test2/Adapter/LocationAdpater.kt

입니당
LocationActivity에 setWeather함수에 loArr을 인자로 전달한 후에 그 안에 비동기로 네트워클 호출을 하고 계시는데, 이렇게 하시면  비동기이므로

for (i in 0..4) {
            setWeather(i, loArray[i].addcity, loArray[i].wx, loArray[i].wy, loArr)
            Log.d("setWether", loArray[i].id.toString())
        }
//
        Log.d("wetherARR", loArr[0].address)
        Log.d("wetherARR", loArr[1].address)
        Log.d("wetherARR", loArr[2].address)

Log.d에서 출력하는 데이터는 이전의 loArr데이터 입니다. Log문을 setWeather안으로 옮기시면 제대로 값이 보일겁니다. 비동기 코드는 콜백이 완료되고 난뒤에 처리를 해주셔야 해요.
그리고 가능하면  mutable 계열의 배열이나 리스트를 넘겨서 처리하지 마시고 읽기만 가능한 배열이나 List 를 넘겨서 처리하시고 함수에서 처리된 배열/리스트를 받아서 사용하시는게 예상치않은 데이터 변경을 관리하는데 더 유리합니다. 개발자들은 함수에 인자로 넘길 때는 Immutable 또는 readonly 타입을 주로 사용합니다.

//  참고. setWeather인데 List를 리턴하게 되면, 함수 이름이 이상해 집니다.
// 이 경우는 함수가 하는 일이 함수 안의 코드와 맞지 않는다는 반증이므로, 함수 이름 등을 적절하게 수정을 하시면 좋을 것 같아요.
private fun setWeather(
        ...
        loarr: List<ModelLocation>
): List<ModelLocation>  {

}


그리고 coroutine 을 사용하고 계시므로 Retrofit API 인터페이스가 suspend function을  사용하도록 하시면
훨씬처리가 편합니다.

interface WeatherInterface {
    @GET("...")
    suspend fun getWeather(
        ...
    ): WEATHER // 클래스 이름을 규칙에 맞게 Weather로 주세요.
}

코투린을 사용하면 아래처럼 호출이 가능합니다.
lifecycleScope.launch(Dispatcher.IO) {
    val wheather = ApiObject.retrofitService.getWeather(60, 1, "JSON", base_date, base_time, nx, ny)
}

이렇게 사용하시러면 JSON어댑터를 세팅해야 하는데, 자세한 건 Retrofit 사이트를 참조하세요.

추가로 전반적으로 코틀린 사용을 좀 더 신경쓰셔야 할 것 같아 보입니다. 코틀린 문서를 참조하시면서 작업하시면 좋을 것 같아요.
친절한 답변 감사합니다 ! 아직 배우고 있는 학생이라 코틀린이 미숙해요 ..죄송합니다
...