본문 바로가기
Kotlin

[코틀린] 리시버가있는 함수 리터럴, Function literals with receiver

by 붕어사랑 티스토리 2021. 12. 29.
반응형

공식문서 설명에 진짜 뭐같이 나와있어서 이해하기 참 힘든 부분이다.

 

진짜 안드로이드 진영은 초등학생도 이해하기 쉽도록 설명할 노력은 하나도 없는 모습이 참 밉상이다.

 

 

이 망할 Function literals with receiver 라는놈을 이해하고 싶은 분들을 위해 이 글을 바친다.

 

 

 

 

 

먼저 리터럴이라는 개념부터 이해하고 가자.

 

 

위키피디아에 설명은 아래와 같이 되어있다.

 

In computer science, a literal is a notation for representing a fixed value in source code

https://en.wikipedia.org/wiki/Literal_(computer_programming) 

 

아니 그래서 이게 뭔말인디요?

 

자 우리가 변수를 선언하고 값을 넣는다고 치자

 

int myVariable = 10;

 

여기서 myVariable은 변수다.

그리고 오른쪽에 있는 10은 리터럴이다.

 

그냥 이렇게 생각하면 편하다

우리가 변수선언할때 항상 보는 형태이다.

 

자료형 변수명 = 리터럴(값);

 

 

 

 

리터럴이란 그냥 값이다. 값 자체이다.

 

함수 리터럴이란 함수를 어떤 변수로 받았을 때 그 함수 내용 그 자체이다.

 

val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }

위 코드에서 함수 리터럴은 { x: Int, y: Int -> x + y } 요놈 자체가 되겠다.

 

 

 

코틀린 공식문서에는 이렇게 적혀있다.

 

Lambda expressions and anonymous functions are function literals. Function literals are functions that are not declared but are passed immediately as an expression. 

 

람다표현식익명함수는 함수리터럴이다.

함수리터럴은 객체로 선언이 안되어있지만 표현식을 통해 값으로 전달되는 함수이다.

 

그냥 머리아프니깐 위 예제로 이해하는게 편하다.

 

 

 

 

 

자 그러면 본격적으로 receiver가 있는 함수 리터럴이 뭔지 파악해보자

 

반응형

 

1. 형태

Function literals with receiver 라는놈의 형태는 다음과 같다.

A.(B) -> C

 

그리고 다음예제를 보자

fun main(){
    val sum = fun Int.(other: Int): Int = this + other
    var a = 10
    print(a.sum(5))   
}

 

결과 15

 

 

이게 어떻게 돌아가냐

 

위 예제에서 Function literals with receiver 의 형태는 다음과 같다

 

Int.(Int) -> Int

 

여기서 A자리는 Function literals with receiver의 사용 대상이될 리터럴의 자리이다.

B는 receiver 자리이다.

C는 리턴형 타입의 자리이다.

 

자 그리고 위 Function literals with receiver 을 sum 이라는 val로 받았다.

 

그럼 이 sum을 다음과 같이 함수로 쓸 수 있다.

 

a.sum(5)

 

 

고로 A.(B) -> C 라는 형태는

 

 

타입이 A인 자료형 뒤에 .함수리터럴(인풋) 이러한 형태로 사용이 가능하다는 뜻이다.

 

그래서 아래와 같은 형태가 나온것이다.

 

 

 

 

즉 위 예제에서 a는 Int형이다. A의 자료형과 매칭된다.

 

고로 a.sum(리시버) 이런 형태로 작성이 가능하다.

 

그리고 receiver 타입은 Int형이다.

 

a.sum(5)를 넣어줘 보자.

 

 

그럼 함수가 this+other를 리턴한다.

 

여기서 this는 a값을 의미한다.

other값은 5를 의미한다.

 

 

고로 결과값이 15가 되는것이다.

 

 

 

 

반응형

댓글