EnjoyLife

var 와 MutableList 사용이 헷갈릴 경우 본문

안드로이드 개발/개발팁

var 와 MutableList 사용이 헷갈릴 경우

Aiden96 2024. 9. 28. 16:59
둘다 val 타입이지만 각각 mutableList,list 타입인 변수

val displayList1: MutableList<String> = mutableListOf("Apple", "Banana", "Cherry", "Date")
val displayList2: List<String> = listOf("Apple", "Banana", "Cherry", "Date")

 

"MutableList 형을 쓰면 무조건 쓰기가 가능하다는 것이니, 무조건 var 를 써야이 무슨 소리야?" 생각할 수있다.

나도 그랬으니까.

 

"헷갈리니 그냥 var 로 무조건 쓸래" 할수 있다. 이건 유지보수할 경우, 아주 치명적인 후회로 남을수 있다.

최악의 경우, var 로 선언것에 상처를 받고 당신 동료가 당신의 결혼식에 안갈수 있다. 

 

val displayList1: MutableList<String> 

ㄴ 리스트의 항목 추가,수정은 가능하지만, 새로운 리스트로 재할당이 불가능하다는 뜻이다.

 

 즉, displayList1 의 내부가 이렇게고 치자 

 

   ㄴ메모리 주소: 0x100

   ㄴ값 : "Apple", "Banana", "Cherry", "Date" 

 

1.  "Apple", "Banana", "Cherry", "Date"  의 항목을 추가, 수정하는 것은 가능하다. 

    왜? MutableList 타입이니까.

 

 2. 새로운 리스트로 재할당 할수 없다. ( 메모리 주소를 (0x100) 에서 (0x300) 으로 변경)

mutableListOf("Fig", "Grapes", "Honeydew") 이렇게 말이다.  왜? val 이니까.

 

이해가 안가면 더 쉽게

당신집에  친구들이 왔다가고, 회사동료들이 왔다가도 괜찮다. 그러나 당신집을 재건축하는건  불가능하다.

 

[심화과정]

각각 var,val 이지만 둘다 list(읽기) 타입인 변수 

var displayList2: List<String> = listOf("Apple", "Banana", "Cherry", "Date")
val displayList3: List = listOf("Apple", "Banana", "Cherry", "Date")

 

1. 항목을 추가,수정 은 둘다 불가능하다 왜? List 타입이니까.

 

2. 새로운 리스트로 재할당(메모리 주소를 변경)이 가능한것 어느 것일까? displayList2 이다.  왜? var 이니까

  추가로, displayList3 은 메모리 변경이 불가능 하다.   왜? val 이니까. 

 즉 새로운 리스트로 재할당이 불가능하다는 것이다. 

displayList2 = listOf("Fig", "Grapes") // 컴파일 정상 
displayList3 = listOf("Fig", "Grapes") // 컴파일 오류 (변경 불가)

 

동료가 결혼식에 안갈정도로  왜 그렇게 심각한 문제인가?

 

varmutable  타입을 함께 사용할 경우 위험하다. 

 새로운 리스트로 재할당될 가능성이 있는 변수에만 선언해야 되는데,

이것을 남발해 버리면 다른 누군가가 아니 당신이 될수있고, 절대 새로운 리스트로 재할당하면 안되는 변수에 재할당을 

해버리면 앱이 됐든,웹이 됐든 원하지 않는 데이터가 나올수있고, 해당 프로그램에 치명적인 오류가 발생한다.

마치  자바에서 전역변수 선언해 놓고, 여저 저기 데이터 재할당해서 난리나는 경우와 비슷하다.

 

당신이 퇴근했는데, 다른 사람이 그자리에 빌라로 지은것이다. 또 그 사람이 퇴근하고 집에 오니 다른사람이

그 자리에 카페를 지었다. 집 명의는 벌써 2번 변경됐다. var 로 당신이 집문서를  인터넷에 올린 탓이다. 

이건 컴파일해도 정상적으로 빌드되기에 원인을 찾을 수 없다. 코드 전체를 분석하지 전까지....