1. with 함수
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())
ABCDE....XYZ
Now I know the alphabet!
위의 예제에서는 result에 대해 다른 여러 메소드를 호출하면서 매번 result를 반복 사용했다. 이 예제를 with로 다시 작성한 결과는 다음과 같다.
fun alphabet(): String {
val stringBuilder = StringBuilder()
return with(stringBuilder){
for(letter in 'A'..'Z'){
this.append(letter)
}
append("\nNow I know the alphabet!")
this.toString()
}
}
with문은 파라미터가 2개있는 함수이다. 여기서 첫번째 파라미터는 stringBuilder이고, 두번째 파라미터는 람다다. 람다를 괄호밖으로 빼내는 관례를 사용한 것이다.
- with 함수는 첫번째 인자로 받은 객체를 두번째 인자로 받은 람다의 수신 객체로 만든다. 인자로 받은 람다 본문에서는 this를 사용하거나 append("\nNow...")처럼 바로 그 수신 객체에 접근할 수 있다.
fun alphabet(): with (stringBuilder()) {
for(letter in 'A'..'Z'){
this.append(letter)
}
append("\nNow I know the alphabet!")
toString()
}
다음과 같이 불필요한 stringBuilder 변수를 없애면 alphabet 함수의 식의 결과를 바로 반환하게 된다. 따라서 식을 본문으로 하는 함수로 표현할 수 있다.
2. apply 함수
- apply 함수는 거의 with와 비슷하다. 유일한 차이란 apply는 항상 자신에게 전달된 객체(수신객체)를 반환한다는 점 뿐이다.
fun alphabet() = StringBuilder().apply {
for (letter in 'A'..'Z') {
append(letter)
}
append("\nNow I know the alphabet!")
}.toString()
apply는 확장함수로 정의돼 있다. apply의 수신 객체가 전달받은 람다의 수신 객체가 된다.
- apply 함수는 객체의 인스턴스를 만들면서 즉시 프로퍼티 중 일부를 초기화해야 하는 경우 유용하다.
fun createViewWithCustomAttributes(context:Context) =
TextView(context).apply{
text = "Sample Text"
textSize = 20.0
setPadding(10,0,0,0)
}
apply 함수를 사용하면 함수의 본문에 간결한 식을 사용할 수 있다.
'Dev Book > Kotlin IN ACTION' 카테고리의 다른 글
CH6(6.1-2). 널 가능성 (0) | 2022.01.20 |
---|---|
CH6(6.1-1). 널 가능성 (0) | 2022.01.16 |
CH5(5.3). 지연 계산 컬렉션 연산 (0) | 2022.01.02 |
CH5(5.2). 컬렉션 함수형 API (0) | 2021.12.24 |
CH5(5.1). 람다 식과 멤버 참조 (0) | 2021.12.05 |