with 함수와 apply 함수는 수식 객체를 명시하지 않고 람다의 본문 안에서 다른 객체의 메서드를 호출할 수 있게 한다. 그런 람다를 수신 객체 지정 람다 lambda with receiver 라 부른다.
with 함수
표준 라이브러리의 with 함수를 사용하면 어떤 객체에 대한 참조를 반복해서 언급하지 않으면서 그 객체의 메서드를 호출할 수 있다.
EX. 알파벳 만들기
fun alphabet() : String {
val result = StringBuilder()
for (letter in 'A'..'Z') {
result.append(letter)
}
result.append("\\nNow I know the alphabet!")
return result.toString()
}
println(alphabet())
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Now I know the alphabet!
- result 에 대해 다른 여러 메서드를 호출하며 result 를 반복 사용
EX. with를 사용해 알파벳 만들기
fun alphabet() : String {
val stringBuilder = StringBuilder()
return with(stringBuilder) { // 메서드를 호출하려는 수신 객체 지정
for (letter in 'A'..'Z') {
this.append(letter) // this를 명시해 앞에서 지정한 객체의 메서드를 호출
}
append("\\nNow I know the alphabet!") // this 생략, 메서드 호출
this.toString() // 람다에서 값 반환
}
}
- with 함수의 첫 번째 파라미터에 stringBuilder, 두 번째 파라미터 람다
- with 함수는 첫 번째 인자로 받은 객체를 두 번째 인자로 받은 람다의 수신 객체로 만들며, 이는 this 를 통해 접근
with문은 언어가 제공하는 특별한 구문처럼 보이지만, 파라미터가 2개 있는 함수이다. 람다를 괄호 밖으로 빼내는 관례를 사용함에 따라 특별한 구문처럼 보인다.
EX. with와 식을 본문으로 하는 함수를 활용해 알파벳 만들기
fun alphabet() : String = with(StringBuilder()) {
for (letter in 'A'..'Z') {
append(letter)
}
append("\\nNow I know the alphabet!")
this.toString()
}
- StringBuilder 변수를 없애면 alphabet 함수가 식의 결과를 바로 반환하게 된다.
apply 함수
apply 함수는 항상 자신에게 전달된 객체 (수신 객체)를 반환한다. apply함수를 사용하면 어떤 객체라도 빌더 스타일의 API를 사용해 생성하고 초기화할 수 있다. apply 함수는 객체의 인스턴스를 만들면서 즉시 프로퍼티 중 일부를 초기화해야 하는 경우 유용하다.
EX. apply를 사용해 알파벳 만들기
fun alphabet() = StringBuilder().apply {
for (letter in 'A'..'Z') {
append(letter)
}
append("\\nNow I know the alphabet!")
}.toString()
println(alphabet())
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Now I know the alphabet!
- apply는 확장 함수로 정의돼 있음
- apply의 수신 객체가 전달받은 람다의 수신 객체
EX. apply를 TextView 초기화에 사용하기
fun createViewWithCustomAttributes(context: Context) =
TextView(context).apply {
text = "Sample Text"
textSize = 20.0
setPadding(10, 0, 0, 0)
}
- 새로운 TextView 인스턴스를 만들고 즉시 그 인스턴스를 apply에 넘긴다.
- 람다 본문 안에서 수신 객체가 된 TextView의 메서드를 호출하거나 프로퍼티를 설정
EX. buildString으로 알파벳 만들기
fun alphabet() = buildString {
for (letter in 'A'..'Z') {
append(letter)
}
append("\\nNow I know the alphabet!")
}
- buildString 함수는 StringBuilder 객체를 만드는 일과 toString 호출을 자동으로 해준다.
- 수신 객체는 항상 StringBuilder 이다.
- StringBuilder를 활용해 String을 만드는 경우 사용
728x90
'Kotlin' 카테고리의 다른 글
Coroutine (0) | 2024.02.13 |
---|---|
변수와 상수 (0) | 2023.11.02 |
자바 함수형 인터페이스 활용 (0) | 2023.09.07 |
지연 계산 Lazy 컬렉션 연산 (0) | 2023.09.06 |
컬렉션 함수형 API (0) | 2023.09.05 |