타이탄의 도구들

[Kotlin] 람다표현식2 (Lambda expression) 본문

Dev Tools/Kotlin

[Kotlin] 람다표현식2 (Lambda expression)

Titan04 2022. 7. 29. 18:36
728x90

이 글을 보시기 전에 아래 링크의 글을 먼저 읽고 오시면 좋습니다.

또한 자바의 람다에 대한 설명은 아래 링크를 참고하시면 됩니다.


람다표현식이란 무엇인가?

익명함수를 지칭하는 용어이며,

함수(메서드)를 단순하게 표현하는 방법입니다.

람다 표현식을 왜 사용하는가?

여러 이유가 있지만,

보통 함수를 한 번만 사용할 때 사용합니다.

함수를 여러번 호출할 땐,

함수의 이름을 지정해 여러번 호출하면 되지만,

한 번만 사용되는 함수라면 굳이 이름이 필요하지 않을 것입니다.

또한, 익명함수는 고차함수에서 인자 혹은 리턴값으로 사용될 수도 있습니다.

그리고 불필요한 코드를 생략해 코드가 간결해지는 장점도 있습니다.

람다 표현식을 어떻게 사용하는가?

코틀린에서 람다식의 전체 구문 형식은 다음과 같습니다.

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

- 람다 식은 항상 중괄호({})로 둘러싸여 있습니다.

- {매개변수 정의 -> 함수 구현코드(본문)} 형태입니다.

- 함수의 마지막 매개변수가 함수이면

해당 인수로 전달된 람다 표현식을

괄호(()) 외부에 배치할 수 있습니다. (후행람다라고 합니다.)

//val product = items.fold(1, { acc, e -> acc * e })
//위 코드를 아래와 같이 표현이 가능한 것이 후행람다식 표현입니다.
val product = items.fold(1) { acc, e -> acc * e }

- 리턴타입이 Unit(Void)이 아닐 경우

람다 본문(body) 내의 마지막 줄이 리턴값으로 처리됩니다.

ints.filter {
	val shouldFilter = it > 0
    	shouldFilter
}

// 마지막 줄이 리턴값이 되므로, 위 아래는 같은 코드가 됩니다.
ints.filter {
	val shouldFilter = it > 0
    	return@filter shouldFilter
}

- 람다 식에 매개변수가 하나일 때 it으로 대체하여

(매개변수 정의 ->) 부분을 생략할 수 있습니다.

val numbers = listOf("one", "two", "three", "four")
//val longerThanThree = numbers.filter({ x:String -> x.length > 3 })
val longerThanThree = numbers.filter({ it.length > 3})
//후행 람다 적용시
val longerThanThree = numbers.filter{ it.length > 3}

- 또한 후행람다와 함께 LINQ 스타일의 코드를 허용 합니다.

(간단하게 말하자면 .으로 이어진 형식의 코드)

strings.filter { it.length == 5 }
       .sortedBy { it }
       .map { it.uppercase() }

안드로이드에서 많이 쓰이는 코드인

클릭 리스너 인터페이스 구현을 람다로 처리하는 것을 보여드리며,

포스트를 마치도록 하겠습니다.

해당 코드는 자바로 구현하면 아래와 같습니다.

public interface OnClickListener{
	void onClick(View v);
}

button.setOnClickListener(new OnClickListener(){
	@Override
	public void onClick(View v){
		doSomething();
	}
});

코틀린 코드로 익명 객체(클래스)를 구현하면 아래와 같이 표현됩니다.

button.setOnClickListener(object : OnClickListener{
	override fun onClick(view: View){
		doSomething()
	}
})

여기서 setOnClickListener이 받는 매개변수인 리스너를

람다 형식을 통해 매개변수와 본문을 작성해 줄 수 있습니다.

interface OnClickListener {
    //View를 매개변수로 받고 리턴 타입 Unit(Void)
    fun onClick (view: View) : Unit
}
//setOnClickListener는 OnClickListener 인터페이스를 매개변수로 받음
fun setOnClickListener(listener: (View) -> Unit)
//{매개변수 -> 본문} 즉 람다식 형태로 표현 가능
button.setOnClickListener({ view -> doSomething() })
 
또한 매개변수를 활용하지 않는다면 아래와 같이 표현할 수도 있습니다.
button.setOnClickListener({ doSomething() })

더 나아가 함수의 마지막 매개변수가 함수이면 해당 인수로 전달된 람다 표현식을 괄호 외부에 배치할 수 있습니다. (후행람다)

즉 후행 람다로 인해 아래와 같이 표현 가능하고,

button.setOnClickListener() { doSomething() }

람다가 유일한 인자일 경우 괄호를 아예 생략해버릴 수도 있습니다.

button.setOnClickListener { doSomething() }

람다표현식을 간단하게 정리해보았습니다.

추가로 더 알아보고 싶으신 분들을 위해 링크를 첨부드리도록 하겠습니다 ^^

 

728x90
Comments