본문 바로가기

FP - 배열과 컬렉션

@silver-w2025. 10. 8. 14:22
  1. 배열
  2. Collection - List, Set, Map
  3. 컬렉션의 null 가능성, Java와 함께 사용하기
 - 배열의 사용법이 자바와 약간 다르다 
 - 코틀린에서는 불변/가변 컬렉션을 지정해야한다
 - List, Set, Map에 대한 사용법이 변경 및 확장 되었다
 - Java <-> Kotlin 간 컬렉션을 교환할 때는 플랫폼 타입과 nullable 옵션 간 언어간 유무 차이점을 신경써야 한다.

더보기

1 . 배열

- 코틀린은 컬렉션이든 배열이든 val, var로 시작한다.

fun main() {
    var array = arrayOf(100, 200)

    for (i in array.indices) {  
        println(array[i])
    }

    array = array.plus(300) // 값을 쉽게 넣을 수 있다.

    for ((idx, value) in array.withIndex()) {   
        println("$idx $value")
    }

}

 1) indices : array.indices의 범위 : idx 0부터 마지막까지를 가르킨다.
 2) array.plus(element) : element +
 3) withIndex() : 인덱스와 값을 한 번에 가져올 수 있다.

2 . Collection - List, Set, Map

- 코틀린에서는 불변 컬렉션인지 가변 컬렉션인지 지정해줘야한다.

1) Mutable 컬렉션 vs 불변 컬렉션 
 - 가변컬렉션은 컬렉션에 element를 추가, 삭제할 수 있다
 - 불변컬렉션은 컬렉션에 element를 추가, 삭제할 수 없다.
→ Collections.unmodifiableList / Map() 등을 붙여 불변컬렉션 셋팅
 다만, 불변 컬렉션이더라도 Reference 타입인 Element의 필드는 바꿀 수 있다.
인덱스 자체를 빼거나, 삭제는 할 수 없지만, 이미 있는 인덱스의 element는 바꿀 수 있다.

□ List : 기타 사용법은 자바와 똑같다
1) 리스트 생성

fun main() {
    val numbers = listOf(100, 200)  // 불변리스트 생성
	val mutableList = mutableListOf(100, 200) // 가변 리스트 생성
    var emptyList = emptyList<Int>()    // 빈 리스트 생성    
    printNum(emptyList())

}

private fun printNum(numbers: List<Int>) {}

비어있는 리스트는 타입을 명시해야한다. (타입 추론 가능 시 생략 가능)

2) 인덱스의 값 가져오기

package fp

fun main() {
    val numbers = listOf(100, 200)  // 불변리스트 생성
    println(numbers.get(0)) // 100
    println(numbers[0])     // 100
    for(num in numbers) {
        print("$num ")  // 100 200
    }
    for ((idx, value) in numbers.withIndex())  {
        println("$idx $value ") // 0 100, 1 200
    }

}


▶ tip . 우선 불변 리스트를 만들고, 필요할 경우에만 가변 리스트로 바꾸

□ Set : 자료 구조적인 차이를 제외하면 List와 동일하다 
1) 리스트 생성

 - 가변 set : mutableSetOf()

 - 불변 set : setOf()

 - 기본 구현체는 LinkedHashSet

 
□ Map
1) 리스트 생성과 순회

fun main() {
    val oldMap = mutableMapOf<Int, String>()
    oldMap[1] = "Mon"
    oldMap[2] = "Tue"
    oldMap.put(3, "Fri")


    for(m in oldMap) {
        print("${m.key} -> ${m.value} ")
    }
    println()
    val oldMap2 = mapOf(1 to "Mon", 2 to "Thu", 3 to "Fri", 4 to "Sat")
			.forEach { (key, value) ->
        print("$key -> $value ")
    }
}

 ① 값 대입
  - map[key] = value || map.put() 으로 key, value를 설정할 수 있고

  - 객체를 생성할때 mapOf (key to value, ...)로도 생성이 가능하다 (불변map)


 ② 값 순회

  - 위 List에서 사용한 방식을 사용해도 되고 (for in)

  - .forEach{ (key, value) -> } 을 이용해 람다식으로 활용할 수도 있다.

  - 키만 가져오기 (map.enrySet())

for(key in oldMap.keys) {
    print("$key -> ${oldMap[key]} ")
}

for((key, value) in oldMap.entries) {
    print("$key -> $value ")
}

 

3 . 컬렉션의 null 가능성, Java와 함께 사용하기

□ 물음표의 위치에 따라서  Null 가능성이 바뀐다.

List<Int?> 리스트에는 null이 들어갈 수 있지만, 리스트는 null이 절대 아님
List<Int>? 리스트에는 null이 들어갈 수 없지만, 리스트는 null일 수 있음
List<Int?>? 리스트에는 null이 들어갈 수 있고, 리스트는 null일 수 있음

□ Kotlin 쪽의 컬렉션이 Java에서 호출되면 컬렉션 내용이 변할 수 있음을 감안해야한다.
① 자바는 읽기 전용 컬렉션과 변경 가능 컬렉션을 구분하지 않지만, 
   코틀린에선 불변/가변을 구분한다 
   ▶ 이에 자바에서 불변리스트에 element를 추가할 수 있다 이를 코틀린에서 가져올 가능
② 자바에서는 nullable 타입과 non-nullable을 구분하지 않지만, 코틀린에선 구분한다.
   ▶ 이에 자바에서 non-nullable 컬렉션에 null을 추가하고 코틀린으로 돌려줄 가능성.
§ 방어 코드를 짜거나 Collections.unmodifableXXX()를 활용하면 자바 쪽에서의 변경 자체를 막을 수도 있다.
 ③ 반대로 자바의 컬렉션을 코틀린에서 가져올 때, 플랫폼타입은 자바에서 구분하지 않기 때문에, 코드 맥락을 확인하고 Java 코드를 가져오는 지점을 wrapping 해야한다.

 


 

※ (intellij) 코틀린 코드 자바로 변환
tool > Kotlin > Show Kotlin Bytecode


출처 : https://inf.run/sMPv5

 

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)| 최태현 - 인프런 강의

현재 평점 5.0점 수강생 3,553명인 강의를 만나보세요. 이 강의를 통해 Kotlin 언어의 특성과 배경, 문법과 동작 원리, 사용 용례, Java와 Kotlin을 함께 사용할 때에 주의할 점 등을 배울 수 있습니다. Ko

www.inflearn.com

https://kotlinlang.org/docs/collections-overview.html#collection-types

 

Collections overview | Kotlin

 

kotlinlang.org

 

silver-w
@silver-w :: silver-w 님의 블로그

silver-w 님의 블로그 입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차