728x90
반응형

람다식(Lambda Expression)

 

람다식은 함수의 이름과 return 값이 없는 익명 함수이다.

무슨 소리냐? 코드로 한 번 보자.

두 숫자를 파라미터로 받아 더한 값을 return 하는 함수를 만들어보자.

 

fun sum1(x:Int,y:Int):Int = x+y

fun main(){
	sum1(1,2)
}

 

보통 이런식이다. 함수를 만든다 → 함수를 호출하여 객체에 담는다. 이 과정을 줄일 수 없을까하는 생각에서 람다식이 등장한다. 한 번 살펴보자.

 

fun main(){
	val sum2 = {x:Int,y:Int -> x+y}
	sum2(1,2)
}

 

x:Int, y:Int 는 파라미터와 타입, x+y은 본문이다. x, y가 각각 1, 2 라면 x+y 3이고 sum2 는 3이 되는 거지!

가독성 면에서나 함수를 따로 만들지 않아도 된다는 점에서 장점이 있다.

더하기 함수 말고 다른 함수로 람다식이 변할 수 있는지 살펴보자!

 

val people = listOf<Person>(Person("김철수",22),Person("박철수",33))

 

Person이라는 이름과 나이를 저장하는 데이터 클래스를 만들고 person 이라는 리스트에 각각 담았다. 데이터 클래스는 생략이다… 이 람다식 배울 때면 알아서 할 수 있으리라 믿는다.

자 이 리스트에서 가장 나이가 많은 사람을 골라내보자. 반복문을 돌려도 되지만 람다식을 활용하여 라이브러리 함수를 사용하겠다!

 

people.maxBy ({ p:Person -> p.age })

 

자 앞에서 봤던 철저하게 원칙을 지킨 람다 함수이다. 조금 더 줄여볼까?

 

people.maxBy (){ p:Person -> p.age}

 

줄였다기보다는 () 괄호에서 빼냈네… 관례 상 맨 뒤의 파라미터가 람다식이면 괄호 밖으로 뺄 수 있다.

조금만 더 줄여보자.

 

people.maxBy { p:Person -> p.age}

 

줄긴 줄었는데…? 별로 티도 나지 않네… 정답은 ()가 없어졌다.

maxBy() 처럼 파라미터가 하나이고 그 하나가 람다식이다? 그럼 생략 가능하다.

아 뭔가 아쉽다. 줄긴 줄었는데 뭐를 싸다가 끊긴 느낌…? 조금만 더 해보자.

 

people.maxBy{ p-> p.age}

 

자 자바와 달리 코틀린의 장점 중에서 컴파일러가 타입을 유추할 수 있으면 생략 가능하다고 했었다.

people이 Person 타입의 객체가 들어있는 컬렉션인건 너도 알고 있잖아? 근데 나보다 똑똑한 컴파일러가 모르겠냐구…

자 진짜 마지막이다. 한 번 더 줄여보자.

 

people.maxBy{ it.age}

 

?? 급발진인가?? ㅋㅋ 어쨌던 짧아졌다…

람다식의 파라미터가 하나이고(여기선 p) 컴파일러가 타입을 유추할 수 있을 때 “it” 이라는 키워드를 사용할 수 있다.

자 과정이 좀 길었다… 이렇게까지 길게 할 부분인가 싶긴 한데 내가 안드로이드 처음 할 때 저게 어떻게 저렇게 되는지 이해를 못했거든.. ㅎ

 

최종 정리

 

정통 람다식

people.maxBy ({ p:Person -> p.age })

야매? 줄인 람다식

people.maxBy{ it.age}

둘은 같은 표현이다!!

코틀린을 사용하면 밑에 표현을 많이 접하게 될 것이다! 잘 봐둬라!!

728x90
반응형

+ Recent posts