본문 바로가기

[Kotlin]SAM(Single Abstract Method) 변환

by 머니해커_개발자 2020. 3. 30.

추상 메서드 하나를 인수로 사용할 때만 대신 함수 인수 전달

testBtn.setOnClickListener {
	view -> testBtn.setBackgroundColor(Color.BLACK)
}

testBtn.setOnClickListener {
	_ -> testBtn.setBackgroundColor(Color.RED) //인수를 참조하지 않을 경우 _ 또는 생략
  
testBtn.setOnClickListener {
	testBtn.setBackgroundColor(Color.RED)
}  

testBtn.setOnClickListener {
	it.visiblity = View.INVISIBLE //람다식의 인수가 하나인 경우는 it(view)로 접근
}      

Kotlin에서 SAM 변환 사용

testBtn.setOnTouchListener { //타입을 지정해주지 않아도 타입을 알 수 있음
    v, event ->
    testBtn.setBackgroundColor(Color.RED)
    false
}    

 

Function Type

함수 타입의 변수 선언

함수 타입 변수에서는 리턴을 쓰지 않고, 마지막 줄이 반환된다.

형식

val functionType1 : () -> Unit
val functionType2 : (Int) -> Unit
val functionType3 : (Int, String) -> String

functionType1 = {println("widae")}
functionType2 = {age -> println("나이는 $age") }
functionType3 = {age, name ->
    println("나이:$age, 이름:$name")
    "나이:$age, 이름:$name"
}

functionType1()
functionType2(20)
println(functionType3(20, "widae"))

 

High-Order Function

함수의 인수로 함수나 람다식을 받거나 반환할 수 있는 함수

//인수
fun highOrderFunction1(func:() -> Unit) {
	func()
}

//반환
fun highOrderFunction2():()->Unit{
	return { println("유투브 흙수저 개발자 이야기")}
}

//인수 및 반환
func highOrderFunction3(func:() -> Unit):() -> Unit{
	return func
}

highOrderFunction1({println("hello")})
highOrderFunction2()()
highOrderFunction{ println("world")}

 

확장 함수(Extension Function)

클래스 밖에서 정의된 클래스의 멤버 함수

기존 방식은 상속을 통해 새로운 클래스를 만들고, 함수 추가

fun String.removeFirstLastChar():String =  // String = Receiver type
this.substring(1, this.length - 1 )

"HelloWorld".removeFirstLastChar()

 

코드 실습

func calculate(x:Int, y:Int, func1:(Int, Int)->Int):Int {
	return func1(x, y)
}

fun String.removeFirstLastChar():String = this.substring(1, this.length-1)

func main(){
	calculate(10,20, {x,y->x+y})//람다 함수로 전달. 람다함수가 하나밖에 없으면 아래처럼 쓸 수 있음
    calculate(10,20){x, y -> x+y}
    println(calculate(10,20){x,y->x+y})
    println(calculate(10,20){x,y->if(x>y)x else y} //x가 y보다 크면 x를 반환하고, 그렇지 않으면 y 반환

	println("HelloWorld".removeFirstLastChar()) // 첫, 끝 문자를 제외한 문자열을 반환함. "elloWorl"
}

'Kotlin > 강의' 카테고리의 다른 글

[Kotlin]람다 함수(Lambda)  (0) 2020.03.30
[Kotlin]꼬리 재귀 함수(Tail Recursive Function)  (0) 2020.03.30

댓글

최신글 전체

이미지
제목
글쓴이
등록일