아주 간단한 문법이지만
나중에 헷갈릴 수 있으므로 정리해본다.
자바는 '함수'자체를 변수로 쓸 수 없기 때문에
함수의 결괏값을 이용한다.
하지만 코틀린은 매개변수(파라미터) 로 함수를 보낼 수 있다.
// 자바
public class UserTest {
private void test() {
System.out.println("자바");
}
private void user() {
test();
}
}
// 코틀린
val test: () -> String = {
"코틀린"
}
fun test2(): String {
return "코틀린2"
}
fun printMsg(
study: String,
result: () -> String) {
println("$study ${result()}")
}
fun main() {
var study = "공부"
printMsg(study, test)
printMsg(study, test2)
}
test는 람다함수
test2 는 일반함수
printMsg는 study와 result 함수, 총 두 개의 매개변수를 받는 일반 함수
main 함수에서 printMsg함수를 호출할 때
매개변수로 함수를 넘기기 때문에 ()없이 test, test2 만 작성해준다.
또는,
매개변수로 함수가 아닌 변수만 받는 경우
이렇게 test(), test2() 처럼 결괏값을 호출한다.
val test: () -> String = {
"코틀린"
}
fun test2(): String {
return "코틀린2"
}
fun printMsg(study: String, result: String) {
println("$study $result")
}
fun main() {
var study = "공부"
printMsg(study, test())
printMsg(study, test2())
}
** 그리고 여기서 중요한 점
함수 호출할 때 ( ) 자체도 생략할 수 있다.
다만 변수 중 함수가 여러개인 경우, 마지막 함수만 생략 가능하다.
= trailing lambda (1개만 가능)
// 매개변수 중 한 개가 함수일 때
fun printMsg(study: String, result: () -> Unit) {
result()
}
// 일반 호출
printMsg(study, { println("kotlin") })
// 소괄호 생략
printMsg(study) {
println("kotlin")
}
// 매개변수 중 두 개가 함수일 때
fun printMsg2(
study: String,
result1: () -> Unit,
result2: () -> Unit
){
result1()
result2()
}
fun main() {
val study = "공부"
printMsg2(
study,
{ println("kotlin2") }
) {
println("kotlin1")
}
}
괄호 줄바꿈해서 좀 헷갈릴 수 있는데
아직 눈에 안익어서..
정리하면 아래와 같다. (소괄호 생략하지 않은 버전)
fun main() {
val study = "공부"
printMsg2(study, {println("kotlin")}, {println("kotlin1")})
}
println 을 { } 로 감싸는 이유는
매개변수로 함수를 썼기 때문이다.
그냥 println("kotlin") 을 변수로 쓰면 지금 당장 실행하게 된다.
실행할 수 있는 코드를 함수로 감싸서 보낸다고 생각하면 된다.
** 그리고 main에서 pirntln 을 함수형태인 매개변수로 보내는 게 아니라
람다함수에서 println 을 하는 경우
fun printMsg(
study: String,
result1: () -> String,
result2: () -> String
) {
println("$study ${result1()}")
println("$study ${result2()}")
}
fun main() {
val study = "공부"
printMsg(
study,
{ "kotlin1" }
) {
"kotlin2"
}
}
그리고 계속 헷갈려서
여기에도 정리해둔다ㅠㅠ
함수 선언과 호출에 대한 ..흐름..
val cha: (String) -> Boolean = { n ->
n == "hello"
}
fun test(name: String, result: (String) -> Boolean): String {
val res = result(name)
return if (res) "성공" else "실패"
}
fun main() {
val name = "hello"
println(test(name, cha))
}
같은 코드를 .. 람다 버전, 일반 버전으로 ..
//람다함수
val test: (Int, (Int) -> Boolean) -> String = { age, checker ->
if (checker(age)) "성공" else "실패"
}
var someFun: (Int) -> Boolean = { age ->
age >= 20
}
//호출
test(25, someFun)
// 일반함수
fun Test(age: Int , checker: (Int) -> Boolean ): String {
return if(checker(age)) "성공" else "실패"
}
// 호출
test(25, someFun)

'앱 개발 > Kotlin' 카테고리의 다른 글
| [Kotlin] 코틀린 기본 5 (class, 다형성(상속), 생성자) (0) | 2026.02.26 |
|---|---|
| [Kotlin] 코틀린 기본 4 (Nullable, NonNull, 엘비스연산자, !! , let 함수, it) (0) | 2026.02.26 |
| [Kotlin] 코틀린 기본 3 (반복문 for & while, withIndex) (0) | 2026.02.26 |
| [Kotlin] 코틀린 기본 2 (Array & List , ArrayList) (0) | 2026.02.26 |
| [Kotlin] 코틀린 기본 1 (자료형, string template, 조건식if/when) (0) | 2026.02.25 |