Kotlin 뿐만 아니라 대부분의 언어에는 하나의 변수에 여러개의 값을 저장해야 할 필요성이 존재한다. 이를 위해, 배열 (Array)와 컬렉션 (Collection)이라는 자료구조를 제공한다.
1. 배열 (Array)
- 여러개의 데이터를 담을 수 있는 대표적인 자료형
- 먼저 공간의 갯수를 정해 놓고 사용해야 하며 중간에 갯수를 추가하거나 제거할 수 없음
- 대표적인 기본 자료형 (Int, Double, Float, Char, ...)를 지원
var intArray = IntArray(10)
var longArray = LongArray(10)
var floatArray = FloatArray(10)
var doubleArray = DoubleArray(10)
var charArray = CharArray(10)
var stringArray = Array(10) {""} // String은 기본 type이 아니기 때문에 따로 선언 해야함
- Array는 getter와 setter를 모두 지원함
var stringArray = arrayOf("AA", "BB", "CC", "DD")
// getter
println(stringArray[2])) // CC
println(stringArray.get(3)) // DD
// setter
stringArray.set(1, "EE")
stringArray[4] = "GG"
2. 컬렉션 (Collection)
Kotlin에서는 Java와 유사하게 List, Set, Map이라는 Collection이 존재한다. 하지만, Java와는 다르게 Kotlin은 Mutable과 Immutable을 별개로 지원한다.
Mutable vs. Immutable
사전적 정의대로 Mutable (가변의), Immutable (불변의) 이다. Mutable Collection은 데이터가 가변적이다. 즉, Collection 아이템의 수정이 가능하다. Immutable Collection에서의 데이터는 불변적이다. 이 Collection은 정적이며, 수정이 불가능한 Collection이다.
List
List는 저장되는 데이터에 인덱스를 부여한 Collection이며 중복 값을 입력할 수 있다. 또한, 데이터가 저장하거나 삭제될 때 순서가 지켜지는 Collection이다.
Immutable List
기본적으로 Immutable List는 불변적이기 때문에 getter만 지원한다. 아래와 같이 사용할 수 있다.
var imList = listOf<String>("A", "B", "C", "D")
// var imList = listOf("A", "B", "C", "D") // Kotlin에서는 타입 추론이 가능하기 때문에 <>를 제외해도 된다.
println(imList.get(1))
println(imList[2])
getter 외에도 다양한 property와 method를 제공한다.
var list = listOf(1, 2, 4, 5)
println(list.size) // 4
println(list.lastIndex) // 3
println(list.indexOf(2)) // 1
println(list.lastIndexOf(4)) // 2
Mutable List
Mutable List는 가변적이기 때문에 List 아이템의 삽입, 삭제, 수정이 가능하다. 따라서 getter, setter 둘 다 지원한다. 아래와 같이 사용할 수 있다.
var muList = mutableListOf("A", "B", "C")
println(muList) // [A, B, C]
// getter (추출)
println(muList.get(1)) // B
println(muList[0]) // A
// setter (수정)
muList.set(1, "D") // [A, D, C]
muList[0] = "E" // [E, D, C]
// 삽입
muList.add(2, "F") // [E, D, F, C]
muList.add("G") // [E, D, F, C, G]
// 삭제
muList.remove("F") // [E, D, C, G]
muList.removeAt(2) // [E, D, G]
addAll이라는 Collection Method를 이용하여 두 List를 병합할 수 있다. (단, list의 타입이 다르면 병합할 수 없다.)
또한, Immutable List와 동일한 Property, Method를 제공한다.
var list = mutableListOf("A", "B")
list.addAll(mutableListOf("C", "D")
println(list) // [A, B, C, D]
Set
Set은 중복을 허용하지 않는 List로 볼 수 있다. List와 유사하지만 Index로 조회할 수 없으며, getter 또한 지원하지 않는다.
또한, Set은 null object를 가질 수 있다. 당연히 중복을 허용하지 않기 때문에 null object도 1개만 가질 수 있다.
Immutable Set
아래와 같이 객체를 확인할 수 있으며 forEach와 Iterator로 객체를 순회하면서 탐색할 수 있다.
var imSet = setOf<Int>(1, 3, 5, 7)
println(imSet) // [1, 3, 5, 7]
println(imSet.size) // 4
println(imSet.isEmpty()) // false
println(imSet.contains(2)) // false
Mutable Set
아래와 같이 객체를 생성할 수 있으며 Mutable이기 때문에 삽입, 수정, 삭제가 가능하다.
또한, List와 유사한 Collection Method를 지원한다.
var muSet = mutableSetOf<String>()
println(muSet) // []
muSet.add("A")
muSet.add("B")
muSet.add("C")
muSet.add("D")
muSet.add("C")
println(muSet) // [A, B, C, D]
println(muSet.size) // 4
println(muSet.remove("B")) // [A, C, D]
Map
Map은 Key, Value 쌍으로 입력되는 Collection이다. 다른 Collection들이 Index로 조회하는 것과 달리 Map은 Index가 아닌 Key로 데이터를 조회한다. 단, 동일한 이름의 Key는 저장할 수 없다.
여기서 Key, Value 한 쌍을 Pair라고 한다. 예를 들어, Pair(A, B)는 A to B로 간단히 표현할 수 있다.
Immutable Map
아래와 같이 객체를 생성할 수 있다.
var imMap = mapOf<String, String>("ko" to "안녕하세요", "en" to "Hello", "fr" to "Bonjour")
var imMap2 = mapOf(Pair("ko", "안녕하세요"), Pair("en", "Hello"), Pair("fr", "Bonjour"))
println(imMap) // {ko=안녕하세요, en=Hello, fr=Bonjour}
println(imMap2) // {ko=안녕하세요, en=Hello, fr=Bonjour}
위에 설명한 바와 같이, Map에서는 Index 대신 Key로 데이터를 조회한다. 다른 Collection들과 동일한 getter를 지원하지만 Index가 아닌 Key로 조회하는 것만 다르다.
Map에서 keys와 values는 각각 Key와 Value로 이루어진 Set을 return 한다.
var imMap = mapOf("ko" to "안녕하세요", "en" to "Hello", "fr" to "Bonjour")
println(imMap.get("ko")) // 안녕하세요
println(imMap["fr"]) // Bonjour
println(imMap.keys) // [ko, en, fr]
println(imMap.values) // [안녕하세요, Hello, Bonjour]
for (value in imMap.values) {
print("$value ") // 안녕하세요 Hello Bonjour
}
Mutable Map
아래와 같이 객체를 생성할 수 있다. 다른 Mutable Collection처럼 삽입, 삭제, 수정이 가능하다.
단, 삽입 시 Pair를 사용하지 않고 Parameter로 Key와 Value를 넣는다.
수정 시에는 동일한 Key를 사용하여 수정한다. (중복된 Key를 가질 수 없으므로 Value가 변경된다.)
var muMap = mutableMapOf(Pair("ko", "안녕하세요"), Pair("en", "Hello"), Pair("fr", "Bonjour"))
// 삽입
muMap.put("cn", "Ni hao")
muMap["jp"] = "Gonichiwa" // {ko=안녕하세요, en=Hello, fr=Bonjour, cn=Ni hao, jp=Gonichiwa}
// 수정
muMap.put("cn", "Ta ja hao") // {ko=안녕하세요, en=Hello, fr=Bonjour, cn=Ta ja hao, jp=Gonichiwa}
// 삭제
muMap.remove("fr") // {ko=안녕하세요, en=Hello, cn=Ta ja hao, jp=Gonichiwa}
muMap.clear() // {}
Reference
https://kotlinlang.org/docs/collections-overview.html#set
https://codechacha.com/ko/collections-in-kotlin/
https://ddolcat.tistory.com/608
'Kotlin' 카테고리의 다른 글
(Kotlin) sealed class (0) | 2022.07.27 |
---|---|
(Kotlin) open class, abstract class (0) | 2022.07.27 |
(Kotlin) Class 정의 (0) | 2021.10.04 |
객체 지향 프로그래밍 (OOP) (0) | 2021.10.04 |
(Kotlin) Scope 함수 (0) | 2021.09.09 |