Kotlin 람다

김명진·2021년 3월 7일
0

안드로이드

목록 보기
14/25

코틀린은 자바와 같이 람다식을 지원한다. 람다식은 하나의 함수를 표헌하는 방법으로 익명 클래스나 익명 함수를 간결하게 표현할 수 있어 매우 편리하다.

그렇기 때문에 람다식은 간결하게 해주는 장점이 있지만 반대로 가독성이 떨어져 디버깅이 어렵고 담발할 경우 오히려 코드를 이해하는데 어려움을 주는 단점도 있다.

예시

fun add(a : Int, b : Int): Int {
	return a + b
    }

위와 같이 2 인수를 받아 2 인수의 합을 return 하는 함수 add()를 만들어보았다.

이 코드는 람다식으로 아래와 같이 변환이 가능하다.

fun add(a : Int, b : Int) = a + b

또는 다음과 같이도 표현이 가능하다.

var add = {a : Int, b : Int -> a + b}
println(add(1,3)) //결과: 4

람다식은 항상 중괄호로 둘러 싸여 있다. 내용으로는 인수 목록을 나열하고 -> 이후에 본문이 위치한다.

📌 SAM 람다식 변환

추상 메서드 하나를 인수로 사용할 때는 함수를 인수로 전달하면 편하다. SAM은 Single Abstract Method 변환을 통해 더 간결하게 표현이 가능하다.

안드로이드에서는 onClick()이라는 추상 메서드 하나를 가지고 있는 View.OnClickListener 인터페이스가 존재한다.

button.setOnClickListener(object : View.OnClickListener {
	override fun onClick(view : View?) {
    	//클릭시 처리 부분
        }
 }

위에 코드는 안드로이드에서 버튼 클릭 이벤트 리스너를 구현하는 일반적인 코드이다. View.OnClickListener 인터페이스에는 onClick() 추가 메서드가 하나만 있기 때문에 onClick() 메서드를 오버라이드한 것이다.

이제 SAM 변환을 사용해 람다식으로 표현해보자

button.setOnClickListener({ view : View? ->
	// 클릭시 처리 부분
    })

해당 인터페이스는 구현할 메서드가 하나밖에 없기 때문에 람다식으로 변경이 가능한것이다. 람다식으로 코드가 많이 줄은것을 볼 수 있지만 아직 괄호들이 많이 중첩이 되어있는 것을 확인할 수 있다.

button.setOnClickListener { view ->
	// 클릭시 처리 부분
    }

위와 같이 간략하게 표현이 가능하다. 만약 view 인수를 사용하지 않는다면 기호로 대치할 수 있다. 인수가 많은 경우에 꼭 사용하는 인수 이외에는 기호로 변경하여 애초에 잘못 사용하는 것을 방지할 수도 있다.

button.setOnClickListener { _ ->
	// 클릭시 처리 부분
    }

여기서 중요한 부분은 SAM 변환은 자바에서 작성한 인터페이스일 때문 동작한다는 것이다. 코틀린에서는 인터페이스 대신에 함수를 사용하는 것이 좋다.

본 글은 [오준석의 안드로이드 생존코딩] 의 내용을 발췌한 것입니다.

profile
꿈꾸는 개발자

0개의 댓글