본문 바로가기

Dev Book/Kotlin IN ACTION

CH5(5.5). 수신 객체 지정 람다

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