Idealim
article thumbnail
Published 2021. 9. 17. 11:25
[Kotlin] List 활용 Coding Language/Kotlin

/* 본 게시물은 ' Do it! 코틀린 프로그래밍 | with 황영덕 ' 의 내용과 참고자료를 토대로 작성되었습니다. */

/* 본 글은 개인적으로 공부한 내용을 정리한 글이므로 오류가 있을 수 있습니다. */

참고 자료

[URL] :


#List 활용

List는 순서에 따라 정렬된 요소를 가지는 컬렉션으로, 가장 많이 사용하는 컬렉션 중 하나이다. ([자료 구조] List 에 대한 개념이 궁금하면 본 게시물을 한 번 읽어보기를 추전한다.)

코틀린의 List에는 값을 변경할 수 없는 불변형 List , 값을 변경할 수 있는 가변형 MutableList 가 있다.


불변형 List

먼저, 불변형 List를 생성하는 방법에 대해 알아보자.

val nonChangeList = listOf(1,2,3,4,5)

기본적으로 listOf() 헬퍼 함수를 이용하면 List 를 생성할 수 있다. 여기서 잠깐, listOf() 의 선언부를 확인해보자.

public fun <T> listOf(vararg elements: T): List<T>

vararg(가변인자 키워드) 를 통해 원하는 만큼 요소를 넣을 수 있다. List<T> 의 객체를 반환하는 것을 확인할 수 있다.

 

List의 주요 멤버 메서드

List는 앞에서 살펴본 Collection 인터페이스의 메서드를 오버라이딩해 구현한다. 

멤버 메서드 설명
get(index: Int) 특정 인덱스를 인자로 받아 해당 요소를 반환
indexOf(element: E) 인자로 받은 요소가 첫 번쨰로 나타나는 인덱스를 반환,
없으면 -1 반환
lastIndexOf(element: E) 인자로 받은 요소가 마지막으로 나타나는 인덱스를 반환하고, 없으면 -1 반환
listIterator() 목록에 있는 iterator를 반환
subList(fromIndex: Int, toIndex: Int) 특정 인덱스의 from 과 to 범위에 있는 요소 목록을 반환


가변형 MutableList

가변형 List인 MutableList를 생성하는 방법에 대해 알아보자.

val arrayList = arrayListOf()
val mutableList = mutableListOf()

코틀린의 가변형 List에는 ArrayList, MutableList 가 있다. 각각 arrayListOf() , mutableListOf() 헬퍼 함수를 통해 List를 생성할 수 있다. 

val numList: MutableList<Int> = mutableListOf(1,2,3,4)
numList.add(5) // 추가
numList.add(1, 4) // index 1 에 4 추가

numList.remove(4) // 삭제
numList.removeAt(1) // index 1 인 요소 삭제

기본적으로 add() , remove() 함수를 통해 데이터를 추가하거나 삭제할 수 있다.


그렇다면 ArrayList 와 MutableList 의 차이는 무엇일까?

[stack overflow] Difference between ArrayList<String> and MutableList<String> : https://stackoverflow.com/questions/43114367/difference-between-arrayliststring-and-mutablelistofstring-in-kotlin

위 글에 따르면, 두 List는 서로 같다이다. 컴파일 시 mutableList 는 arrayList로 바뀌기 때문에 둘은 같다. 단지, 두 개로 나누어서 선언하는 이유는 너의 의도에 따라 표현할 수 있기 때문이다.


cf > 배열(Array<T>)과 불변형 List(List<T>) 의 차이

배열과 List의 큰 차이점은 정적 /동적 메모리 이다. 여기서 드는 의문점은 '불변형 List는 데이터를 추가하거나, 삭제, 수정 등이 불가능한데 차라리 배열을 쓰는게 좋지 않나?' 문득 들었다. 

이에 대한 내가 내린 답은 데이터를 추가하거나, 삭제. 수정 하는 일이 아예 없다면 Array를 쓰는게 더 효율적이지만, 불변형 List로 선언하면 ArrayList 나 LinkedList 로 바꿀 수 있기 때문에 데이터 추가 / 삭제 / 수정의 필요성이 애매할 때 사용하는 것이 좋다.

 

추가적으로 차이점을 알아보자.

[stack overflow] Difference between List and Array types in Kotlin :

https://stackoverflow.com/questions/36262305/difference-between-list-and-array-types-in-kotlin

요소 수정

val a = arrayOf(1, 2, 3)
a[0] = a[1] // OK

val l = listOf(1, 2, 3)
l[0] = l[1] // doesn't compile

val m = mutableListOf(1, 2, 3)
m[0] = m[1] // OK

Array : 무변성 / List : 공변성

val a: Array<Number> = Array<Int>(0) { 0 } // won't compile
val l: List<Number> = listOf(1, 2, 3) // OK

참조

val l1 = listOf("a")
val l2 = listOf("a")
var x = (l1 == l2) // => true

val a1 = arrayOf("a")
val a2 = arrayOf("a")
var y = (a1 == a2) // => false

반응형
profile

Idealim

@Idealim

읽어주셔서 감사합니다. 잘못된 내용이 있으면 언제든 댓글로 피드백 부탁드립니다.