코딩하는 개굴이

[Kotlin] let, apply, run, with, also 본문

안드로이드/KOTLIN

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

개굴이모자 2021. 3. 1. 17:53
반응형

코틀린의 확장 함수들

kotlin 은 확장함수들을 제공하여 객체를 사용 시 명령문들을 블록으로 묶어 간결하게 사용할 수 있게 해준다.

let

매개 변수화 된 타입 T의 확장함수로, 자기 자신을 받아서 반환하는 람다 식의 형태이다.

  • let 함수를 사용하여 해당 객체의 상태를 변경할 수 있다.
  • ?.let {} 형태에서 let 블럭 안에는 non-null 만 들어올 수 있기 때문에 not-null 체크에 사용할 수 있다.
    • elvis operator 를 사용해서 기본 값을 지정할 수 있다.
  • 반환하는 값이 명시적으로 없을 경우, Unit 타입을 반환한다.
val introducePerson = person.let {
    it.name = "Gaegul"
    it.height = 158
    it
} //Return 으로 본인을 반환

val introduceString = person.let {
    it.name = "Doraemon"
    it.height = 129
    "{$name is $height tall}
}

val teacherName = person?.let {it.name} ?: "Tom"

let 을 이용한 null 체크

invoke 자기 자신을 호출 해 주는 역할

null 이 아닐때

var nullable = null
var result = nullable?.let {
    //null 이 아닐 때 실행 코드
}

result = nullable ?: "null" //null 일 경우 "null"을 할당

//확장함수가 아닌 일반함수 형태
nullable ?: {
    // null 일 때 실행 코드
} ()

nullable ?: {
    //null 일 때 실행 코드
}.invoke()

nullable ?: fun () {
    //null 일 때 실행 코드
}()

nullable ?: fun () {
    //null 일 때 실행 코드
}.invoke()

//가독성을 위해 주로 사용
nullable ?: run {
    //null 일 때 실행 코드
}

// 일반 함수형이 아니므로 주로 아래 것을 사용하는 것이 좋음
result = nullable?.let {
    // null 이 아닌 경우
} ?: run {
    // null인 경우
}

with

with 는 일반 함수로 객체 receive를 직접 입력받고, 객체를 사용하기 위한 두번째 블럭 {}에서는 객체 recieve를 입력받은 것에 대해서 this를 사용하지 않고 쓸 수 있다.

  • 반환하는 값이 명시적으로 없을 경우, Unit 타입을 반환한다.
val person = Person("Gaegul", 158)
with(person) {
    println(name)
    println(height)
    //this를 사용한다. (it 이 아님)
}

run

  • with 과는 달리 일반 함수가 아니라 확장함수의 형태이다.
    확장함수이기 때문에 safecall (.?)을 붙여 non-null 일 때만 실행 가능하며, 계산 혹은 지역변수 범위를 제한할 때 사용한다.
  • 반환하는 값이 명시적으로 없을 경우, Unit 타입을 반환한다.
val fullName = person.run {
    name = name + "2moja"
}
  • 확장함수가 아니고 블럭에 입력값이 없는 형태로 객체를 생성하기 위한 명령문을 블럭 안에 묶어 가독성을 높일때 사용한다.
  • 반환하는 값이 명시적으로 없을 경우, Unit 타입을 반환한다.
val person = run {
    val name = "Gaegul2moja"
    val height = 158
    Person(name, height)
}

apply

  • 확장함수로 블럭 함수의 입력을 람다의 리시버로 받아, 호출 시 it 이나 this 를 사용할 필요가 없다.
  • run 과 유사하지만 return 값을 받지 않으며 무조건 자기 자신을 반환한다.
val person = Person("", 0)
val resultPerson = person.apply {
    name = "Gaegul2moja"
    height = 158
}

also

  • 확장함수이다.
  • 블럭함수의 입력으로 T를 받아, it을 사용해 프로퍼티에 접근한다.
    • 객체의 속성을 전혀 사용하지 않거나 변경하지 않는 경우 사용한다.
  • run 과 유사하지만 return 값을 받지 않으며 무조건 자기 자신을 반환한다.
val persons = arrayListOf("G", "A", "E", "Gul")
persons
    .also {println("add 하기 전에 데이터 확인print : $it")}
    .add("2moja")

참고 링크

반응형
Comments