Study/kotlin

[코틀린 프로그래밍] Chapter.05 콜렉션 사용하기

에디개발자 2021. 4. 14. 07:39
반응형

 

나를 닮았다고 한다...

 

콜렉션의 특징

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

반응형