안녕하세요 골드입니다.
오늘은 코틀린의 컬렉션 중에서 List에 대해 글을 쓰도록 하겠습니다.
1. List의 기본 형태
먼저 List의 가장 기본적인 모습입니다. List는 순서가 있는 데이터의 집합입니다. listOf(1, 2, 3)이라고 선언했다면 1이 첫번째, 2가 두번째, 3이 세번째 요소가 됩니다.
List는 listOf()함수를 사용하여 만들 수 있습니다. list2와 list3처럼 변수의 형태를 List라고 컴파일러에게 알려주고 <> 사이에 리스트 요소의 타입을 알려줄 수 있습니다. 정해진 타입 이외에 값은 추가할 수 없으며, 추가했을 경우 에러가 나타나는 것을 볼 수 있습니다. Kotlin은 타입 추론이 있기 때문에 변수 선언과 동시에 초기화를 했을 경우, list1처럼 변수 타입에 대한 선언을 하지 않아도 에러가 발생하지 않습니다.
println()함수에 list1, 2, 3을 넣어봤습니다. List와 같은 컬렉션 데이터를 println() 함수에 넣으면 [] 대괄호 사이에 ,로 구분되어 데이터들이 보기 좋게 나타납니다.
2. List 요소 사용방법
전체 List 데이터를 println() 함수로 확인해봤습니다. 이번에는 List의 각 요소값들을 불러오도록 하겠습니다.
List의 요소에 접근하는 방법은 get() 함수와 [] 사이에 인덱스를 넣는 방법이 있습니다. 똑같은 방법입니다만 주로 [] 사이에 인덱스를 넣는 방법을 사용합니다. (get 밑에 녹색 줄도 []를 추천하고 있습니다.) List의 첫 번째 요소의 인덱스는 0부터 시작합니다. 그렇기 때문에 .get(0)을 했을 때, 1이 나오게 됩니다.
세 번째 println() 함수를 보면 list1.size가 있습니다. 말 그대로 list1의 총 요소의 수입니다. list1에는 1,2,3 세 개가 들어있기 때문에 3이 출력될 것입니다.
List의 데이터를 그대로 사용하는 경우도 있지만, 데이터를 수정해야 하는 경우도 분명 존재합니다. List의 데이터를 수정하기 위해 특정 요소 값을 변경해보겠습니다.
list1의 첫번째 데이터에 접근하기 위해 [] 사이에 특정 요소의 위치값(인덱스)를 넣어줍니다. (list의 첫 번째 요소는 0입니다. 1이 아님에 주의하세요.) list1의 0번 인덱스 값을 변경하기 위해 시도했지만 빨갛게 에러가 나타나는 모습입니다. Kotlin에서 List는 읽기 전용입니다. 그렇기 때문에 값을 변경하려고 한다면 에러가 나타납니다. Kotlin에서 값을 변경하기 위한 List는 mutableList()를 사용합니다. mutableList를 사용하기 위해 listOf() 함수를 mutableListOf() 함수로 변경한 후 데이터를 수정해보겠습니다.
list1의 0번째 데이터가 성공적으로 변경된 모습입니다. (혹은 접근할 때 get()함수를 사용한 것처럼 set()함수를 사용할 수도 있습니다. list1.set(0, 3)과 같은 형식입니다.)
(이런 함수도 있습니다.)
이번에는 mutableList를 먼저 선언한 후 값을 나중에 추가하겠습니다. 선언만 하고 값을 초기화하지 않는다면 mutableList의 변수 형식에 대해서 알려줘야 합니다. <Int>라고 작성합니다.
List의 값을 추가할 땐 add() 함수를 사용합니다. add() 함수에 값만 넣을 경우 값이 List에 순차적으로 들어가게 되고,
index 값까지 같이 넣어줄 경우 해당 인덱스의 값이 들어가며 기존에 있던 값이 뒤로 밀리게 됩니다.
List는 반복문과 잘 어울립니다. 알고리즘 문제를 풀거나 다양한 곳에서 List를 사용할 때, 반복문도 함께 사용할 가능성이 매우 높습니다.
특정 인덱스에 있는 값을 지울 땐 removeAt() 함수를 사용합니다. 특정 요소를 지우고 싶다면 remove()로 지울 수 있습니다. remove()는 return 값이 Boolean이기 때문에 지워졌다면 true를 반환하고 해당 값이 없거나 지워지지 않았다면 false를 반환합니다.
3. List와 같이 사용할 수 있는 함수들
다양한 함수들이 있지만 몇 가지만 살펴보겠습니다. 밑에 이미지에서 볼 수 있듯이 만약 List의 범위 밖에 있는 값을 가져오려고 한다면 에러가 발생합니다. list2는 총 다섯개의 값을 가지고 있기 때문에 마지막 index는 4가 됩니다. 그런데 index 5의 값을 가져오려고 했기 때문에 에러가 발생했습니다. (지금은 누가 이런 실수를 한다고 생각할 수 있지만, 코딩을 하다 보면 종종 이런 경우가 발생합니다.) getOrElse()함수는 이런 경우에 유용하게 쓸 수 있습니다. index에 해당하는 값을 가져오거나 만약 해당 index에 값이 존재하지 않을 경우 미리 선언한 defaultValue를 가져옵니다. (defaultValue는 람다 형식입니다.) 프로그래머의 실수를 줄여주는 안전 장치라고 할 수 있겠습니다.
비슷한 안전장치로 getOrNull() 함수가 있습니다. 이번에는 defaultValue가 아닌 말 그대로 null을 반환합니다. get()과 차이점은 에러가 나지 않는다는 점입니다. 더 안전한 코딩을 할 수 있습니다.
코틀린은 sort()함수가 있습니다. sort()함수로 list를 내림차순 혹은 오름차순으로 정렬할 수 있습니다. 이는 매우 유용한 함수가 아닐 수 없습니다. 저는 알고리즘 문제 풀 때 유용하게 사용하고 있습니다. 내부적으로는 java.util.Collections.sort()를 사용합니다. (sortWith()라는 함수도 있습니다. Comparator를 직접 정의해서 원하는 대로 정렬할 수 있습니다.) sort()함수는 숫자뿐만 아니라 문자도 정렬이 가능합니다. 문자를 정렬할 땐 사전 순으로 정렬됩니다.
List 안에 특정 요소가 존재하는지 궁금하다면 contains() 함수를 사용할 수 있습니다. contains()는 List에서 특정 값이 존재하는지 확인합니다. 반환값은 Boolean이기 때문에 존재한다면 true, 없다면 false를 반환합니다. if문과 함께 사용해서 값을 확인할 수 있습니다.
마지막으로 shuffle()과 reverse() 함수가 있습니다. shuffle() 함수는 List의 값을 임의로 섞습니다. reverse() 함수는 List를 거꾸로 뒤집습니다.
코틀린의 List에 대해서 알아봤습니다. List는 굉장히 많이 사용하는만큼 알아두시면 좋습니다.
여기까지 골드였습니다.
감사합니다.
참고자료 : https://kotlinlang.org/docs/reference/list-operations.html
'Programming Language > Kotlin' 카테고리의 다른 글
[Kotlin] Java의 void, Kotlin의 Unit, Nothing 차이점 (0) | 2020.12.16 |
---|---|
[Kotlin] var, val 그리고 const val (0) | 2020.12.16 |
[Kotlin] Collections Map 사용법 (0) | 2020.08.31 |
[Kotlin] Collections Set 사용법 (List 중복제거) (0) | 2020.08.29 |
[Kotlin] 코틀린 데이터 타입 형변환 (0) | 2020.07.11 |