코틀린 스코프 함수란?

HEETAE HEO·2022년 5월 30일
0
post-thumbnail

스코프 함수란?

코틀린 표준 라이브러리에는 Object Context 내에서 코드 블록을 실행하는 것이 목적인 여러 함수가 있습니다. 제고오딘 람다 식을 사용하여 객체에 이러한 함수들을 호출하면 임시적으로 스코프(범위)가 설정됩니다. 이 범위에서는 해당 객체의 이름 없이 접근할 수 있습니다.

run, let, with, apply, also

run

  • run 함수는 확장 함수이기 때문에 context object를 receiver(this)로 이용할 수 있습니다.

  • run 함수는 반환 결과가 람다의 결과입니다.

  • run 함수는 개체의 초기화와 리턴 값을 계산을 람다가 포함할 때 유용합니다.

  • 확장함수이기 때문에 safe call을 붙여 non-null일 때에만 실행할 수 있습니다.

  • 주로 어떤 값을 계산할 필요가 있거나 여러 개의 지역변수를 제한할 때 사용한다.

run을 적용한다면

val inserted: Boolean = run {
	//person과 personDao의 범위를 제한합니다. 
    
    val person : Person = getPerson()
    val personDao: PersonDao = getPersonDao()
    
    //수행 결과를 반환 합니다. 
    personDao.insert(person)
}

fun printAge(person:Person) = person.run {
	//person을 수신객체로 변환하여 age 값을 사용합니다. 
    print(age)
}

run을 적용하지않는다면

val person:Person = getPerson()
val personDao : PersonDao = getPersonDao()
val inserted : Boolean = personDao.insert(person)

fun printAge(person : Person) = { 
	print(person.age)
}

with

  • with 함수는 확장 함수가 아니기 때문에 context object를 argument로 전달합니다. 그러나 람다의 내부에는 확장함수로 적용되어서 this로 사용가능합니다.

  • with 함수는 반환 결과가 람다의 결과입니다.

  • with 함수는 수신 객체는 non-nullable이고, 결과가 필요하지 않은 경우에 유용합니다.

val member = Member("heetae",25)
with(member) {
	println("This member name is $name") // this.name
    println("This member age is $age") // this.age

apply

  • apply 함수는 확장 함수이기 때문에 context object를 receiver(this)로 이용할 수 있다.

  • apply 함수는 반환 결과가 객체 자신입니다. Builder 패턴과 동일한 용도로 사용됩니다.

  • apply 함수는 객체의 프로퍼티 만을 사용하는 경우가 많으며, 대표적인 사례는 객체의 초기화입니다.

val member = Member("heetae").apply{
	age = 25 // this.age
}

println(memeber) // Member("name=heetae , age = 25")

also

  • also 함수는 확장 함수이기 때문에 context object를 receiver(this)로 전달합니다. 그러나 코드 블럭 내에서 this를 파라미터로 입력하기 때문에 it을 사용해 프로퍼티에 접근할 수 있습니다.

  • also 함수는 반환 결과가 객체 자신입니다. Builder 패턴과 동일한 용도로 사용됩니다.

  • also 함수는 객체의 속성을 전혀 사용하지 않거나 변경하지 않고 사용하는 경우에 유용합니다. 예를 들면 객체의 데이터 유효성을 확인하거나, 디버그, 로깅 등의 부가적인 목적으로 사용할 때에 적합합니다.

also을 적용한 코드

class Membership(member : Member) {
	val member  = Member.also{
    	requireNotNull(it.age)
        println(it.name)
    }
}

also을 적용하지 않은 코드

calss Membership(val member : Member) {
	init{
    	requireNotNull(member.age)
        println(member.name)
    }
}

let

  • let 함수는 확장 함수이기 때문에 context object를 receiver(this)로 전달합니다. 그러나 코드 블럭 내에서 this를 파라미터로 입력하기 때문에 it을 사용해 프로퍼티에 접근할 수 있습니다.

  • let 함수는 반환 결과가 람다의 결과입니다.

  • let 함수는 지정된 값이 null이 아닌 경우에 코드를 실행해야 하는 경우, Nullable 객체를 다른 Nullable 객체로 반환하는 경우, 단일 지역 변수의 범위를 제한하는 경우에 유용합니다.

getMember()?.let {
                    // null이 아닐때만 실행
    println(it)     // it: member
}

val length = str?.let {
    println("this str is not null")
    it.length
} ?: 0

// str이 "Wangi"일 경우 length = 5
// str이 null일 경우 length = 0
profile
Android 개발 잘하고 싶어요!!!

0개의 댓글