Hello, Android!

람다식 본문

Kotlin

람다식

lwndnjs93 2020. 2. 24. 16:17

람다식은 람다 대수에서 유래한 것으로 기본적으로는

{a: Int, b: Int -> a + b} 와 같은 형태이다

특징으로는 함수의 이름이 없고 -> 가 사용되었다

함수형 프로그래밍에서 람다식은 다른 함수로 인자를 넘기는 함수

함수의 결과값으로 반환하는 함수

변수에 저장하는 함수를 말한다

위와 같은 경우는 마지막인 변수에 저장하는 람다함수의 형식이다

변수 sum에 {num1: Int, num2: Int -> num1 + num2} 라는 람다식이 할당되어

변수 sum을 함수처럼 snum(4,5)와 같이 사용이 가능하다

지금같은 경우는 람다식을 통해 변수의 타입 추론이 가능하지만

직접적으로 타입을 명시하는 경우에는 

위와같이 람다식 내의 각각의 요소들에 대하여 전부 명시를 해야한다

var sum: (Int, Int) -> Int = {num1: Int, num2: Int -> num1 + num2} 를 분석해보면

var sum 은 일반적으로 변수를 선언하는 부분이다, 다만 람다식을 할당할 경우 함수명 처럼 사용을 한다

(Int, Int) -> Int 람다식의 자료형을 명시한다 이는 람다식에서 타입을 명시했다면 첫번째 예시처럼 생략이 가능하다

num1: Int, num2: Int 람다식의 매개변수이다 이는 변수 선언시 타입을 명시했다면 생략이 가능하다

num1 + num2 람다식의 처리내용이다 만약 반환 표현식이 여러 줄인 경우 마지막 표현식이 반환된다

간단하게 보면 람다식은 {매개변수 -> 처리내용} 의 모습이며, 처리내용이 여러줄인 경우 마지막 표현식이 반환된다

 

람다식의 매개변수

- 매개변수가 하나 또는 없는 람다식, 반환이 없는 람다식

람다식의 매개변수가 하나밖에 없을 경우에는 5번 줄과 같이 하나의 타입만 선언하면 되며

매개변수를 아예 안받는 경우에는 4번 줄 처럼 빈 소괄호만 적으면 된다

마지막으로 반환하는 값이 없는 람다식의 경우 Unit 이라고 명시하면 된다

 

매개변수가 없는 람다식을 매개변수로 받는 경우도 있다

위와 같은 경우는 onlyPrintLambda는 매개변수로 람다식을 받는데 

이 람다식은 매개변수는 없고 문자열을 반하는 람다식이다

그렇기 때문에 onlyPrintLambda를 호출할때 매개변수가 없기 때문에 -> 는 생략하고

반환 값(매개변수가 있다면 -> 의 오른쪽 내용)만 문자열로 넘겨주게 된다

그리고 위와 같은 경우 () 는 생략할수 있다

 

이번에는 한개의 매개변수와 한개의 반환 값이 있는 람다식이다

onlyPrint함수 호출시 괄호() 는 생략이 가능하며, 매개변수가 존재하기 때문에 -> 화살표가 존재하고

왼쪽에 매개변수를 명시해야한다

4,5번 줄에서는 람다식의 매개변수를 s로 받아 활용을 하였다

세번째 호출에서는 화살표를 생략하고 $it 이라고 하였는데

람다식의 매개변수가 하나밖에 없는 경우에는 화살표를 생략하고 $it 으로 사용이 가능하다

 

이번에는 두개의 매개변수와 한개의 반환 값이 존재하는 경우 이다

이번에는 it 을 사용하여 생략을 할 수 없다

다만 특정 매개변수를 생략하고싶은 경우는 _ 를 사용하여 생략이 가능하다

생략을 하더라도 매개변수의 갯수와 반환 값을 다 맞춰야 한다

물론 매개변수 두개 다 _ 를 사용하여 생략이 가능하다

매개변수에 람다식과 일반적인 매개변수가 혼재하는 경우가 있을수도 있다

이번에는 onlyPrint함수에서 문자열 두개와 람다식 하나를 매개변수로 받고 있다

이러한 경우 onlyPrint호출시 괄호 () 안에 문자열 두개와 람다식을 같이 넣어주는것도 가능하고

문자열만 () 안에 넣고 람다식은 그 뒤에 별도로 넘겨주는것도 가능하다

하지만 함수 선언시 람다식을 먼저 선언한 다음 일반 매개변수를 선언하면

함수 호출시 괄호를 분리하여 넘겨주는것이 불가능 하기때문에

함수 선언시 람다식은 가장 마지막에 적어주는것이 좋을것 같다

 

마지막으로 두개의 람다식을 매개변수로 받는 경우이다

당연히 함수 호출시 두개의 람다식을 인자로 넘겨주면 된다

다만 함수 호출 괄호 안에 두개의 람다식을 같이 넣어도 되고 일반 매개변수에서 처럼

괄호를 분리하는것도 가능하다

괄호를 분리하는 경우 앞의 인자만 괄호 안에 넣어주고 나머지 인자는 그 뒤에 적어준다

여러개의 람다식을 매개변수로 받을때도 람다식의 매개변수가 하나만 있는 경우 it으로 사용이 가능하다

'Kotlin' 카테고리의 다른 글

고차함수를 호출하는 방법  (0) 2020.02.24
고차함수  (0) 2020.02.24
함수형 프로그래밍  (0) 2020.02.24
함수의 매개변수  (0) 2020.02.23
코틀린의 연산자  (0) 2020.02.23