함수를 클래스에서 만들어 낸
인스턴스
처럼 취급하는 방법.
fun a (str : String) { println("$str 함수 a") } fun b (func : (String) -> Unit) { func("b가 호출한") }
fun a
: String 을 파라미터로 받는 함수fun b
: 고차함수 형식을 파라미터로 받는 함수(파라미터) -> (반환형)
형식으로 함수의 형태를 자료형으로 나타낼 수 있음.Unit
: 아무 것도 반환하지 않는 반환 타입fun main() { b(::a) } // 출력 b가 호출한 함수 a
::
: 일반 함수를 고차함수로 변경하는 연산자함수를 람다식으로 표현하는 방법
var c : (String) -> Unit = {s -> println("$s 람다함수") }
fun main() { b(c) // c는 이미 람다함수(=>고차함수) 이므로 변경 연산자가 필요 X } // 출력 b가 호출한 람다함수
(String) -> Unit
: 변수의 자료형 대신 함수의 형식을 표기함.s
: 파라미터로 받은(String) 값을 람다함수 내에서 사용할 변수 이름.: 자료형
을 작성해야 함. 다만, 위와 같이 타입추론이 가능하다면 생략할 수 있음.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")}
함수형 언어의 특징을 좀 더 편리하게 사용할 수 있도록 기본 제공하는 함수
apply
, run
, with
, also
, let
. 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원 입니다.
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원 입니다.
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
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
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
🔗 reference1
🔗 reference2