blog.yena.io/studynote/2020/04/15/Kotlin-Scope-Functions.html
let, with, run, apply, also 차이
1. let :
확장 함수
T?.let{작업}
T가 null이 아닐 경우 처리할 작업을 수행 -> 내부의 T는 non-null로 처리
리턴값은 작업의 마지막 부분 R
예) node?.left?.let{dfs(node.left}} ; node?.right?.left{dfs(node.right)}
node.left가 존재할 경우 dfs(left) 호출
node.right가 존재할 경우 dfs(right) 호출
2. with :
일반 함수
with(T){작업}
작업 부분은 T의 리시버 함수기 때문에, with 내에서는 T의 멤버 변수를 호출할 수 있음.
작업의 마지막에 있는 타입 반환
예) var newPerson = with(person) {name = "haha"; age = 123; person}
3. run
두가지 종류
3-1) run 확장함수
T.run {작업}
작업 부분은 T의 리시버 함수이기 때문에 멤버 변수 접근 가능. 리턴값으로는 작업의 마지막에 있는 타입 반환
with와의 차이: 확장 함수와 일반 함수의 차이
예) var nextAge= person.run{age++}
let과의 차이 : let은 T의 리시버 함수는 아니기 때문에 it.age++로 처리해야함
var nextAge = person.let{it.age++}
3-2) run 일반 함수
run {작업}
작업 부분은 어떠한 인자도 받지 않기 때문에 it같은 것을 사용할 수 없음.
작업 마지막 부분의 타입을 반환
예) var resString = run{println("haha"); println("hoho"); "result is this"} -> "result is this" 반환
4. apply
확장 함수
T.apply{작업}
작업 부분은 T의 리시버 함수이기 때문에 멤버 변수 접근 가능. 리턴값은 자기 자신 T
예) var newPerson = person.apply{name = "haha", age=123} : 리턴값은 person
5. also
확장 함수
T.also{작업}
작업 부분은 일반 함수이고 일반함수에는 T를 인자로 넘기기 때문에 it을통해 작업에서 접근 가능
apply와의 차이: 리시버 함수 vs 일반 함수(인자로 자기 자신)
예) 예) var newPerson = person.also{it.name = "haha", it.age=123} : 리턴값은 person
'공부 > 코틀린' 카테고리의 다른 글
[Kotlin] 파일 입출력 방법 (0) | 2021.05.02 |
---|---|
[Kotlin] PriorityQueue, sortWith 사용법 (Comparator 사용) (0) | 2021.04.26 |
[Kotlin] 상속과 위임 (0) | 2021.04.26 |