앱 개발/Kotlin

[Kotlin] 매개변수로 람다함수를 이용할 때 소괄호 ( ) 생략

cha430 2026. 1. 15. 13:39

 

아주 간단한 문법이지만

나중에 헷갈릴 수 있으므로 정리해본다.

 

 

자바는 '함수'자체를 변수로 쓸 수 없기 때문에

함수의 결괏값을 이용한다.

 

하지만 코틀린은 매개변수(파라미터) 로 함수를 보낼 수 있다.

 

 

 

 

// 자바

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)