본문 바로가기

공부/코틀린

[Kotlin] let, with, run, apply, also 차이

반응형

blog.yena.io/studynote/2020/04/15/Kotlin-Scope-Functions.html

 

[Kotlin] 코틀린 let, with, run, apply, also 차이 비교 정리

let, with, run, apply, also 코틀린에는 이렇게 생긴 확장함수들이 있다. 객체를 사용할 때 명령문들을 블럭{} 으로 묶어서 간결하게 사용할 수 있게 해주는 함수들이다. 문제는 서로 비슷비슷해서 헷

blog.yena.io

 

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