코틀린의 표준 라이브러리에는 객체의 컨텍스트 내에서 코드 블록을 실행하기 위해서만 존재하는 몇 가지 함수가 포함되어 있는데 이를 스코프 함수라고 부른다.
스코프 함수를 제대로 사용하면 불필요한 변수 선언이 없어지며 코드를 더 간결하고 읽기 쉽게 만든다.
스코프 함수의 코드 블록 내부에서는 변수명을 사용하지 않고도 객체에 접근할 수 있는데 그 이유는 수신자 객체에 접근할 수 있기 때문이다.
수신자 객체는 람다식 내부에서 사용할 수 있는 객체의 참조이다.
스코프 함수를 사용하면 수신자 객체에 대한 참조로 this 또한 it를 사용한다.
스코프 함수 선택 방법
코틀린은 총 5 개의 유용한 스코프 함수를 제공하며 각 스코프 함수들은 본질적으로 유사한 기능을 제공하는데 각각 어떻게 따른지 살펴보자.
스코프 함수 선택표
함수명
수신자 객체 참조 방법
반환 값
확장 함수 여부
let
it
함수의 결과
O
run
this
함수의 결과
O
with
this
함수의 결과
X
apply
this
컨텍스트 객체
O
also
it
컨텍스트 객체
O
let
null이 아닌 경우 사용될 로직을 작성하고 새로운 결과를 반환하고 싶을 때 사용할 수 있다.
fun main() {
val str: String? = null
str?.let {
println(it)
}
// 아무것도 출력되지 않음
}
null이 아닌 경우 실행
fun main() {
val str: String? = "안녕"
str?.let {
println(it)
}
// 안녕
}
함수의 결과를 반환 (let 함수 내부의 마지막 코드가 결과로 반환)
fun main() {
val str: String? = "안녕"
val result = str?.let {
println(it)
1234 // let 함수 마지막 코드가 결과로 반환
}
println(result)
// 안녕
// 1234
}
let을 쓸때 호출이 중첩되면 코드가 복잡해지므로 이런 경우엔 if를 사용하는 편이 낫다.
val str: String? = "안녕"
val result = str?.let {
println(it)
val abc : String? = "abc"
abc?.let {
val def : String? = "def"
def?.let {
println("abcdef null ")
}
}
1234
}
println(result)
if 식으로 변경
val str: String? = "안녕"
val result = str?.let {
println(it)
val abc : String? = "abc"
val def : String? = "def"
if (!abc.isNullOrEmpty() && !def.isNullOrEmpty()) {
println("abcdef null ")
}
1234
}
println(result)
run
수신 객체의 프로퍼티를 구성하거나 새로운 결과를 반환하고 싶을 때 사용할 수 있다.
class DatabaseClient {
var url: String? = null
var username: String? = null
var password: String? = null
// DB에 접속하고 Boolean 결과를 반환
fun connect(): Boolean {
println("DB 접속 중 ...")
Thread.sleep(1000)
println("DB 접속 완료")
return true
}
}
fun main() {
val config = DatabaseClient()
config.url = "localhost:3306"
config.username = "mysql"
config.password = "1234"
val connected = config.connect()
println(connected)
}
// DB 접속 중 ...
// DB 접속 완료
// true
run을 사용
class DatabaseClient {
var url: String? = null
var username: String? = null
var password: String? = null
// DB에 접속하고 Boolean 결과를 반환
fun connect(): Boolean {
println("DB 접속 중 ...")
Thread.sleep(1000)
println("DB 접속 완료")
return true
}
}
fun main() {
val connected = DatabaseClient().run {
url = "localhost:3306"
username = "mysql"
password = "1234"
connect()
}
println(connected)
}
스코프 함수
스코프 함수란
스코프 함수
라고 부른다.변수명을 사용하지 않고도
객체에 접근할 수 있는데 그 이유는 수신자 객체에 접근할 수 있기 때문이다.this
또한it
를 사용한다.스코프 함수 선택 방법
let
run
with
apply
also
스코프 함수 사용 시 유의할 점