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 |
댓글