본문 바로가기
Kotlin

Tip

by oncerun 2023. 1. 15.
반응형

Type Alias, as import

 

긴 이름의 클래스 혹은 함수 타입이 있을 때 축약하거나 더 좋은 이름을 쓰고 싶을 때 사용한다.

fun filterFruits(fruits: List<Fruit>, filter: (Fruit) -> Boolean) {
    
}

 

람다의 파라미터를 다음과 같이 변형할 수 있다.

typealias FruitFilter  = (Fruit) -> Boolean


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

}

 

이름이 긴 클래스를 컬렉션에 사용할 때도 간단히 줄일 수 있다.

 

 

다른 패키지의 같은 이름 함수를 동시에 가져오고 싶다면 as import를 사용할 수 있다.

이는 어떤 클래스나 함수를 임포트 할 때 이름을 바꾸는 기능이다.

import com.lannstark.lec17.Fruit as defaultFruit

typealias FruitFilter  = (defaultFruit) -> Boolean


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

}

 

 

구조분해와 componentN 함수

 

 

구조분해라는 것은 복합적인 값을 분해하여 여러 변수를 한 번에 초기화하는 것을 말한다.

val person = Person("onec", "run", 1)
val (first, lastName, age) = person

 

Data 클래스는 ComponentN이라는 함수를 자동으로 만들어준다.

val first = person.component1()
val lastName = person.component2()

 

실제 이는 단순히 첫 번째 프로퍼티를 가져오고 두 번째 프로퍼티를 가져오는 함수이다.

 

Data Class가 아닌데 구조분해를 사용하고 싶다면, componentN함수를 직접 구현해 줄 수도 있다.

class Person(
    val name: String,
    val age: Int
){

    operator fun component1(): String {
        return this.name
    }

    operator fun component2(): Int {
        return this.age
    }
            
}

 

Jump와 Label

 

val listOf = listOf(1, 2, 3)

listOf.forEach {number ->
    if (number == 3) continue
    println(number)
} 

forEach에서는 break와 continue 키워드를 사용할 수 없다.

 

만약 break를 써야 한다면 다음과 같이 run으로 감싸준다.

run{
    listOf.forEach {number ->
        if (number == 3) return@run
        println(number)
    }
}

 

continue는 다음과 @run 대신에 @.forEach로 변경해서 사용한다.

 

@는 라벨이다. 

 

특정 expression에 라벨이름@을 붙여 하나의 라벨로 간주하고 break, continue, return 등을 사용하는 기능을 말한다.

loop@ for (i in 1..100) {
    for (j in 1..100) {
        if (...) break@loop
    }
}

 

 

TakeIf와 TakeUnless

 

takeIf는 주어진 조건을 만족하면 그 값이, 그렇지 않으면 null이 반환되고, takeUnless는 그와 반대로 조건을 만족하지 않으면 그 값이 반환되고 그렇지 않으면 null이 반환된다.

 

 

 

scope function

 

일시적인 영역을 형성하는 함수로 takeIf와 takeUnless 느낌이 난다. 

fun printPerson(person: Person?) {
    person?.let {
        println(it.age)
        println(it.firstName)
    }
    
}

 

Safe Call을 사용하여 null이 아닐 경우 let을 호출한다. let은 scope function의 한 종류이다.

 

보통 코드를 더 간결하게 만들거나, method chaing에 활용하는 함수를 scope function이라고 한다.

 

종류로는 let, run, also, apply, with로 있다. (with는 확장함수가 아니다. )

 

scope function을 사용한 코드는 사람에 따라 가독성을 다르게 느낄 수 있기 때문에 함께 프로덕트를 만들어 가는 팀끼리 conention을 잘 정해야 한다.

 

 

반응형

'Kotlin' 카테고리의 다른 글

Backing Property  (0) 2023.07.03
Kotlin 테스트 작성을 위한 빌드 업  (0) 2023.01.18
함수  (0) 2023.01.15
중첩 클래스, 다양한 클래스  (0) 2023.01.15
Object 키워드  (0) 2023.01.12

댓글