[Kotlin] 고차함수, 람다함수, 스코프함수

zirryo·2023년 4월 20일
0

⚡️ STUDY

목록 보기
12/15
post-thumbnail




💬 1. 고차함수 High Order Function



1-1 고차함수란?

함수를 클래스에서 만들어 낸 인스턴스 처럼 취급하는 방법.

  • 함수를 parameter(파라미터)로 넘겨줄 수도 있고, 결과값으로 반환 받을 수도 있음.
  • 코틀린에서는 모든 함수를 고차함수로 사용 가능함.



1-2 고차함수의 사용법

fun a (str : String) {
	println("$str 함수 a")
}
fun b (func : (String) -> Unit) {
	func("b가 호출한")
}

  • fun a : String 을 파라미터로 받는 함수
  • fun b : 고차함수 형식을 파라미터로 받는 함수
    • (파라미터) -> (반환형) 형식으로 함수의 형태를 자료형으로 나타낼 수 있음.
    • 기술한 형태와 같은 형식의 함수는 파라미터로 받을 수 있음.
    • Unit : 아무 것도 반환하지 않는 반환 타입



1-3 고차함수의 동작 방식

fun main() {
	b(::a)
}

// 출력 
b가 호출한 함수 a

  • :: : 일반 함수를 고차함수로 변경하는 연산자




💬 2. 람다함수 Lambda Function



2-1 람다함수란?

함수를 람다식으로 표현하는 방법

  • 람다함수는 일반함수와 다르게, 그 자체로 이미 고차함수이므로 별도의 연산자 없이 변수에 담을 수 있음.
  • 함수를 일종의 변수로 사용할 수 있다는 편의성이 있음.
  • 컬렉션의 조작이나 스코프 함수의 사용에도 도움됨.



2-2 람다함수의 사용법

var c : (String) -> Unit = {s -> println("$s 람다함수") }
fun main() {
	b(c) // c는 이미 람다함수(=>고차함수) 이므로 변경 연산자가 필요 X
}

// 출력 
b가 호출한 람다함수

  • (String) -> Unit : 변수의 자료형 대신 함수의 형식을 표기함.
  • s : 파라미터로 받은(String) 값을 람다함수 내에서 사용할 변수 이름.
  • 변수명 뒤에 : 자료형 을 작성해야 함. 다만, 위와 같이 타입추론이 가능하다면 생략할 수 있음.



2-3 람다함수 더알아보기

val calculate : (Int, Int) -> Int = { x, y ->
	print("$x$y 를 더하면 -> ")
	x+y // 마지막 라인 반환
}
  • 람다 함수 내부에는 여러 라인을 작성할 수 있음.
  • 여러 줄일 경우 마지막 줄의 결과값이 반환됨

val d : () -> Unit = { println("파라미터가 없는 람다함수") }
  • 파라미터가 없는 람다함수는 중괄호 내부에 실행할 구문만 나열하면 됨.

val c : (String) -> Unit = { println("$it 람다함수") }
val e : (Int) -> Unit = { println(it) }
  • 파라미터가 하나라면 it을 사용할 수 있음.

val f = {s :String -> println("$s 축약된 람다함수 d")}
  • 중괄호 내부에 자료형을 표기하여 람다함수를 축약할 수 있음.




💬 3. 스코프함수 Lambda Function



3-1 스코프함수란?

함수형 언어의 특징을 좀 더 편리하게 사용할 수 있도록 기본 제공하는 함수

  • 클래스에서 생성한 인스턴스를 스코프 함수에 전달하여 인스턴스의 속성이나 함수를 좀 더 깔끔하게 활용할 수 있음.
  • apply, run, with, also, let.



3-2 apply

  • 인스턴스 생성 후 변수에 담기 전, 초기화 과정에서 사용됨.
  • 인스턴스 수정 및 조작 후 자신을 반환함.
  • scope 안에서 직접 인스턴스의 속성과 함수를 참조 연산자 없이 사용 가능함.
    class Book(var name: String, var price: Int) {
        fun discount() {
            price -= 2000
        }
    }
    fun main() {
    	// a: Book
    	var a = Book("코딩테스트 연습101", 24900).apply {
        	name = "[단독]$name"
        	discount()
    	}
    	println("${a.name}의 가격은 ${a.price}원 입니다.")
    }
    
    // 출력 
    [단독]코딩테스트 연습101의 가격은 22900원 입니다.



3-3 also

  • apply와 같은 기능을 하나, 인스턴스를 it을 통해 호출함.
  • 인스턴스 수정 및 조작 후 자신을 반환함.
    fun main() {
    	// a: Book
    	var a = Book("코딩테스트 연습101", 24900).apply {
        	name = "[단독]$name"
        	discount()
    	}
        println("${a.name}의 가격은 ${a.price}원 입니다.")
    
    	// e: Book
        var e = a.also {
        	it.name = "[특가]${it.name}"
        	it.discount()
        	it.discount()
    	}
        println("${e.name}의 가격은 ${e.price}원 입니다.")
    }
    
    // 출력
    [단독]코딩테스트 연습101의 가격은 22900원 입니다.
    [특가][단독]코딩테스트 연습101의 가격은 18900원 입니다.



3-4 run

  • 인스턴스 생성 후 인스턴스의 함수나 속성을 사용할 때 유용함.
  • 람다함수 처럼 마지막 라인을 반환함.
  • scope 안에서 직접 인스턴스의 속성과 함수를 참조 연산자 없이 사용 가능함.
    fun main() {
    	// a: Book
    	var a = Book("코딩테스트 연습101", 24900).apply {
        	name = "[단독]$name"
        	discount()
    	}
    
        // b: Unit
    	var b = a.run {
        	name = "$name (품절)"
        	println("b : $name, $price") // 반환값
    	}
    
    	println("a : ${a.name} 의 가격은 ${a.price}원 입니다.")
    
    	// c: Int
    	var c = Book("코딩 중급", 19000).run {
        	discount()
        	price // 반환값
    	}
        println("c : $c")
    }
    
    // 출력 
    b : [단독]코딩테스트 연습101 (품절), 22900
    a : [단독]코딩테스트 연습101 (품절) 의 가격은 22900원 입니다.
    c : 17000



3-5 let

  • run와 같은 기능을 하나, 인스턴스를 it을 통해 호출함.
  • 람다함수 처럼 마지막 라인을 반환함.
    fun main() {
    	// a: Book
    	var a = Book("코딩테스트 연습101", 24900).apply {
        	name = "[단독]$name"
    	}
    
    	// f: Int
        var f = a.let {
            it.discount()
            it.price-6000 // 반환값
        }
    
        println("a : ${a.name}, ${a.price}")
        println("f : $f")
    }
    
    // 출력
    a : [단독]코딩테스트 연습101, 22900
    f : 16900



3-6 with

  • run 과 동일한 기능을 가지지만, 인스턴스를 참조연산자 대신 파라미터로 받음.
  • 람다함수 처럼 마지막 라인을 반환함.
    fun main() {
    	// a: Book
    	var a = Book("코딩테스트 연습101", 24900)
    
    	// d: String
    	var d = with(a) {
            name = "[신작] $name"
            discount()
        	name // 반환값
    	}
    	println("a : ${a.name}, ${a.price}")
        println("d : $d")
    }
    
    // 출력
    a : [신작] 코딩테스트 연습101, 22900
    d : [신작] 코딩테스트 연습101



3-7 스코프 함수 정리




🔗 reference1
🔗 reference2

0개의 댓글