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 |