1. let

- 확장함수

- 호출한 객체를 블록의 인자로 넘기고 블록의 결과값을 반환함

- 인자로 넘긴 객체는 it 키워드를 통해 접근 가능

- 호출한 객체를 사용하여 다른 메소드를 실행하거나 연산을 수행하는 경우 사용 

 

 

<예제>

fun main() {
    var pLet : Person = Person("hannah", "female", "swim")
    
    var hobby : String = pLet.let {
        println("let01")
        printInfo(it);

        println("let02")
        it.hobby = "listen music"	//전달받은 객체의 프로퍼티 값 바꾸기
        printInfo(it)
        it.hobby	//맨 마지막 줄이 반환된다
    }

    println("let03")
    println(hobby);
}

private fun printInfo(p: Person) {
    println("let :: " +
            "\n    name -> ${p.name}" +
            "\n    hobby -> ${p.hobby}" +
            "\n    sex -> ${p.sex}"
            )
    }
}

<출력 결과>

let01
let :: 
    name -> hannah
    hobby -> swim
    sex -> female
let02
let :: 
    name -> hannah
    hobby -> listen music
    sex -> female
let03
listen music

 

- it을 통해 객체의 내용을 읽을 수 있고 수정도 가능함.

- 블록의 마지막 줄을 반환

- ?.와 함께 사용하면 if(pLet != null) 같은 검사용 코드를 대체 가능함

<예제>

fun main() {
    var pLet : Person? = null

    var hobby : String?

    hobby = pLet?.let {		//pLet이 null인 경우 실행되지 않는다
        println("let01")
        printInfo(it);
        it.hobby
    }

    println("let02")
    println(hobby);
}

<결과>

let02
null

 

- ?:와 사용 시 if(pLet != null) { ... } else { ... } 같은 검사용 코드를 대체 가능

<예제>

fun main() {
    var pLet : Person? = null

    var hobby : String?

    hobby = pLet?.let {
        println("let01")	//pLet이 null이라서 실행되지 않음
        printInfo(it);
        it.hobby
    } ?: "defaultValue"		//pLet이 null이므로 hobby에는 defaultValue가 할당

    println("let02")
    println(hobby);
}

<결과>

let02
defaultValue

2. run

- 확장함수 형태와 익명함수처럼 동작하는 형태 두가지가 있음

- 블록의 마지막 줄을 반환함

- 확장함수 형태로 사용 시 자신을 호출한 객체를 블록문 안에서 사용할 수 있으며, 이 때 this 키워드를 사용

<예제> - 일반함수 형태로 사용하는 경우

fun main() {
    var pRun01 : Person = Person("younghei", "female", "drawing")
    var runObject = run {
        println("run01-1")
        printInfo(pRun01)	//일반 함수로 구현했기 때문에 pRun01에 접근할 때 this 사용 불가

        println("run01-2")
        pRun01.hobby = "swim"
        printInfo(pRun01)
        pRun01	//블록의 마지막 줄 리턴
    }

    println("run01-3")
    println(runObject.hobby)
}

<결과>

run01-1
printInfo :: 
    name -> younghei
    hobby -> drawing
    sex -> female
run01-2
printInfo :: 
    name -> younghei
    hobby -> swim
    sex -> female
run01-3
swim

 

<예제> - 확장함수 형태로 사용하는 경우

var runObject = pRun01.run {
    println("run01-1")
    printInfo(this)		//확장함수로 사용하였기 때문에 this 키워드로 해당 객체 접근 가능

    println("run01-2")
    this.hobby = "swim"	//이 경우 this 키워드 생략 가능
    printInfo(this)
    this
}

println("run01-3")
println(runObject.hobby)

결과는 위와 동일!


공부하다보니 문득

'그렇다면 let과 run의 차이는 무엇일까?' 라는 생각이 들었다.

일단 보여지기로는 내부에서 객체를 참조할 때 it 키워드를 사용하느냐 this 키워드를 사용하느냐 정도인데..

 

일단 여기저기 물어본 결과..

let = "날 호출한 객체를 이용해서 뭘 할래!"

run = "날 호출한 객체에 뭘 할래!"

로 사용한다는 얘기를 들었다.

 

예시를 들어보면..

let = "사이다를 이용해서 에이드를 만들겠다!"

cider.let {
    makeAde(it)
}

run = "사이다에 레몬맛을 첨가하겠다!"

cider.run {
    flavor = lemon
}

이런 식인 걸까?

 

사용하는 곳이 명확하게 다르다고 들었으니

두 개를 나눈 이유가 있을 것 같은데

어째서일까....?

'개발 > Kotlin' 카테고리의 다른 글

코틀린 공부 - 함수 (4) with  (0) 2021.08.03
코틀린 공부 - 함수 (4) also, apply  (0) 2021.08.03
코틀린 공부 - 함수(3)  (0) 2021.08.02
코틀린 공부 - 함수(2)  (0) 2021.08.02
코틀린 공부 - 함수(1)  (0) 2021.08.02

+ Recent posts