본문 바로가기
Java & Kotlin/Kotlin

[Kotlin] 여러가지 기능

by heekng 2022. 7. 7.
반응형

여러가지 기능

Type Alias

Kotlin

typealias FruitFilter = (Fruit) -> Boolean

fun filterFruits(fruits: List<Fruit>, filter: FruitFilter) {

}

typealias USGTMap = Map<String, UltraSuperGuardianTribe>

data class UltraSuperGuardianTribe(
        val name: String
)
  • typealias: 긴 이름의 클래스 혹은 타입이 있을 때 축약하거나 더 좋은 이름을 쓰고싶을 때 사용할 수 있다.

as import

Kotlin

import com.heekng.kotlinStudy.kotlin.lec12.Person as PersonA
import com.heekng.kotlinStudy.kotlin.lec16.Person as PersonB

fun main() {
    PersonA
    PersonB("heekng", "ko")
}
  • as import: 다른 패키지의 같은 이름 함수를 동시에 가져오고 싶을 때 사용할 수 있다.

구조분해와 componentN 함수

Kotlin

fun main() {
    val person = Person("heekng", 28)
    val (name, age) = person
    /*
    // 동일하다.
    val name = person.component1()
    val age = person.component2()
     */
    println("이름: ${name} 나이: ${age}")
}

data class Person(
        val name: String,
        val age: Int
)
  • 구조분해: 복합적인 값을 분해해서 여러 변수를 한 번에 초기화하는 것
  • Data ClassComponentN이라는 함수도 자동으로 만들어준다.
  • 구조분해는 프로퍼티의 이름을 인식해서 가져오는 것이 아니라 변수의 순서대로 가져온다.
  • mapentry 또한 구조분해 문법을 사용한 것이다.

Kotlin

fun main() {
    val person = Person2("heekng", 28)
    val (name, age) = person
    println("이름: ${name} 나이: ${age}")
}

class Person2(
        val name: String,
        val age: Int
) {
    operator fun component1(): String {
        return this.name
    }
    operator fun component2(): Int {
        return this.age
    }
}
  • Data Class가 아닌데 구조분해를 사용하고 싶다면 componentN 함수를 직접 구현하면 된다.
    • componentN 함수는 연산자 성질을 가지고 있기 때문에 직접 구현할 때에는 operator 키워드를 붙여주어야 한다.

Jump와 Label

Kotlin

val numbers = listOf(1, 2, 3)

numbers.map { it + 1 }
        .forEach {println(it)}

numbers.forEach {number ->
    if (number == 2) {
        return@forEach
    }
}
  • return: 기본적으로 가장 가까운 enclosing function 또는 익명함수로 값이 반환된다.
  • break: 가장 가까운 루프가 제거된다.
  • continue: 가장 가까운 루프를 다음 step으로 보낸다.
  • 위는 자바와 동일하지만 코틀린에서 foreach를 사용할 때에는 조금 다르다.
  • 함수형 프로그래밍 foreach에서는 continue 또는 break을 사용하지 못한다.
  • continuebreak을 사용하고 싶다면?
    • foreachrun{}으로 감싸고, return@run 하여 break 할 수 있다.
    • return@foreach 하여 continue 할 수 있다.

Kotlin

abc@ for (i in 1..100) {
    for (j in 1..100) {
        if (j == 2) {
            break@abc
        }
        println("${i} ${j}")
    }
}
  • Label: 특정 expression에 라벨이름@ 을 붙여 하나의 라벨로 간주하고 break, continue, return 등을 사용하는 기능
  • Label을 사용한 Jump는 사용하지 않는 것을 추천한다.

TakeIf와 TakeUnless

Kotlin

// default
fun getNumberOrNull(number: Int): Int? {
    return if (number <= 0) {
        null
    } else {
        number
    }
}

// takeIf
fun getNumberOrNullTakeIf(number: Int): Int? {
    return number.takeIf { it > 0 }
}

// takeUnless
fun getNumberOrNullTakeUnless(number: Int): Int? {
    return number.takeUnless { it <= 0 }
}
  • takeIf: 주어진 조건을 만족하면 그 값이, 그렇지 않으면 null이 반환된다.
  • takeAunless: 주어진 조건을 만족하지 않으면 그 값이, 그렇지 않으면 null이 반환된다.
반응형

'Java & Kotlin > Kotlin' 카테고리의 다른 글

[Kotlin] 컬렉션을 함수형으로 사용하기  (0) 2022.07.07
[Kotlin] 람다  (0) 2022.07.07
[Kotlin] 함수  (0) 2022.07.07
[Kotlin] 배열과 컬렉션  (0) 2022.07.07
[Kotlin] Data, Enum, Sealed 클래스  (0) 2022.07.06
[Kotlin] 중첩 클래스를 다루는 방법  (0) 2022.07.06