이 글은 인프런의 자바 개발자를 위한 코틀린 입문의 영상을 보고 공부하면서 정리하는 글입니다.
fun printPerson(person: Person){
if (person != null){
println(person.name)
println(person.age)
}
}
이 코드를 리팩토링 해보겠습니다.
아래와 같이 변경할 수 있습니다.
fun printPerson(person: Person){
person?.let {
println(it.name)
println(it.age)
}
}
람다를 사용해 일시적인 영역을 만들고 코드를 더 간결하게 만들거나, method chaning에 활용하는 함수를 scope function이라고 합니다.
scope function에는 5개의 종류가 있습니다.
let, run, also, apply (확장함수)
with (확장함수 아님)
확장함수의 특징은 마치 멤버함수처럼 쓰는 것이 확장함수 입니다.
let, run -> 람다의 결과를 반환
also, apply -> 객체 그자체를 반환
let, also -> 람다 안에서 it 사용
Run, apply -> 람다 안에서 this 사용
this : 생략이 가능한 대신, 다른 이름을 붙일 수 없습니다.
it : 생략이 불가능한 대신 다른 이름을 붙일 수 있습니다.
with : this를 사용해 접근하고, this는 생략가능합니다.
let
val strins = listOf("APPLE", "CAR")
strings.map{ it.length }
.filter{ it > 3 }
.let(::println)
val length = str?.let{
println(it.uppercase())
it.length
}
val numbers = listOf("one", "two", "three", "four")
val modifiedFirstItem = numbers.first()
.let {firstItem ->
if (firstItem.length >= 5) firstItem else "!$firstItem!"
}.uppercase()
println(modifiedFirstItem)
run
val person = Person("changhwan", 27).run(personRepository::save)
apply
fun createPerson(
name: String,
age: Int,
hobby: String,
): Person {
return Person(
name = name,
age = age,
).apply{
this.hobby = hobby
}
}
also
mutableListOf("one", "two", "three")
.also{ println(it) }
.add("four")
with
return with(person){
PersonDto(
name = name,
age = age,
)
}
kotlin를 이용해 개발하면서 굉장히 매력적으로 느껴졌던 기능이었습니다. 물론 컨벤션이 정해져있지 않은 상태로 남발하며 쓰게 되면 가독성은 떨어질 수 있지만 코드를 간결하게 해주는데에 굉장히 도움이 되고 좋은 기능이라는 생각이 들었습니다.