범위 지정 함수

매일 수정하는 GNOSS LV5·2021년 8월 12일
1

AndroidStudio

목록 보기
6/83

Kotlin에는 여러가지 편리한 기능을 위한 함수들이 있다.
그중에서 대표적인 것은 범위 지정 함수이다.
이를 사용하면 코드를 좀 더 깔금하고 간결하게 사용할 수 있다.


범위 지정 함수란?

확장 함수는 람다를 인자로 받아 동작하며, 확장함수를 실행하는 주체를
수신자 혹은 수신자 객체라고 부른다.

범위 지정 함수는 람다식이 제공된 객체에서 호출하면 임시 범위가 형성된다.{ } 중괄호로 묶이는 블럭을 의미한다.
이 범위 에서 이름없이 객체에 접근을 할 수 있다.

기본적으로 apply,with,let,also,run이 존재하고, 이것의 기능은 객체에서 코드 블럭을 실행해주는 기능이다.

하지만 이들의 주요 차이점이 존재한다.
1. 객체가 블록 내에서 사용 가능한지 여부
2. 전체 표현식의 결과(return값)


♣️apply,let,with,also,run

1. apply

apply는 람다에 작성된 코드를 수신자 객체에 "적용"한다고 생각하면 된다.
apply를 사용하면 함수를 호출한 수신자 객체를 구성하기 위해 람다에 포함된 수신자 함수들을 연속적으로 호출한다.
그 다음, 람다의 실행이 끝나면 구성된 수신자 객체가 return된다.

람다 : 중괄호로 묶인 블럭. 수신자 객체를 꾸며주는 주 내용
수신자 객체 : 범위 지정 함수를 호출하는 매개체. 람다의 내용이 들어갈 그릇

val adam = Person("Adam").apply 
{
    age = 32
    city = "London"        
}
println(adam)

--------------------------------
람다 : 
{
    age = 32
    city = "London"        
}
수신자 객체 : Person("Adam")

사용 규칙
수신 객체 람다 내부에서 수신 객체의 함수를 사용하지 않고 수신 객체 자신을 다시 반환하려는 경우에 apply를 사용한다.


2. let

let은 let함수를 호출하는 수신자 객체를 람다의 인자로 넘기고, 결과값을 반환하는 함수이다.

수신자 객체를 기본적으로 it으로 받으며 그 결과물을 이용하여 다른 함수를 호출할 수 있다.

fun blockTest() {

    val person = Person("park", "jieun")

    val result = person?.let{
printPerson(it.lastName +it.firstName)
}

Assert.assertEquals(result, "parkjieun")

}

사용 규칙
널 체크를 해야 한다.
Nullable 객체를 다른 Nullable객체로 변환하는 경우.
단일 지역 변수의 범위를 제한하는 경우.


3. With

with는 비 확장 함수이다. context 객체를 인자로 직접 전달 받고, 람다 내부에서 이를 수신자로 사용한다.
객체를 직접 입력 받고, 객체를 사용하기 위한 block함수를 두번째 매개변수로 받는다.
with 함수는 block 함수의 반환값을 그대로 반환한다.

val person: Person =getPerson()
with(person){
print(name)
print(age)
}

with 를 사용하지 않는 동일한 코드는 다음과 같습니다.

val person: Person =getPerson()
print(person.name)
print(person.age)

사용 규칙
Non-Nullable 객체 이여야 하고, 결과가 필요하지 않은 경우


4. Also

also는 let처럼 자신을 호출한 수신자 객체를 람다의 인자로 전달한다.
let과 달리 수신자 객체를 반환한다.
수신 객체 람다가 전달된 수신 객체를 전혀 사용하지 않거나 수신 객체의 속성을 변경하지 않고 사용하는 경우 also를 사용한다.

fun main(args: Array<String>) {
    val user:User = User().also{
        it.name = "Choi"
    }.also {
        it.age = 28
    }.also {
        println("${it.name} ${it.age}")
    }
}

5. Run

run함수는 어떤 값을 계산할 필요가 있거나, 여러개의 지역 변수의 범위를 제한하기 위해 사용한다.
apply와 유사하나 apply는 객체를 생성함과 동시에 작업을 수행하고자 할때 사용하고, run은 이미 생성된 객체를 연속적으로 호출할 때 사용한다.

fun runTest() {
    val isAdd: Boolean =run{
				// 지역변수1
        val person1 = Person("park", "jieun")
        // 지역변수2
        val person2 = Person("park", "jieun")

        isAdd()
}

Assert.assertEquals(isAdd, true)

    fun test(person: Person) = person.run{
				// person을 수신객체로 변환하여 사용
        printPerson(lastName + firstName)
		}

		test(Person("park", "jieun"))
}

profile
러닝커브를 따라서 등반중입니다.

0개의 댓글