[Kotlin] kotlin의 scope function

모지리 개발자·2022년 12월 28일
0

Kotlin

목록 보기
5/5

이 글은 인프런의 자바 개발자를 위한 코틀린 입문의 영상을 보고 공부하면서 정리하는 글입니다.

목차

  • scope function이란 무엇인가?
  • scope function의 분류
  • 언제 어떤 scope function을 사용해야할까?

scope function이란 무엇일까?

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의 분류

scope function에는 5개의 종류가 있습니다.

let, run, also, apply (확장함수)
with (확장함수 아님)

확장함수의 특징은 마치 멤버함수처럼 쓰는 것이 확장함수 입니다.

let, run -> 람다의 결과를 반환
also, apply -> 객체 그자체를 반환
let, also -> 람다 안에서 it 사용
Run, apply -> 람다 안에서 this 사용

this : 생략이 가능한 대신, 다른 이름을 붙일 수 없습니다.
it : 생략이 불가능한 대신 다른 이름을 붙일 수 있습니다.

with : this를 사용해 접근하고, this는 생략가능합니다.

언제 어떤 scope function을 사용해야할까?

let

  • 하나 이상의 call chain 결과로 호출할 때
val strins = listOf("APPLE", "CAR")
strings.map{ it.length }
	.filter{ it > 3 }
    .let(::println)
  • non-null값에 대해서만 code block을 실행시킬 때
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

  • 객체를 만들어 DB에 바로 저장하고 그 인스턴스를 활용할 때
val person = Person("changhwan", 27).run(personRepository::save)

apply

  • 객체 설정을 할 때에 객체를 수정하는 로직이 call chain 중간에 필요할 때
fun createPerson(
	name: String,
    age: Int,
    hobby: String,
): Person {
	return Person(
    	name = name,
        age = age,
    ).apply{
    	this.hobby = hobby
    }
}

also

  • 객체를 수정하는 로직이 call chain 중간에 필요할 때
mutableListOf("one", "two", "three")
	.also{ println(it) }
    .add("four")

with

  • 특정 객체를 다른 객체로 변환해야하는데 모듈간의 의존성에 의해 정적 팩토리 혹은 toClass함수를 만들기 어려울 때
return with(person){
	PersonDto(
    	name = name,
        age = age,
    )
}

결론

kotlin를 이용해 개발하면서 굉장히 매력적으로 느껴졌던 기능이었습니다. 물론 컨벤션이 정해져있지 않은 상태로 남발하며 쓰게 되면 가독성은 떨어질 수 있지만 코드를 간결하게 해주는데에 굉장히 도움이 되고 좋은 기능이라는 생각이 들었습니다.

profile
항상 부족하다 생각하며 발전하겠습니다.

0개의 댓글