반응형
배열과 컬렉션
배열
Kotlin
// 배열 만들기
val array = arrayOf(100, 200)
// 값 넣기
array.plus(300)
// 인덱스로 반복
for (i in array.indices) {
println("${i} ${array[i]}")
}
// 인덱스와 값 모두 가져오기
for ((idx, value) in array.withIndex()) {
println("$idx, $value")
}
- 배열은 잘 사용하지 않는다.
- 배열보다는 리스트를 사용하자.
array.indices
는 0부터 마지막 index까지의Range
이다.array.withIndex()
를 사용하면, 인덱스와 값을 한번에 가져올 수 있다.array.plus()
를 사용하면 값을 추가할 수 있다.
Collection
- 컬렉션을 만들어 줄 때 불변인지, 가변인지를 지정해야 한다.
가변(Mutable) 컬렉션
: 컬렉션에 element를 추가, 삭제할 수 있다.불변 컬렉션
: 컬렉션에 element를 추가, 삭제할 수 있다.- 가변 컬렉션에
Collections.unmodifiableXXX()
를 사용하면 불변 컬렉션이 된다. - 불변 컬렉션이더라도 ReferenceType인 Element의 필드는 바꿀 수 있다.
- 가변 컬렉션에
List
Kotlin
// 불변 리스트
val numbers = listOf(100, 200)
// 비어있는 리스트
val emptyList = emptyList<Int>()
// 가변 리스트
val numbers2 = mutableListOf(100, 200)
// 하나만 가져오기
println(numbers[0])
// foreach
for (number in numbers) {
println(number)
}
// 인덱스와 함께 가져오기
for ((idx, value) in numbers.withIndex()) {
println("${idx} ${value}")
}
listOf()
를 통해 불변 리스트를 만든다.emptyList<타입>()
를 이용해 비어있는 리스트를 만들 수 있다.- 타입을 추론할 수 있다면 생략 가능하다.
mutableListOf()
를 사용하면 가변 리스트를 만들 수 있다.- 기본 구현체는 자바의
ArrayList
이다.
- 기본 구현체는 자바의
- TIP: 불변 리스트를 만들고, 꼭 필요한 경우 가변 리스트로 바꾸자
Set
Kotlin
// 불변 Set
val numbers = setOf(100, 200)
// 비어있는 Set
val emptySet = emptySet<Int>()
// 가변 Set
val numbers2 = mutableSetOf(100, 200)
// foreach
for (number in numbers) {
println(number)
}
// 인덱스와 함께 가져오기
for ((idx, value) in numbers.withIndex()) {
println("${idx} ${value}")
}
Set
은List
와 다르게 순서가 없고, 같은 element는 하나만 존재할 수 있다.- 자료구조적 의미만 제외하면 모든 기능은 List와 동일하다.
setOf()
를 사용해 불변 Set을 만들 수 있다.mutableSetOf()
를 사용하면 가변 Set을 만들 수 있다.- 기본 구현체는
LinkedHashSet
이다.
- 기본 구현체는
Map
Kotlin
mapOf(1 to "MONDAY", 2 to "TUESDAY")
val oldMap = mutableMapOf<Int, String>()
oldMap[1] = "MONDAY"
oldMap[2] = "TUESDAY"
// 사용하기
for (key in oldMap.keys) {
println(key)
println(oldMap.get(key))
println(oldMap[key])
}
for ((key, value) in oldMap.entries) {
println(key)
println(value)
}
MutableMap
을 만들어 넣을 수도 있고, 정적 팩토리 메서드를 활용할 수도 있다.mapOf()
을 사용해 불변 Map을 만들 수 있다.mutableMapOf()
를 사용하면 가변 Map을 만들 수 있다.
컬렉션의 null 가능성과 Java
?
의 위치에 따라null
가능성 의미가 달라진다.List<Int?>
: 리스트에 null이 들어갈 수 있지만, 리스트는 절대 null이 아니다.List<Int>?
: 리스트에는 null이 들어갈 수 없지만, 리스트는 null일 수 있다.List<Int?>?
: 리스트에 null이 들어갈 수도 있고, 리스트가 null일 수도 있다.
- Java의 읽기 전용 컬렉션과 변경 가능 컬렉션을 구분하지 않는다.
- 코틀린의 불변 컬렉션을 자바에서 사용한다면 Element를 추가할 수 있다.
자바에서 Element를 추가하고 코틀린에서 다시 사용한다면 문제가 발생할 수 있다. - 코틀린의 non-nullable 컬렉션을 자바에서 사용한다면 null을 추가할 수 있다.
자바에서 nulㅣ을 추가하고 코틀린에서 다시 사용한다면 문제가 발생할 수 있다. - 때문에 Kotlin쪽의 컬렉션이 Java에서 호출된다면 컬렉션 내용이 변경할 될 수 있음을 감안해야 한다.
- 코틀린 쪽에서 Collections.unmodifiableXXX()를 활용한다면 final이 붙은 것처럼 변경 자체를 막을 수 있다.
- 반대로 자바의 컬렉션을 코틀린에서 사용한다면, 플랫폼 타입을 주의해야 한다.
Java 코드를 보며 맥락을 확인하고 Java 코드를 가져오는 지점을 wrapping 해야 한다.
- 코틀린의 불변 컬렉션을 자바에서 사용한다면 Element를 추가할 수 있다.
반응형
'Java & Kotlin > Kotlin' 카테고리의 다른 글
[Kotlin] 컬렉션을 함수형으로 사용하기 (0) | 2022.07.07 |
---|---|
[Kotlin] 람다 (0) | 2022.07.07 |
[Kotlin] 함수 (0) | 2022.07.07 |
[Kotlin] Data, Enum, Sealed 클래스 (0) | 2022.07.06 |
[Kotlin] 중첩 클래스를 다루는 방법 (0) | 2022.07.06 |
[Kotlin] object를 다루는 방법 (0) | 2022.07.06 |