
Kotlin은 함수를 데이터 유형으로 간주할 수 있고 함수를 변수에 저장하고 저장한 함수를 다른 함수에 인수로 전달하며 다른 함수에서 함수를 반환할 수 있다.
변수에 함수 저장
함수를 값으로 참조하려면 함수 참조 연산자 :: 를 사용해야 한다.
ex)
fun main() {
val name = ::method
name() //함수가 저장된 변수는 함수처럼 ()를 붙여줘야 함
method()
}
fun method() {
println("메서드")
}
출력 : "메서드"
"메서드"
fun main() {
val name = ::method
val c = name()
println(c)
val d = method()
println(d)
}
fun sum(a: Int, b: Int): Int {
return a+b
}
출력 : 3
7
람다 표현식을 통한 함수 정의
val, var로 변수를 만들고 중괄호를 활용하여 함수 정의를 할 수 있다.
fun main() {
val name = {
println("메서드")
}
name()
}
fun main() {
val name1 = name2
name1()
}
val name2 = {
println("메서드")
}
매개변수가 있는 함수의 람다 표현식을 통한 정의는 다음의 함수의 데이터 타입을 먼저 알아야 한다.
함수 변수의 데이터 타입
함수가 변수에 저장될 수 있으므로 함수에도 데이터 타입이 있다.
(매개변수) -> return타입
매개변수가 없다면 괄호를 비워두고, 반환값이 없다면 Unit을 쓰면 된다.
ex)
fun sum(a: Int, b: Int): Int {
return a+b
}
sum 함수의 타입 : (Int, Int) -> Int
fun printD() {
println("D")
}
sum 함수의 타입 : () -> Unit
null 허용의 함수 데이터 타입
데이터 형에 물음표를 붙여주면 된다.((매개변수) -> return타입)?
람다 표현식을 통한 매개변수가 있는 함수 정의
만약 두개의 정수형 매개변수를 필요로 하고 정수형을 반환하는 함수의 타입은 다음과 같다.
(Int, Int) -> Int
val 함수이름: 함수타입 = { 매개변수1, 매개변수2, ... ->
함수내용
}
ex)
fun main() {
val sumFunction: (Int, Int) -> Int = { a, b ->
a+b
}
print(sumFunction(1, 2))
출력 : 3
매개변수 이름 생략
매개변수가 하나 있다면 $it을 사용하여 매개변수 부분을 지울 수 있다.
fun main() {
val 함수이름: (Int) -> String = {
"$it"
}
println(함수이름(7))
}
출력 : 7
람다 표현식 함수에 직접 전달
fun main() {
val sumFunction: (Int, Int) -> Int = { a, b ->
a+b
}
val calFunction = ::calculator
calFunction(true, sumFunction)
calFunction(false, sumFunction)
}
fun calculator(isOn: Boolean, sum: (Int, Int) -> Int) {
if (isOn) {
println(sum(1, 2))
} else {
println("계산기가 꺼져있습니다.")
}
}
sumFunction이라는 변수를 선언하지 말고 직접 calFunction이라는 함수에 함수를 직접 전달 할 수 있다.
fun main() {
val calFunction = ::calculator
calFunction(true, { a, b -> a+b })
calFunction(false, { a, b -> a+b })
}
fun calculator(isOn: Boolean, sum: (Int, Int) -> Int) {
if (isOn) {
println(sum(1, 2))
} else {
println("계산기가 꺼져있습니다.")
}
}
매개변수와 람다가 헷갈릴 수 있으므로 보통은 후행 람다 문법을 사용한다. 후행 람다 문법이란 람다를 닫는 괄호 다음에 람다 표현식을 배치하는 법이다. 기능의 차이는 없다.
fun main() {
val calFunction = ::calculator
calFunction(true) { a, b -> a+b }
calFunction(false) { a, b -> a+b }
}
fun calculator(isOn: Boolean, sum: (Int, Int) -> Int) {
if (isOn) {
println(sum(1, 2))
} else {
println("계산기가 꺼져있습니다.")
}
}
함수를 매개변수로 이용하는 함수
fun main() {
val calPrintFunction: (Any) -> Unit = { calSymbol ->
println("${calSymbol}에 대한 함수를 생성합니다.")
}
val calFunction1 = calculator("sum", calPrintFunction) //함수 전달
println(calFunction1(1,3))
}
fun calculator(calType: String, calPrint: (Any) -> Unit): (Int, Int) -> Int {//함수 매개변수, 반환
val symbol = when (calType) {
"sum" -> "+"
"mul" -> "*"
"sub" -> "-"
else -> println("잘못 입력")
} //calType에서 계산 종류에 따라 기호 반환
calPrint(symbol) //함수실행
val calFunction: (Int, Int) -> Int = when (calType) {
"sum" -> { a, b -> a+b}
"mul" -> { a, b -> a*b}
"sub" -> { a, b -> a-b}
else -> {a, b -> 0}
} //calType종류에 따라 함수 생성
return calFunction //함수 반환
}
참고자료
'언어 > Kotlin' 카테고리의 다른 글
| [Kotlin] 확장 속성, 함수 추가 (0) | 2023.04.07 |
|---|---|
| [Kotlin] 제네릭, enum 클래스, 데이터 클래스 (0) | 2023.03.31 |
| [Kotlin] 속성 위임 정의 (0) | 2023.03.17 |
| [Kotlin] 공개 상태 (0) | 2023.03.10 |
| [Kotlin] 클래스 관계 (0) | 2023.03.03 |