[코틀린기초] 11. 코틀린 표준함수 also()

함수를 호출하는 객체 T를 이어지는 block에 전달하고 객체 T자체를 반환한다.

also는 블록 안의 코드 수행 결과와 상관없이 T인 바로 객체 this를 반환

let함수와 비교해보자.


public inline fun <T,R> T.let(block: (T) -> R) : R = block(this)

public inline fun <T> T.also(block: (T) -> Unit) T{block(this); return this}

간단한 사용 예


var m = 1

m = m.also{it+3}
println(m)  // 원본 값인 1이 출력됨

fun main(){
  data class Person(var name:String, var skills:String)
  var person = Person("Kildong","Kotlin")
  
  val a = person.let{
      it.skills = "Android"
      "success" // 마지막 문장을 결과로 반환
  }
  
  println(person)
  println("a: $a")  // success가 출력됨
  
  val b = person.also{
    it.skills = "JAVA" // it은 객체의 참조를 복사해 오므로 멤버 변경 가능
    "success" // 사용되지 않음
  }
  
  println(person)
  println("b: $b")  //success 대신에 person 객체가 출력됨
  
}

특정 단위의 동작 분리

디렉터리 생성 활용

fun makeDir(path:String):File{
  val result = File(path)
  result.mkdirs()
  return result
}

위의 함수를 let과 also로 다음과 같이 개선할 수 있다.

fun makeDir(path: String) = path.let{File(it)}.also{it.mkdirs()}

//이때 반환되는 값은 File(it)의 수행 결과이다.