람다는 함수에 인자로 전달하거나 변수에 저장할 수 있는 작은 코드 블록을 말한다. 간략한 형태의 함수라고 볼 수 있다. 매개 변수부와 코드 본문으로 구성되어 있으며, '->'로 둘이 구분된다

val sumLambda = { p1: Type1, p2: Type2 -> p1 + p2 }

 

개발을 하다 보면 이벤트에 대한 핸들러를 등록하거나, 리스트의 모든 원소에 동일한 연산을 적용하기 위해 동작을 함수에 전달하거나 변수에 저장하는 과정이 요구되는데, 이럴 때 람다를 사용한다. 

 

그렇다면 람다는 어떤 점이 특별한 걸까?

 

자바에서는 함수에 코드 블록을 전달하기 위해 익명 객체를 사용한다.

button.setOnClickListener(new OnClickListener() {
	@Override
	public void onClick(View view) {
    	/* 버튼 클릭시 수행할 동작 */
	}
});

하지만 onClick에 정의된 동작을 전달하기 위해 익명 객체를 선언하고 함수를 오버라이딩 해야 하는 등 과정이 번거롭다는 것이 단점이다.

 

코틀린은 이런 번거로움을 함수형 언어처럼 함수를 값으로 다룸으로써 개선했다. 함수 자체를 값처럼 인자로 전달하거나 변수에 저장하는 것이 가능해진 것이다. 여기에 람다를 사용하면, 함수를 정의하지 않고 코드 블록만 넘기는 것이 가능하여 코드가 더욱 간결해진다.

button.setOnClickListener { /* 버튼 클릭 시 수행할 동작 */ }

첫 번째 코드와 같은 동작을 수행하지만 코드가 훨씬 짧아졌다. 참고로, 오버라이딩 해야하는 메서드가 하나인 익명 객체는 모두 람다로 대체할 수 있다.

 

 

그리고 람다는 코틀린의 Collections 라이브러리에서 많이 활용되고 있다. 람다 덕분에 라이브러리에서 컬렉션에 자주 사용되는 기능을 쉽게 제공하는 것이 가능해졌다. 모든 원소에 동일하게 적용할 동작을 람다로 손쉽게 전달할 수 있기 때문이다.

 

예를 들어, 리스트에서 최대 값을 찾고 싶을 때, 자바에서 람다가 나오기 전에는 직접 max 변수를 선언하고 for문을 돌며 찾아야 했다. 하지만 지금은 함수 타입을 인자로 받는 컬렉션 라이브러리 함수를 호출하여 간단하게 해결할 수 있다.

println(people.maxBy { it.age }) // 가장 age가 큰 Person 객체를 출력한다
// 무엇을 기준으로 최대 값을 찾을지를 리턴하는 람다를 전달한다.

코틀린 컬렉션 라이브러리에서는 이런 편한 기능을 정말 많이 제공하고 있다. 덕분에 시간을 아끼면서 간결하고 가독성 좋은 코딩을 할 수 있다.

 

결론: 람다를 사용하면 코드 블록을 함수의 인자로 전달하거나 변수에 저장하는 일을 쉽고 간결하게 할 수 있다.

 

참조

도서 - Kotlin In Action (5장)

+ Recent posts