[자바 개발자를 위한 코틀린 입문] 배열과 컬렉션 다루기
by dev.hardy코틀린에서 배열과 컬렉션을 다루는 방법
인프런에서 최태현 지식 공유자
님의자바 개발자를 위한 코틀린 입문
을 수강하며 정리한 내용 입니다.
하단에 강의 링크 있습니다.
배열
사실 배열은 잘 사용하지 않는다.
이펙티브 자바에서는 배열보다 리스트를 사용하라
라고 나와있다.
val array = arrayOf(100, 200) // (1)
for (i in array.indices){ // (2)
}
for ((idx, value) in array.withIndex()){ // (3)
}
array.plus(300) // (4)
(1) 100, 200이 들어간 배열 생성
(2) 배열의 인덱스를 이용하여 for 루프 생성
(3) 인덱스와 값까지 같이 받는 방법
(4) 배열에 엘리먼트 추가 가능
코틀린에서의 Collection
**컬렉션을 만들어줄 때 불변인지, 가변인지를 설정해야 함**
가변 컬렉션
: 컬렉션에 element를 추가, 삭제할 수 있다.불변 컬렉션
: 컬렉션에 element를 추가, 삭제 불가- 불변 컬렉션이라 하더라도
Reference Type
인 element의 필드는 바꿀 수 있다.
- 불변 컬렉션이라 하더라도
List
예) 불변 리스트 만들기
val numbers = listOf(100, 200)
val emptyList = emptyList<Int>() // 타입 명시해야함
예) 리스트 순회
fun main() {
val numbers = listOf(100, 200)
println(numbers[0])
for (number in numbers) {
println(numbers)
}
for ((idx, value) in numbers.withIndex()) {
println("${idx} / ${value}")
}
}
/**
100
[100, 200]
[100, 200]
0 / 100
1 / 200
*/
fun main() {
val numbers = mutableListOf(100, 200) // (1)
numbers.add(300) // (2)
}
(1) 원소들로 타입 추론 가능하므로 생략 가능
(2) element 추가 가능
기본구현체는 ArrayList
이다. 기타 사용법은 자바와 동일!
TIP)
우선 불변 리스트를 만들고, 꼭 필요한 경우 가변 리스트로 바꾸자!
→ 그래야 코드도 깔끔해지고 불필요한 가변 리스트 사용이 줄어들기 때문!
Set
집합
은 List와 다르게 순서가 없고 중복 허용 안한다.
→ 자료구조적 의미만 제외하면 모든 기능이 List와 비슷
가변 집합을 만들고 싶다면? → mutableSetOf()
를 사용
기본 구현체는 LinkedHashSet
이다.
fun main() {
val subject = setOf("java", "spring", "kotlin") // (1)
val lecture = mutableSetOf("git", "linux") // (2)
}
(1) 불변 집합
(2) 가변 집합
Map
예) Map 엘리먼트 추가하는 두 가지 방법
fun main() {
val oldMap = mutableMapOf<Int, String>() // (1)
oldMap.put(1, "Monday")
oldMap[1] = "Monday"
mapOf(1 to "Monday", 2 to "Tuesday")
}
(1) 가변 Map이기 때문에 (key, value) 추가 가능
- 자바처럼 put 사용할 수도 있다.
map[key] = value
도 가능- 코틀린도 동일하게 MutableMap을 만들어 넣을 수 있다.
- 정적 팩토리 메소드를 바로 활용 할 수 있다.
예) Map 순회
fun main() {
val oldMap = mutableMapOf<Int, String>()
oldMap[1] = "Monday"
oldMap[2] = "TuesDay"
for (key in oldMap.keys) {
println(key)
println(oldMap[key])
}
for ((key, value) in oldMap.entries) {
println("key=${key} , value=${value}")
}
}
컬렉션의 null 가능성, 자바와 함께 사용하기
- List<Int?>: 리스트에 null이 들어갈 수 있지만, 리스트는 절대 null 아님
- List: 리스트에 null이 들어갈 수 없지만, 리스트는 null일 수 있음
- List<Int?>?: 리스트에 null이 들어갈 수도 있고, 리스트가 null일 수도 있음
→ ? 위치에 따라 null 가능성 의미가 달라지므로 차이를 잘 이해해야함
- 자바와 함께 사용할 때의 주의점
- 자바는 읽기 전용 컬렉션과 변경 가능 컬렉션을 구분하지 않음
코틀린에서 불변 리스트를 만들더라도 자바에서는 구분하지 않으므로 element 추가 삭제 가능하다.
- 자바는 nullable과 non-nullable 타입을 구분하지 않음
코틀린에서 null이 들어갈 수 없는 리스트를 만들었는데 자바에서 null을 리스트에 추가할 수도 있다.
- 자바는 읽기 전용 컬렉션과 변경 가능 컬렉션을 구분하지 않음
코틀린에서 자바 컬렉션을 가져다 사용할 때 플랫폼 타입
을 신경써야 한다.
즉, 자바에서 List이라고 리스트를 만들고 코틀린에서 사용할 때 코틀린은 List<String?>, List, List<String?>? 인지 모른다.
→ 자바 코드를 보며, 맥락을 확인하고 Java 코드를 가져오는 지점을 wrapping
한다.
→ 영향범위를 최소화 해야함
Reference:
자바 개발자를 위한 코틀린 입문
블로그의 정보
개발자 하디 : 기록저장소
dev.hardy