수업 중 표준 함수 부분에 대해 제대로 알지 못해 정리하기 위해 작성.
스코프 함수부터 정리.
표준 함수란?
Kotlin에서 보편적으로 사용되는 유틸리티 함수이며, 람다를 인자로 받아 작동 (람다에 관해선 따로 정리해둠)
스코프 된 함수, 조건 함수, 컬렉션 함수가 있음
Kotlin 표준 함수는 내부적으로 확장 함수이며, 확장 함수를 실행하는 주체를 수신자 또는 수신자 객체라고 한다.
확장 함수가 호출될 때 수신자 객체의 참조가 확장 함수로 전달된다.
스코프 된 함수
let, run, with, apply, also로 5개의 함수가 존재
이 5개의 함수는 기본적으로 같은 일을 한다. (객체에 붙어 있는 코드 블록을 실행)
5개의 함수의 차이점
1. 해당 객체를 어떻게 코드 블록 내에서 사용 가능하게 하느냐?
2. 전체 표현식의 결과가 무엇이냐?
작성법 예시
fun <T, R> T.run(block: T.() -> R): R {
return block()
}
fun <T, R> with(receiver: T, block: T.() -> R): R {
return receiver.block()
}
fun <T> T.apply(block: T.() -> Unit): T {
block()
return this
}
fun <T> T.also(block: (T) -> Unit): T {
block(this)
return this
}
fun<T, R> T.let(block: (T) -> R):R {
return block(this)
}
run
run 함수는 확장 함수 (람다 리시버를 받기 때문에 this로 사용 가능)
run 함수는 반환 결과가 람다의 결과
run 함수는 객체의 초기화와 리턴 값의 계산을 람다가 포함할 때 유용
확장 함수이기 때문에 널 안전 호출(?.)을 붙여 non-null 일 때만 실행 가능
주로 2가지 형태로 선언
어떤 값을 계산할 필요가 있거나 여러 개의 지역변수 범위를 제한할 때 사용
data class Person(var name: String, var age: Int)
//확장 함수의 역할로 받은 파라미터 값을 증가 시켜줬음. 즉, 람다의 결과를 반환
val person = Person("Lee", 25)
val ageNextYear = person.run {
++ age
}
객체를 생성하기 위한 명령문을 블록 안에 묶음으로써 가독성을 높일 때 사용
data class Person(var name: String, var age: Int)
//확장 함수가 아닌 형태. 가독성을 올려줌
val person = run {
val name ="James"
val age = 56
Person(name, age)
}
with
with 함수는 확장 함수가 아님
그러나 람다의 내부에는 확장 함수로 적용되어 this로 사용 가능.
data class Person(var name: String, var age: Int)
val person = Person("Lee", 25)
//with을 사용해 this 처럼 호출이 가능하다.
with(person) {
println(name)
println(age)
}
with 함수는 반환 결과가 람다의 결과
with 함수는 수신 객체는 non-nullable, 결과가 필요하지 않은 경우에 유용
apply
apply 함수는 확장 함수
apply 함수는 반환 결과가 객체 자기 자신
apply 함수는 객체의 초기화나 변경 시에 주로 사용
data class Person(var name: String, var age: Int)
//Person 객체의 값을 지정해줌. 자바의 Bullder
val person = Person("", 0)
val lee = person.apply {
name = "Lee"
age = 25
}
also
also 함수는 확장 함수
그러나, 코드 블록에서 this를 파라미터로 입력함으로 it를 사용해 프로퍼티에 접근
also 함수는 반환 결과가 객체 자기 자신
data class Person(var name: String, var age: Int)
//블럭 함수의 입력으로 람다 리시버를 받지 않고 this로 받음 따라서 it를 사용해 프로퍼티에 접근 가능
val person = Person("", 0)
val lee = person.also {
it.name = "Lee"
it.age = 25
}
also 함수는 객체의 데이터 유효성을 확인하거나, 디버그, 로깅 등의 부가적인 목적으로 사용할 때 적합
객체의 속성을 전혀 사용하지 않거나 변경하지 않고 사용하는 경우에 also 사용
val numbers = arrayListOf<String>("one", "two", "three")
numbers.also{
//유효성 검사
println("추가 하기 전 출력 값: $it")
}.add("four") //유효성 검사 후 출력
let
let 함수는 확장 함수
그러나, 코드 블록에서 this를 파라미터로 입력함으로 it을 사용해 프로퍼티에 접근
let 함수는 반환 결과가 람다의 결과
let 함수를 사용해 객체의 상태를 변경할 수 있다.
data class Person(var name: String, var age: Int)
val person = Person("", 0)
val leeIt = person.let {
it.name = "Lee"
it.age= 25
//(T) -> R 로 Person 객체에 해당하는 반환 값.
it
}
val leeStr = person.let {
it.name = "Lee"
it.age = 25
//String 을 반환 값으로 받음
"{${it.name} is ${it.age}}"
}
val leeUnit = person.let {
it.name ="Lee"
it.age= 25
//반환 값 없음
}
println(leeIt)
println(leeStr)
println(leeUnit)
let 함수는 블록 안에 non-null만 들어올 수 있어 널 안전 호출(.?) 시 유용하게 사용 가능하며 객체를 선언하는 상황일 경우 엘비스 연산자(?:)를 사용해서 기본 값 지정 가능
var str: String? = ""
str?.let {
println("str is not null")
}
스코프 함수의 Selection guide (코틀린 도큐먼트에서 제공)
참고 :
https://mycool0905.github.io/kotlin/2020/12/15/kotlin-scope-function.html
[Kotlin] 코틀린 표준 스코프 함수 정리
스코프 함수란?
mycool0905.github.io
https://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
'Kotlin' 카테고리의 다른 글
#Kotlin 스코프 함수 공식 문서 정리 (0) | 2022.11.09 |
---|---|
#Kotlin 수업 정리 2 (0) | 2022.11.08 |
#Kotlin 수업 정리 1 (0) | 2022.11.08 |