ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kotlin in Action: 5.5 수신 객체 지정 람다 : with와 apply
    Book/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 인스턴스를 반환한다. 그 인스턴스는 함수의 결과가 된다.

     

     

Designed by Tistory.