콜렉션의 특징
Java에서는 리스트, 셋, 맵 등의 여러 종류의 콜렉션들을 사용합니다. 코틀린에서은 모두 지원하고 있고 이를 뮤터블( 변경가능 )과 이뮤터블( 변경불가능 ) 2가지로 나뉘어서 사용할 수 있습니다.
배열 만드는 방법
val alphabet = arrayOf("a", "b", "c", "d") println("${alphabet[0]} and ${alphabet[1]}")
smart하지 못한 방법
아래 코드는 Integer 클래스 타입으로 생성됨. 오버헤드가 크게 발생합니다.
val notSmartNumbers = arrayOf(1, 2, 3, 4, 5)
smart한 방법
int인 primity type으로 생성하자.
val smartNumbers = intArrayOf(1, 2, 3, 4, 5) // 이 외에 사용방법 println(smartNumbers.size) println(smartNumbers.average()) println(Array(5) { i -> (i + 1) * (i + 1) }.sum())
리스트
이뮤터블 vs 뮤터블
이뮤터블과 뮤터블의 차이는 변경이 가능한가 못하는가입니다. 이뮤터블은 변경이 불가능한 리스트 객체이고 뮤터블은 가능한 객체입니다. 코틀린에서는 선택할 수 있는 경우라는 이뮤터블을 선호해야한다고 합니다.
// 이뮤터블 리스트 val fruits = listOf("Apple", "Banana", "Grape") // 뮤터블 리스트 val fruits = mutableListOf("Apple", "Banana", "Grape")
인덱스 연산자
리스트에 접근하는 방법은 [0], [1]를 사용합니다. 인덱스 연산자를 사용하면 내부적으로 get() 사용하게 됩니다.
println("first fruit : ${fruits[0]}, second fruit : ${fruits[1]}")
Contains
java와 동일하게 contains 메서드 존재합니다.
println(fruits.contains("Apple")) println("Apple" in fruits)
리스트 추가
//이뮤터블 리스트이기 때문에 add 불가.. //fruits.add("Oranage")
+ - 연산자 이용합니다. 이 방법은 기존 리스트를 카피하고 새로운 리스트에 요소를 추가한다.
val copyFruits = fruits + "Orange"
리스트 루프
val names = listOf("Tom", "Jerry") println(names.javaClass) for ((index, name) in names.withIndex()) { println("$index, $name") }
Set
리스트와 비슷하지만 동일한 값을 지워주는 리스트입니다.
val fruits: Set<String> = setOf("Apple", "Banana", "Apple") println(fruits)
Set 의 종류
MutableSetOf() : 선호하지 않음.
hashSetOf(), linkedSetOf(), sortedSetOf()
Map
자바와 동일하게 키-값 페어를 보관하는 콜렉션입니다.
val sites = mapOf("naver" to "naver.com", "daum" to "daum.net")
Map의 데이터 존재 확인방법
println(sites.containsKey("naver")) println(sites.containsValue("naver.com")) println(sites.contains("naver")) println("naver" in sites)
Map 데이터 가져오기
// get은 map에 해당하는 키가 없다면 nullable 타입을 리턴한다. 아래의 코드는 동작하지 않는다. //val siteName: String = sites.get("naver1") //println(siteName) // Nullable 참조 타입 사용하자 val siteName: String? = sites.get("naver1") println(siteName) val siteName1: String? = sites["naver"] println(siteName1) // null이라면 default값 리턴 val siteName2: String? = sites.getOrDefault("naver1", "localhost.com") println(siteName2)
Map 추가 제거
// null이라면 default값 리턴 val siteName2: String? = sites.getOrDefault("naver1", "localhost.com") println(siteName2) // map도 마찬가지로 + - 연산자 이용가능하다. val copySites = sites + ("kakao" to "kakao.com") println(copySites) val copySites2 = copySites - "kakao" println(copySites2)
Map 루프
for (site in sites) { println("${site.key} ---- ${site.value}") } for ((key, value) in sites) { println("$key ---- $value") }
배열 함수형 스타일
함수형 스타일 map() 반복자를 이용한 예제 코드를 작성해보겠습니다.
// (코드, 온도) Pair의 리스트 val airportCodes = listOf("LAX", "SFO", "PDX", "SEA") val temperatures = airportCodes.map { code -> code to getTemperatureAtAirport(code) } for (temperature in temperatures) { println("Airport: ${temperature.first}: Temperature: ${temperature.second}") } fun getTemperatureAtAirport(code: String): String = "${(Math.random() * 30).roundToInt() + code.count()} C"
이뮤터블 - Pair, Triple.. 2 ~ 3 개 변수를 구성할 떄 좋음. 4개 이상일때는 data 객체를 고려하자!
정리
- Kotlin의 리스트는 Java의 리스트를 확장하고 읽기 전용(이뮤터블)을 통해 컴파일 시간의 안정성을 높혔다.
- 함수형, 동시성 코드, 비동기 프로그램을 작성할 때는 이뮤터블 리스트를 사용하자.
- 작은 크기의 콜렉션 : Pair, Triple
- 고정된 크기, 큰 크기 : Array 클래스
- 동적 크기 : List, Set
'Study > kotlin' 카테고리의 다른 글
[코틀린 프로그래밍] Chapter.07 객체와 클래스 (0) | 2021.04.26 |
---|---|
[코틀린 프로그래밍] Chapter.06 오류를 예방하는 타입 안정성 (0) | 2021.04.20 |
[코틀린 프로그래밍] Chapter.04 외부 반복과 아규먼트 매칭 (0) | 2021.04.13 |
[코틀린 프로그래밍] Chapter.03 함수를 사용하자 (0) | 2021.04.05 |
[코틀린 프로그래밍] Chapter.02 Java의 개발자를 위한 코틀린 필수 사항 (0) | 2021.03.29 |