kotlin 표준 함수

구태훈·2020년 6월 13일

kotlin

목록 보기
1/5

Kotlin 표준함수인 apply, let , run, with, also, takeIf의 정의와 사용예를 기술한다.

apply

apply 함수는 객체에 method들을 호출 하고, 그 객체를 return 한다.

val menuFile = File("menu-file.txt").apply {
	setReadable(true) // lambda 밖에서 menuFile.setReadable(true)와 동일하다.
    setWritable(true)
}

let

labmda를 실행하고, 마지막줄의 실행 결과를 return 한다.

val firstElement = listOf(1,2,3).first()
val firstElementSquared = firstElement * firstElement

위와 같은 함수를 let을 통해 축약 할 수 있다.
: firstElement 변수까지 생략 하여 더 간결하게 작성 할 수 있다.

val firstElementSquared = listOf(1,2,3).first().let { it * it }

let vs apply

apply는 인자가 없고, let은 Object를 인자로 전달한다.
apply는 Object를 return 하고, let은 마지막 줄의 실행 결과를 return 한다.

let을 사용하여 nullable 처리 하기

var vipGuest:String? = null
vipGuest?.let { "VIP 고객님 안녕하세요" } ?: "고객님 안녕하세요"

vipGuest.let { "고객님 안녕하세요" } 하게 되면 "고객님 안녕하세요"가 return 된다.

run

run은 apply와 동일하지만, 수신된 객체를 반환하지 않고 결과를 반환 한다.
그리고 run은 함수를 인자로 받아 실행 할 수 있는데 이를 통해 함수 연쇄 호출을 가독성이 높게 작성 할 수 있다.

println(functionA(functionB(someString)))
someString
  .run(::functionA)
  .run(::functionB)
  .run(::println)
  • run 을 사용하는 편이 가독성이 좋다.
val stastus = run {
	true
}
  • run은 Object없이도 호출가능한데, 실제로 쓸 필요는 없을 것 같다.

with

val result = with(someString) {
	// some statement 
}

with는 run와 동일하지만, 첫번째 인자가 lambda가 아니라, object이다.
run과 문법만 좀 다른 것인데 같은 일을 하는 것이니 run을 사용하는 것을 추천한다.

also

also는 let과 동일하지만, 마지막 statement의 결과 대신 objet를 return 한다.

takeif

takeif는 labda function 에서는 boolean을 return 하고 boolean이 true일때는 object, false 일때는 null이 전달 된다.

if (obj.isTrue() {
// statement
} 

take if를 사용하면 간결하게 표기 할 수 있다.

obj.takeif({ it.isTrue()})?.run(:println)

takeunless

takeif와 유사한녀석으로 그와 달리 labmda 결과가 false일때 object가 return 된다.

obj.takeif({ it.isFalse() })?.run(:println)

호기심 해결 : labmda의 return

fun a(obj: MyObject) {
  if (a.isNotValid()) {
      return
  }
}

위와 같은 코드를 작성하는데 takeIf를 이용해서 lambda 같은 코드를 작성 할 수 있을까?

fun a(obj: MyObject) {
	a.takeif { it.isNotValid() }?.run { return }
}

동일 하게 동작한다.

profile
사업가를 꿈꾸는 소프트웨어 개발자.

0개의 댓글