Lewis's Tech Keep

[kotlin] 코틀린 적응기 - 배열 & 컬렉션, 함수 본문

Kotlin/Kotlin 적응기

[kotlin] 코틀린 적응기 - 배열 & 컬렉션, 함수

Lewis Seo 2024. 10. 1. 21:58

시작

컬렉션은 데이터 저장 구조나 변경 구조에서 자주 쓸 테니 잘 정리해두자.

 

배우고 있는 것

https://www.inflearn.com/course/java-to-kotlin

 

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

최태현 | 이 강의를 통해 Kotlin 언어의 특성과 배경, 문법과 동작 원리, 사용 용례, Java와 Kotlin을 함께 사용할 때에 주의할 점 등을 배울 수 있습니다., 요즘 대세인 코틀린을 공부하고 싶다면?⭐ J

www.inflearn.com

 

 

1. 배열 & 컬렉션

배열

 

배열은 arrayOf로 생성 가능하다.

fun main() {
    /**
    * array
    * */
    val array = arrayOf(100, 200)
}

 

index loop 구문

with index로 사용한다면 idx와 value를 한 번에 부르는 것도 가능하다.

element add는 plus로 추가해줄 수 있다.

fun main() {
    /**
    * array
    * */
    val array = arrayOf(100, 200)

    // index
    for (i in array.indices) {
        println("${i}, ${array[i]}")
    }

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

    // array add
    array.plus(300)
}

 

컬렉션

 

list

 

코틀린에서 collection은 가변 컬렉션, 불변 컬렉션을 초기에 명시적으로 설정해준다.

listOf, mutableListOf와 같이 설정해주는 것이다.

이 둘의 차이는 
가변 컬렉션 : element 추가, 삭제 가능
불변 컬렉션 : element 추가, 삭제 불가

 

불변 컬렉션은 추가, 삭제만 안될 뿐이지 기존 element 변경은 가능하다.

fun main() {
    /**
     * collection
     */
    // kotlin 은 불변/ 가변을 초기에 설정해줘야함
    val numbers = listOf(100, 200)
    // empty collection
    val emptyList = emptyList<Int>()

    // 타입 추론이 가능하면 생략도 가능
    printNumbers(emptyList())

    // index 로 가져오는 것처럼 collection에서도 가능
    println(numbers[0])

    // mutable list
    val mutableNumbers = mutableListOf(100, 200)
    mutableNumbers.add(300)
}

fun printNumbers(emptyList: List<Int>) {

}

 

set & map

 

set은 많이 다르거하 하지는 않다.

map은 to 키워드를 이용하여 Pair 처럼 설정이 가능하다.

fun main() {

    /**
     * collection
     */
    // set
    val setNumbers = setOf(100, 200)
    setNumbers.plus(300)

    // mutable set
    val mutableSet = mutableSetOf(100, 200)
    mutableSet.add(300)

    // mutable map
    val map = mutableMapOf<Int, String>()
    map[1] = "1"
    map[2] = "2"

    // immutable map
    // map key to value
    mapOf(1 to "1", 2 to "2")

    // map get
    for (key in map.keys) {
        println(key)
        println(map[key])
    }

    // map get as entry
    for ((key, value) in map.entries) {
        println(key)
        println(value)
    }
}

 

nullable 

 

nullable 할 수 있는 타입들을 설정하는 방법들이다.

fun main() {
    // list element can be null, list not null
    val list0 = arrayOf<Int?>(null)

    // list element can't be null, list can be null
    val list1 : Array<Int>? = null

    // list element can be null, list can be null
    val list2 : Array<Int?>? = null
    val list3 : Array<Int?>? = arrayOf(null)
}

 

2. 함수

확장 함수

 

기존 클래스에 추가로 기능을 붙이려는 경우 유용한 함수다.

 

주의사항
확장 함수와 멤버 함수의 시그니처가 겹치면 멤버 함수만 호출된다.

fun main() {
    val str = "ABC"
    println(str.lastChar())
}

// 바깥 쪽에서 함수를 부르게 해보자.
// fun 확장하려는클래스.함수이름(파라미터): 리턴타입
// this 를 이용해 실제 클래스 안의 값에 접근
// 확장하려는클래스==수신객체타입
fun String.lastChar(): Char {
    return this[this.length - 1]
}

 

상속 관계의 확장 함수 사용 시

 

자식 클래스로 생성하고 타입을 부모 클래스로 설정하고 겹치는 확장함수를 부르면 타입의 확장 함수가 호출된다.

fun main() {
    val train: Train = Train()
    train.isExpensive() // Train extended

    val srt1: Train = SRT()
    srt1.isExpensive() // Train extended

    val srt2: SRT = SRT()
    srt2.isExpensive() // SRT extended
}

open class Train (
    val name: String = "old Train",
    val price: Int = 5_000,
)

fun Train.isExpensive(): Boolean {
    println("train extended function")
    return this.price >= 10_000
}

class SRT : Train("SRT", 40_000)

fun SRT.isExpensive(): Boolean {
    println("srt extended function")
    return this.price >= 10_000
}

 

중위 함수

 

infix 키워드를 통해 설정이 가능하다.

설정하면 함수 호출 형태가 아닌 생략하고 부르는 형태로 가능하다.

fun main() {
    3.add(4)

    3.add2(4)
    3 add2 4
}

fun Int.add(other: Int): Int {
    return this + other
}

infix fun Int.add2(other: Int): Int {
    return this + other
}

 

 

 

 

Comments