-
Kotlin in Action: 5.5 수신 객체 지정 람다 : with와 applyBook/Kotlin in Action 2022. 11. 18. 09:21
코틀린 람다에서는 수신 객체를 명시하지 않고 람다의 본문 안에서 다른 객체의 메소드를 호출할 수 있게 해주는 지정 람다 기능이 있다.
1. with 함수
코틀린 에서는 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 함수는 첫 번째 인자로 받은 객체를 두 번째 인자로 받은 람다의 수신 객체로 만든다. 인자로 받은 람다 본문에서는 this를 사용해 그 수신 객체에 접근할 수 있다. 일반적인 this와 마찬가지로 this와 점을 사용하지 않고 프로퍼티나 메소드 이름만 사용해도 수신 객체의 멤버에 접근할 수 있다.
StirngBuilder 메소드를 this.append(letter)처럼 this 참조를 통해 접근하거나 append("\nNow...") 처럼 바로 호출할 수 있다.
또한 위의 코드에서 불필요한 변수를 없앨 수도 있다. 변후슬 없애면 alphabet함수가 식의 결과를 바로 반환하게 된다. 따라서 식을 본문으로하는 함수로 표현할 수 있다. StringBuiltder의 인스턴스를 만들고 즉시 with에게 인자로 넘기고, 람다안에서 this를 사용해 그 인스턴스를 참조한다.
fun alphabet() = with(StringBuilder()) { for (letter in 'A'..'Z') { append(letter) } append("\nNow I know the alphabet!") toString() }
더보기함수 안에서 this는 그 함수가 확장하는 타입의 인스턴스를 가리킨다. 그리고 그 수신 객체 this의 멤버를 호출할 때는 this.를 생략할 수 있다.
어떤 의미에서는 확장 함수를 수신 객체 지정 함수라 할 수도 있다.
더보기with에게 인자로 넘긴 객체의 클래스와 with를 사용하는 코드가 들어있는 클래스 안에 이름이 같은 메소드가 있다면 this 참조 앞에 레이블을 붙이면 호출하고 싶은 메소드를 명확하게 정할 수 있다.
this@OuterClass.toString()
with가 반호나하는 값은 람다 코드를 실행한 결과며, 그 결과는 람다 식의 본문에 있는 마지막 식의 값이다.
하지만 때로는 람다의 결과 대신 수신 객체가 필요한 경우도 있다. 그럴 때는 appply라이브러리 함수를 사용할 수 있다.
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에 전달된 람다 안에서는 TextView가 수신 객체가 된다. 따라서 원하는 대로 TextView의 메소드를 호출하거나 TextView 인스턴스를 반환한다. 그 인스턴스는 함수의 결과가 된다.
'Book > Kotlin in Action' 카테고리의 다른 글
Kotlin in Action: 6.2 코틀린의 원시 타입 (0) 2022.11.25 Kotlin in Action: 6장 코틀린 타입 시스템: 6.1 Nullable(널 가능성) (0) 2022.11.24 Kotlin in Action: 5.4 자바 함수형 인터페이스 활용 (0) 2022.11.18 Kotlin in Action: 5.3 지연계산(lazy) 컬렉션 연산 (0) 2022.11.18 Kotlin in Action: 5.2 컬렉션 함수형 API (0) 2022.11.17