본문 바로가기

이상/Andrioid

[Android/Kotlin] List copy, update item

반응형

안드로이드 앱을 만들 일이 있어서 코틀린으로 안드로이드 앱을 만들고 있는데

 

iOS와는 너무 다르면서도 비슷한 면이 있어서 나름 재밌게 공부하고 있다.

 

 

 

일단은 화면 만드는 데에 익숙해지기 위해

 

Fragment에 RecyclerView를 넣어 테이블뷰를 만들고,

 

item을 클릭해서 내용을 바꾸고 적용하는 앱을 만들고 있다.

 

그런데 한가지 신기한 점을 발견해서 기록해둔다.

 

 

 

1
2
3
4
5
6
7
var foodList = listOf(
    FoodModel("김밥", 2500),
    FoodModel("라면", 3000),
    FoodModel("떡볶이", 4000),
    FoodModel("라볶이", 5000),
    FoodModel("돈까스", 7000),
)
cs

 

이렇게 List 변수를 만들고 내부에 FoodModel을 변경하려고 하니까

 

타입 에러

이런 에러가 뜬다.

 

Cast expression 'foodList' to 'MutableList<FoodModel>' 버튼을 눌러 수정하고 실행하면 앱이 죽는다.

 

그래서 MutableList 타입의 tempList라는 변수를 생성하여 foodList의 내용을 복사한 후에

 

tempList의 특정 index의 FoodModel을 바꿔치기 했다.

 

1
2
3
4
5
6
7
8
9
val tempList = foodList as MutableList<FoodModel>
 
Log.e("furang", "========== UPDATE tempList: "+tempList[position].name+" "+tempList[position].price)
Log.e("furang", "========== UPDATE foodList: "+foodList[position].name+" "+foodList[position].price)
 
tempList[position] = FoodModel(nameEdit.text.toString(), priceEdit.text.toString().toInt())
 
Log.e("furang", "========== UPDATE tempList: "+tempList[position].name+" "+tempList[position].price)
Log.e("furang", "========== UPDATE foodList: "+foodList[position].name+" "+foodList[position].price)
cs

 

 

 

신기한 점은 tempList 변수를 통해 item을 수정했는데 foodList에도 적용이 됐다.

 

왜 이렇게 되는건지 여기저기 찾아보다 stackoverflow에 물어봤는데

 

Commander Tvis형이 엄청 빨리 답변을 달아줬다.

 

FoodModel is reference type, so your foodList is a list of references. When you copy it, you get a new list with old references to models, so when you modify value of reference in new list it is reflected to the previous list.

 

foodList를 만들 때 생성했던 FoodModel이 reference 타입이기 때문에 foodList는 reference 타입의 list이고

tempList는 foodList를 copy했기 때문에 tempList도 reference 타입의 list이므로

tempList에서 item을 수정하면 foodList에서도 같은 FoodModel을 참조하고 있기 때문이라고 한다.

 

참조 리스트 타입 copy

알고나니 간단하지만 핵심적인 내용이었다.

 

좀 더 깊은 공부가 필요할 것 같다.

 

끝.

반응형